C语言关于字符串和字符数组的易混淆点
字符串和字符数组的区别
形式上:
字符串比字符数组多一个'\0'结尾的字符,这个字符占据一个字节的内存,但是它不占据字符串的大小
字符串一定是一个char型的数组,但是char型的数组可以是字符串可以是字符数组
初始化的方法上:
字符数组的初始化,就是将逐个字符赋值给数组中的各个元素
char arr[3]={'a',' ','c'};
如果字符数组的长度为3,但是你只初始化了两个字符,例如
char arr[3]={'a',' '};
那么剩下的区域就被自动填充为空字符'\0'
值得注意的是,这种情况初始化以后就成了字符串了
也就是说,末尾有'\0'就是字符串
其他的初始化方法:
用字符串表面量(字符串常量)初始化
char a[4]="hel";
这种情况初始化出来的一定是字符串
值得注意的是,这里数组的长度为4,是专门给'\0'留下了一个空间,要知道它也是需要空间的,如果不留空间就可能出现越界的错误
总而言之,二者初始化的区别,一方面在于是否数组满初始化(除了'\0'),如果满那么就是字符数组,如果不满那么系统自动填充了'\0'就变成字符串了;另一方面在于初始化是不是用了字符串表面量,如果用了那么一定时字符串,如果是单个字符的初始化那么就是字符数组
关于字符串
输出
%s输出的是一个字符串
并且%s在输出是遇到'\0'会自动结束输出
char a[3]="he"; printf("%s",a);
这种情况输出的就是he两个字符,'\0'不输出
%c输出的是单个字符
并且可以将'\0'输出出来
char a[3]="he"; for(int i=0;i<3;i++) printf("%c",a[i]);
puts函数的输出方式与
printf("%s",a);
是一样的,但是有一点不同,就是puts会将刚刚读入的回车字符也输出
输入
gets函数在打回车以后停止
值得注意的是,在scanf读取单个字符以后,需要用getchar();将缓冲区的回车字符清除掉,否则会影响下一步对gets的读取使用
总结
字符串就是比字符数组多了一个'\0'的位置,这个位置要留出来;
在初始化的过程中,用字符串常量初始化出来的默认为字符串;
输入和输出的时候要注意缓冲区的字符用getchar清除掉。