1、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。系统对字符串常量也自动加一个\0作为结束符。例如CProgram”共有9个字符,但
1、字符数组的定义和初始化
初始化字符数组是最容易理解的方法,就是逐字符分配给数组中的每个元素。 char str[10]={ 'I '、'、'、'、' a '、'、' m '、'、'、' h '、' a '、' p '、' p '、'、' y'}; 也就是说,将10个字符分别分配给从str[0]到str[0]的10个要素
如果大括号中指定的字符数大于数组的长度,则会将其作为语法错误处理。 如果小于数组的长度,则只考虑这些字符数组中的上一个元素,其馀元素自动为空字符“\0”。
2、字符数组和字符串
在c语言中,字符串被视为字符数组。 在实际应用中(不是(c ) ),有效字符串的长度而不是字符数组的长度备受关注。 例如,将字符数组的长度定义为100,实际有效字符只有40个。 为了测量字符串的实际长度,在c语言中确定了用字符“\0”表示的“字符串结束标志”。 如果有字符串,其中第10个字符为“\0”,则此字符串的有效字符为9个。 这意味着遇到第一个字符“\0”时,字符串将结束,并且字符串由前一个字符组成。
字符串常量也会自动添加“\0”作为结束符。 例如," C Program "为9个字符,但内存中有10个字节,最后一个字节"\0 "将自动添加。 (sizeof ) (可通过函数验证) ) ) ) ) )。
有了结束标志“\0”,字符数组的长度并不重要,经常通过检测“\0”的位置来确定字符串是否结束,而不是由数组的长度决定字符串的长度。 当然,定义字符数组时,必须估计实际字符串的长度,以便数组的长度始终大于字符串的实际长度。 (在实际的字符串定义中,经常没有指定数组的长度,如char str[ ]。 (0表示ASCII代码为0的字符,ASCII代码为0的字符不是可显示的字符,而是“空运算符”,表示不执行任何操作。 将其用作字符串结束标志不会导致额外的操作或添加任何有效字符,而是只提供一个标识。
综上所述,了解如何用c语言处理字符串后,可以通过向初始化字符数组添加另一种方法——,用字符串常量初始化字符数组。
char str[ ]={'I am happy'}; 大括号可以省略如下
char str[ ]='I am happy '; 3358www.Sina.com/:以上字符数组的整体赋值仅适用于字符数组注意。 不能用于字符数组的3358www.Sina.com/只能为字符数组的每个元素分配一个赋值。 以下赋值方法是错误的
char str[ ]; str='I am happy '; //错误的是,字符数组的赋值只能按元素进行赋值。 使用字符串(请注意,字符串的两端用双引号“”而不是单引号“”括起来),而不是使用单个字符作为初始值。 显然,这种方法更直观、更方便。 (注意:数组str的长度是11而不是10。 请注意,“\0”会自动添加到字符串常量“I am happy”的末尾。)
因此,上面的初始化等效于下面的初始化
char str[ ]={'I ','、'、'、' a '、' m '、'、' h '、' a '、' 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'}; 如果用两种不同的方法初始化字符数组,则可以看到得到的数组的长度不同。
#includestdio.hvoidmain(void ) charC1 )=(I )、)、a )、m )、h )、a )、p )、y )。 char c2[]='I am happy '; intI1=sizeof(C1 ); intI2=sizeof(C2; printf(%d(n ),i1 ); printf(%d(n ),i2 ); 结果: 10 11
3、字符串的表示形式
在c语言中,可以用两种方式表示和存储字符串。
(1)用字符数组存储字符串
char str[ ]='I love China '; )2)用字符指针指向字符串
char* str='I love China '; 在第二种表示方式中,有人认为str是字符串变量。 在定义时将字符串常量' I love China '直接指派给该字符串变量是错误的。 C语言按字符数组处理字符串常数,打开了用于在存储器中存储字符串常数的字符数组。 程序在定义字符串指针变量str时,只需将字符串的起始地址,即存储字符串的字符数组的起始地址分配给str。
使用这两种表示形式的字符串输出
printf(%s(n ),str ); %s表示输出字符串,并提供字符指针变量名st
r(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str 自动加1,使之指向下一个字符,如此,直到遇到字符串结束标识符" \0 "。
4、对使用字符指针变量和字符数组两种方法表示字符串的讨论
虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈。
4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)
4.2、赋值方式:
对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
char str[14];str="I love China"; //错误,不是初始化,这是赋值,只能一一进行。
(但在字符数组初始化时可以,即char str[14]="I love China";)
而对字符指针变量,采用下面方法赋值:
char* a;a="I love China";//指针赋值,可以
或者是char* a="I love China"; 都可以
4.3、对字符指针变量赋初值(初始化):
char* a="I love China";
等价于:
char* a;
a="I love China";
而对于字符数组的初始化
char str[14]="I love China";
不能等价于:
char str[14];
str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)
4.4、如果定义了一个字符数组,那么它有确定的内存地址,不能进行多次赋值;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。
5、字符串处理函数
5.1 字符串连接
char *strcat(char *str1,const char *2 );char *strcat(char *strDestination,const char *strSource );
功能:函数将字符串str2 连接到str1的末端,并返回指针str1
注:连接前两个字符串的后面都有一个' \0 ',连接时将字符串1后面的' \0 ‘去掉,只在新串最后保留一个' \0 ‘
5.2 字符串复制
char *strcpy(char *str1,const char *2 );char *strcpy(char *strDestination,const char *strSource );
功能:复制字符串strSource 中的字符到字符串strDestination,包括空值结束符。返回值为指针strDestination。
注:
1、“字符数组1”必须写成数组名形式,“字符串2"可以是字符数组名,也可以是一个字符串常量
2、复制时连同字符串后面的' \0 ' 一起复制到数组1中
3、不能用赋值语句直接将一个字符串常量或者字符数组直接赋给一个字符数组(同普通变量数组是一样的),而只能用strcpy 函数处理。
4、可以用strcpy 函数将字符串2中的前若干个字符复制到字符数组1中去。
168飞艇6种不亏钱的方法二者之间是有区别的,不应混为一谈。
4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)
4.2、赋值方式:
对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
char str[14];str="I love China"; //错误,不是初始化,这是赋值,只能一一进行。
(但在字符数组初始化时可以,即char str[14]="I love China";)
而对字符指针变量,采用下面方法赋值:
char* a;a="I love China";//指针赋值,可以
或者是char* a="I love China"; 都可以
4.3、对字符指针变量赋初值(初始化):
char* a="I love China";
等价于:
char* a;
a="I love China";
而对于字符数组的初始化
char str[14]="I love China";
不能等价于:
char str[14];
str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)
4.4、如果定义了一个字符数组,那么它有确定的内存地址,不能进行多次赋值;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。
5、字符串处理函数
5.1 字符串连接
char *strcat(char *str1,const char *2 );char *strcat(char *strDestination,const char *strSource );
功能:函数将字符串str2 连接到str1的末端,并返回指针str1
注:连接前两个字符串的后面都有一个' \0 ',连接时将字符串1后面的' \0 ‘去掉,只在新串最后保留一个' \0 ‘
5.2 字符串复制
char *strcpy(char *str1,const char *2 );char *strcpy(char *strDestination,const char *strSource );
功能:复制字符串strSource 中的字符到字符串strDestination,包括空值结束符。返回值为指针strDestination。
注:
1、“字符数组1”必须写成数组名形式,“字符串2"可以是字符数组名,也可以是一个字符串常量
2、复制时连同字符串后面的' \0 ' 一起复制到数组1中
3、不能用赋值语句直接将一个字符串常量或者字符数组直接赋给一个字符数组(同普通变量数组是一样的),而只能用strcpy 函数处理。
4、可以用strcpy 函数将字符串2中的前若干个字符复制到字符数组1中去。