初始化字符数组的最简单方法是将字符分配给数组中的每个元素。
char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};
即为str[0]到str[9]的10个元素分配10个字符
如果大括号中提供的字符数大于数组的长度,则会被视为语法错误; 如果小于数组长度,则仅设置字符数组中的第一个元素,其余元素将自动设置为空字符(即 '\0' )。
2. 字符数组和字符串
在C语言中,字符串被视为字符数组。 (c++ 中没有)
在实际应用中,人们关心的是有效字符串的长度而不是字符数组的长度。 例如,定义一个字符数组的长度为100,但实际有效字符只有40个,为了确定字符串的实际长度,C语言规定了一个“字符串结束标志”,用字符'来表示\0'。 如果有一个字符串,第10个字符是'\0',则该字符串的有效字符为9个。也就是说,当遇到第一个字符'\0'时,表示字符串结束,而形成之前的字符串。
系统还会自动在字符串常量中添加“\0”作为终止符。 例如“C”总共有9个字符,但在内存中占用了10个字节,最后一个字节'\0'是系统自动添加的。 (可以通过()函数验证)有了结束标志'\0',字符数组的长度就不再那么重要了。 在程序中,常常通过检测'\0'的位置来判断字符串是否结束,而不是根据数组的长度来判断字符串长度。
当然,在定义字符数组时,应该预估实际的字符串长度,以保证数组长度始终大于实际的字符串长度。 (在实际的字符串定义中,往往不指定数组的长度,如char str[])说明:'\n'代表ASCII码为0的字符,从ASCII码表可以发现: ASCII 码为 0 的字符不是可以显示的字符,而是“空运算符”,即不执行任何操作。 用它作为字符串的结尾,不会产生额外的操作,也不会增加有效字符,只是一个识别的标志。
上面了解了C语言处理字符串的方法之后,在字符数组初始化的方法中再增加一个方法——那就是可以使用字符串常量来初始化字符数组:
char str[ ]={"我很高兴"}; 大括号可以省略,如下图
char str[ ]="我很高兴";
注意:上面对字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值。 字符数组的赋值只能为其元素一一赋值。 下面的赋值方法是错误的。
字符str[];
str="我很高兴";
不要使用单个字符作为初始值,而是使用字符串(注意:字符串两端用双引号“”括起来,而不是单引号'')作为初始值。 显然,这种方法更加直观、方便。 (注意:数组str的长度不是10,而是11。请记住这一点,因为系统会自动在字符串常量“I am happy”的末尾添加一个'\0')
因此,上面的初始化等价于下面的初始化 char str[ ]={'I',' ','a','m',' ','h','a','p','p' ,'y','\0'}; 不等于以下
char str[ ]={'I','','a','m','','h','a','p','p','y'};
前者的长度为11,后者的长度为10。
说明:字符数组不要求最后一个字符是'\0',甚至可以不包含'\0',见下文
这样写是完全合法的。
char str[5]={'C','h','i','n','a'};
++++++++
可以看到,两种不同的方法初始化字符数组后得到的数组长度是不同的。
#
无效主(无效)
{
char c1[]={'I','','a','m','','h','a','p','p','y'};
char c2[]="我很高兴";
int i1=(c1);
int i2=(c2);
("%d\n",i1);
("%d\n",i2);
}
结果:10 11
3.字符串的表示
在C语言中,字符串可以用两种方式表示和存储:
(1)使用字符数组存储字符串
char str[ ]="我爱中国";
(2) 使用字符指针指向字符串
char* str="我爱中国";
对于第二种表达方式,有人认为str是字符串变量,认为字符串常量“我爱中国”在定义时就直接赋值给字符串变量,这是错误的。
C 语言将字符串常量视为字符数组。 在内存中创建一个字符数组来存储字符串常量。 当程序定义字符串指针变量str(数组的首地址)时,赋值给str。
两种表示的字符串输出都使用("%s\n", str);
%s表示输出一个字符串,给定字符指针变量名str(对于第一种表示方法,字符数组名就是字符数组的首地址,与第二种方法中的指针含义一致),则系统首先输出它所指向的一个字符数据,然后自动增加str,使其指向下一个字符……,以此类推,直到遇到字符串结束标识符“\0”。
4.使用字符指针变量和字符数组表示字符串的讨论
虽然字符数组和字符指针变量都可以用来存储和操作字符串,但是两者的区别
存在差异,不应混淆。
4.1. 字符数组由若干个元素组成,每个元素包含一个字符; 而字符指针变量存储的是地址(字符串/字符数组的首地址),绝对不要把字符串放入字符指针变量中(是字符串起始地址)
4.2. 分配方法:
只能给字符数组的每个元素赋值,不能使用以下方法给字符数组赋值
字符str[14];
str="我爱中国"; (但是字符数组初始化的时候是可以的,即char str[14]="I love China";)
对于字符指针变量,可以使用以下方法来赋值:
字符*一个;
a=“我爱中国”;
或者 char* a="我爱中国"; 两个都很好
4.3. 给字符指针变量赋一个初始值(初始化):
char* a="我爱中国";
相当于:
字符*一个;
a=“我爱中国”;
以及用于字符数组的初始化
char str[14]="我爱中国";
不能等同于:
字符str[14];
str="我爱中国"; (这不是初始化,而是赋值,并且这个赋值给数组
值错误)
4.4. 如果定义了字符数组,那么它就有明确的内存地址; 而字符指针变量定义时并不指向确定的字符数据,可以多次赋值。
5.字符串处理函数
5.1
char *(char *str1, const char *2 );
char *(char *, const char * );
功能:该函数将字符串str2连接到str1的末尾,并返回指针str1
注意:连接的前两个字符串后面有一个'\0',连接时去掉字符串1后面的'\0',只保留新字符串末尾的'\0'
5.2
char *(char *str1, const char *2 );
char *(char *, const char * );
功能:将字符串中的字符复制到字符串中,包括空终止符。 返回值是一个指针。
笔记:
1、“字符数组1”必须写成数组名的形式,“字符串2”可以是字符数组名,也可以是字符串常量
2、复制时与字符串后面的'\0'一起复制到数组1
3、不能直接用赋值语句将字符串常量或字符数组赋值给字符数组(和普通变量数组一样),只能用函数来处理。
4. 可以使用该函数将字符串2中的前几个字符复制到字符数组1中。