1、初始化:两种方式
第一种方式,数组中只有五个元素,但是第二种方式,赋予的是字符串常量,而字符串常量在C语言中约定用'\0'作为字符串的结束标志,它占内存空间。这里的"china"的有效长度为 5 ,但实际上还有第 6 个字符'\0'。也就是说,当遇到'\0'时,表示字符串结束,由它前面的字符组成字符串。在程序中,常用'\0'来判断字符串是否结束,因此所定义的字符数组长度应该大于字符串的实际长度,这样才足以存放相应的字符串,这就是前面为什么写 6 而不是 5 的原因
注意,第二种方式,也就是将字符串常量直接赋值给字符数组仅限于初始化中,在程序中的其他位置不允许这样!
2、字符数组的输入输出
C语言有一批字符串处理函数,其中gets() 和 puts() 函数包含在头文件 <stdio.h>中,其余的包含在<string.h>中。
注意:gets( )识别换行符\n作为输入结束,因此在使用gets( )前,一定要注意是不是有换行符会影响,如果有的话,应该先用getchar( )接收掉换行符,然后再用gets()
如下:getchar( );
gets(str);
此外,如果不是使用scanf()函数的%s格式或者gets()函数输入的字符串(因为这两种格式会自动在末尾加上’\0’, 而字符串常量在C语言中约定用'\0'作为字符串的结束标志),如果没有’\0’,printf的%s格式和puts()函数会因为无法识别字符串末尾而输出一大堆乱码。
尤其是当使用getchar()来接收时,记得要在字符串末尾加上’\0’。(所以用getchar()或者%c来输入字符串时,如果输出的时候要用puts或者%s,那么一定要记得字符串录入的结尾要加上’\0’)
例如:
结果
%c也是一样,
所以输入:gets() %s 输出:puts() %s 没问题。因为输入时,那两个会自动在末尾加’\0’
输出是%c或者putchar(), 输入是什么样都没关系,因为和字符串无关了,只是在输出字符
但是如果输入是字符,%c或者getchar(),而输出想要是字符串puts() %s,那么一定要在输入之后成为每个字符串前,加上’\0’
2、字符数组的相关函数
要用字符数组的函数时,需要加上头文件#include<string.h>
而C++的STL中的string的头文件是#include<string> using namespace std;
输出的时候还是需要用int型数据来接收的,int len=strlen(str);
然后才能输出,返回的是int类型的字符串中有意义的字符个数。
结果也就是真正的有意义的字符个数:6
直接接上,所以是 I am student 本身因为str1中am后面有一个空格,所以接上是这样的,如果是没有空格,那么也还是直接接上的,反正直接接在后面,什么多余的也不要做就对了
因为接好了之后赋给str1
输入直到文件末尾:
但是,注意,当在黑框中输入数据时,并不会触发EOF状态,所以需要手动触发,按crtl+z组合键,这时就会显示一个^Z,再按回车就可以结束while了
codeblock中while(scanf("%d",&n)!=EOF)如何在控制台终止循环输入:
执行后,控制台输入数字后,先换行,后ctrl+z,再换行可以退出,ps:该方法适用于codeblock,如果是其他编辑器,可以尝试ctrl+c/d,但在codeblock试了要么闪退,要么无效(经过验证,确实必须这样!)