-
2021-08-27 13:19:38
编程良好习惯:定义char型数组时赋初值为'\0'
原因:当数组定义不赋值时,不同编译器为这个数组定义的初值也不确定,即使在后面的程序中对这个数组的部分元素进行的赋值,当cout打印这个数组时可能会打印出乱码
例:char array[10] = {'\0'}
char型数组在定义时初始化:
1. char array[20] = "Hello World!";
当采用这种方式初始化时,要注意等号后面的字符串长度要小于(等于也不行)字符数组元素个数。
比如array[20]代表数组元素个数为20,"Hello World!"的长度为12. gcc编译器在编译时会依次把""中的字符串按单个字符对数组进行赋值,并以'\0'做为最后一个字符赋值给数组,剩余的数组元素赋为初始值'\0',所以这里array的大小最小为13。
2. char array[] = "Hello World!"
这种方式的初始化编译器会根据字符串自动判断array数组的大小,上面的例子中 array元素个数为13.
如果单纯定义char array[]; gcc编译并不会报错,用sizeof显示这个数组大小为0,所以这样定义数组没有任何意义。
双引号""只能用于字符数组的初始化中,在后面的单个元素赋值时只能用单引号''。
更多相关内容 -
C语言字符数组初始化
2013-03-31 18:27:58C语言字符数组初始化 -
java代码-例子4-7 用字符数组初始化String对象
2021-07-15 04:17:38java代码-例子4-7 用字符数组初始化String对象 -
C/C++ | C语言字符数组初始化,有些赋值方式千万注意
2022-03-01 17:55:40一、字符数组的定义和初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花...一、字符数组的定义和初始化
字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。
charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'};
即把10个字符分别赋给str[0]到str[9]10个元素
如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即'\0')。
如char str[10] = {'\0'}; //结果里面元素全都为\0.其实这样赋值只是把第1个元素赋值为\0,后面的都默认用\0填充,如果是char str[10]={'1'};
只有第一个为‘1’,后面都是\0。但千万不要以为写成char str[10];不赋值也可以。这样写里面的内容是乱的。
这是细节,值得注意。
所以我们最好每次想写char str[5]都写成
char str[5]='\0';
这样做最好。
int a[10]={4,5};
第一个赋值为4,第二个为5,后面的为0.如果直接int a[10]; 内容很乱。
规律:用某个值给数组赋值,没有被赋值的元素会自动调用默认的构造函数,如char默认为\0,int默认为0.等等.
二、字符数组与字符串
在 c语言中,将字符串作为字符数组来处理。(c++中不是)
在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度,例如,
定义一个字符数组长度为100,而实际有效字符只有40个,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符'\0’代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。也就是说,在遇到第一个字符'\0'时,表示字符串结束,由它前面的字符组成字符串。
系统对字符串常量也自动加一个'\0'作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节'\0'是系统自动加上的。(通过 sizeof()函数可验证)
有了结束标志'\0'后,字符数组的长度就显得不那么重要了,在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如 char str[ ])
说明:'\n’代表 ASCII 码为0的字符,从 ASCII码表中可以查到 ASCII 码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
对C 语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充一种方法——即可以用字符串常量来初始化字符数组:
注意sizeof与strlen的不同:
char a[40]={'0'};
printf("%d",sizeof(a));//开辟的数组的总大小40*1
printf("%d",strlen(a));
输出 40,1.
char str[ ]={"I am happy"}; 可以省略花括号,如下所示
char str[ ]="I am happy";
注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,如:
char d[5];
d="hell";
错误。vs2010提示表达式d必须是可修改的左值。
这跟
int a[5]={1,2,3};
而不能
int a[5];
a={1,2,3}
数组只能在初始化的时候一次性赋值,其他时候必须要一个一个赋值。
看来数组名和指针是有区别的。
下面的赋值方法是错误的
char str[ ];
str="I am happy";
不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘’括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str的长度不是10,而是11,这点请务必记住,因为字符串常量"I am happy"的最后由系统自动加上一个'\0')
因此,上面的初始化与下面的初始化等价
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};必须要人为加上一个\0,否则strlen不正确。
而不与下面的等价
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};//strlen错误,后面没有\0
前者的长度是11,后者的长度是10.
说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向下面这样写是完全合法的。
char str[5]={'C','h','i','n','a'};
可见,用两种不同方法初始化字符数组后得到的数组长度是不同的。
三、赋值方式
对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
char str[14];
str="I love China"; (但在字符数组初始化时可以,即 charstr[14]="I love China";)
而对字符指针变量,采用下面方法赋值:
char* a;
a="I love China";
或者是 char* a="I love China"; 都可以
对字符指针变量赋初值(初始化):
char* a="I love China";
等价于:
char* a
a="I love China";
而对于字符数组的初始化
char str[14]="I love China";
不能等价于:
char str[14];
str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)
-
字符数组初始化为空
2020-04-08 16:38:20字符数组初始化为空1. 总结起来有以下三种方式:2. 分析3. 结论 1. 总结起来有以下三种方式: (1) char str[10]=""; (2) char str[10]={’\0’}; (3) char str[10] = ‘\0’; 2. 分析 第(1)(2)种方式是将str数组的...1. 总结起来有以下5种方式:
#define STR_LEN 1023 (1) char str[STR_LEN + 1]=""; (2) char str[STR_LEN + 1]={'\0'}; (3) char str[STR_LEN + 1]; str[0] = '\0'; (4) char str[STR_LEN + 1]; str[0] = 0; (5) char str[STR_LEN + 1]; memset(str, 0 ,sizeof(str));
2. 分析
第(1)(2)(5)种方式是整体清0了整个缓冲区,效率较低;
如果数组的size非常大,那么这三种方式将会造成很大的开销。而第(3)和第(4)种方式是只将str数组的第一个元素初始化为0,效率高;
3. 结论
- 效率高,使用3、4初始化;
- 规范,建议使用5初始化(memset)
因为有过用3/4的方式初始化,导致后面字符未初始化,而是随机值,正好使用了这些值,打印出来也是乱码导致。
4. 扩展:
4.1 不使用 szName[0] = ‘0’,使用szName[0] = 0
szName[0] = '0' ; // Warning 4195 Possible confuse digit '0' or zero-terminate '\0' or letter 'O' //混淆数字0 和 字符串结尾字符 \0 ,建议直接使用 0 即可
4.2 空字符串判断
推荐用法:
if (0 != pcUserName[0]) // 推荐:安全 可靠
错误用法:
if (0 == strlen(pcUserName)) Warning 4170 Function 'strlen' is unnecessary or duplicate if('0' == pcUserName[0]) 同上 Possible confuse digit '0' or zero-terminate '\0' or letter 'O'
-
c++数组定义 初始化 输入和输出 字符数组定义初始化 输入和输出
2018-06-07 09:56:48很清楚展现了数组的定义, 初始化, 输入和输出 ,字符数组的应用,以及多维数组应用。 -
(C++)字符数组初始化的两种方法
2021-03-19 19:32:10//字符数组的两种赋值方法 int main(){ //1.方法一 char str1[14] = {'I',' ','l','o','v','e',' ','m','y',' ','m','o','m','.'}; for(int i = 0;i<=13;i++){ printf("%c",str1[i]); } printf("\n...#include<cstdio> //字符数组的两种赋值方法 int main(){ //1.方法一 char str1[14] = {'I',' ','l','o','v','e',' ','m','y',' ','m','o','m','.'}; for(int i = 0;i<=13;i++){ printf("%c",str1[i]); } printf("\n"); //2.方法二,直接赋值字符串(注意,只有初始化时可以这么做) char str2[15] = "I love my mom."; for(int j = 0;j<=13;j++){ printf("%c",str2[j]); } return 0; }
-
C语言 字符数组初始化以及memset函数
2020-09-07 19:27:53首先为什么要初始化数组:假如创建了一个没有初始化的数组,里面其实各个位置是含有值的,举例: ... 当然可能会有一些情况导致这种方法不能初始化,或者字符数组是动态创建的,没有一个可以进行{0}的. -
C语言中字符数组初始化的几种方法
2019-04-14 16:39:301.C语言中的字符数组初始化 在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。 1.1 直接逐个初始化字符数组:字符数组的初始化,最容易理解的方式就是逐个... -
java代码-JAVA中String数组初始化,一维数组和二维数组初始化
2021-07-15 04:39:34java代码-JAVA中String数组初始化,一维数组和二维数组初始化 -
C语言字符数组初始化.pdf
2021-11-23 06:09:51C语言字符数组初始化.pdf -
C++字符数组初始化为空
2019-03-02 11:14:59char str[1024] = {0}; 头文件为#include -
C/C++编程笔记:C语言字符数组初始化,有些赋值方式千万注意!
2020-06-12 22:57:39一、字符数组的定义和初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花... -
C 字符串数组初始化问题
2021-05-19 09:29:161、定义的时候直接用字符串赋值char a[10]="hello";注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!2、对数组中字符逐个赋值char a[10]={'h','e','l','l','o'};3、利用strcpychar a[10]; ... -
C++字符数组初始化和未初始化等系列问题分析
2020-04-08 20:46:101.字符数组未初始化里面元素值为多少 (1) 字符数组定义在main函数外面 -
C 语言字符数组的定义与初始化
2020-12-18 18:00:021、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号... -
C语言结构体数组内带字符数组初始化和赋值
2017-11-08 18:06:001.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char cmdPropt[24];}; BleAndTspRmtCmd为结构体名,可以通过这个结构体名定义其他结构体变量,... -
C语言:定长字符数组的输入和初始化问题——针对初始化常量字符串或初始化列表以及scanf输入字符串长度等于...
2022-04-16 15:51:073、注意:在字符数组长度确定的情况下,如果用于初始化的初始化列表或者字符串常量长度大于字符数组长度,则会出现语法错误。 最后再讨论用scanf()进行格式化输入字符串的各种情形 1、对于键盘输入字符串长度... -
字符数组及其定义和初始化,C语言字符数组详解
2020-12-06 01:56:06字符数组及其定义和初始化,C语言字符数组详解字符串的存储方式有字符数组和字符指针,我们先来看看字符数组。因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别对... -
【Java】字符串一维数组初始化
2021-11-30 22:52:39初始化一维字符串数组有三种方法: String[] strs = new String[5]; //创建一个长度为5的String(字符串)型的一维数组 String[] strs = new String[]{"","","","",""}; // strs = new String[] {“1”,“2”,“3”};... -
字符数组的初始化
2020-12-30 10:33:291.用字符串常量初始化,但是不指定长度由编译器计算。 如: char str4[]="Hello world!"; 对于这种赋值方式会自动添加’\0’ 2.直接给出字符数组中的各字符 如: char str1[5]={'a','b','c','d','e'}; 3.直接给...