c++ 字符串数组,C++ 字符数组
用来存储字符数量的数组称为字符数组。一个字符串可以看作一个数组,它的元素是字符型的。
字符数组的定义
形式与前面介绍的数值数组相同。例如:
char c[10];
因为字符型和整型比较常见,所以也可以定义为int c[10],但此时每个数组元素占用2个字节的内存单元。
字符也可以是二维或多维数组。例如:
char c[5][10];
即二维字符数组。
字符数组的初始化
字符还允许在定义时进行初始化赋值。例如:
char c[10]={c , , p , r , o , g , r , a , m };
赋值后每个元素的值为:
c[0]的值是 c
c[1]的值是“”
c[2]的值是‘p’
c[3]的值是“r”
c[4]的值是“0”
c[5]的值是‘g’
c[6]的值是 r
c[7]的值是‘a’
c[8]的值是 m
其中c[9]未赋值,值为 p 的系统自动赋值为0。当所有元素都给定初始值时,长度描述也可以省略。例如:
char c[]={c , , p , r , o , g , r , a , m };
此时,C数组的长度自动设置为9。
对字符数组的引用
# include stdio . h # include stdlib . h int main(void){ inti,j;chara[][5]={ { H , e , l , l , },{ w , o , r , l , d } }for(I=0;I I){ for(j=0;j j ) printf(%c ,a[I][j]);printf( \ n );}系统(暂停);return0}
运行结果:
因为本例中二维字符数组的所有元素在初始化时都被赋予了初始值,所以一维下标的长度可以省略。
和字符串结束标志。
C语言中没有特殊的字符串变量。通常,字符数组用于存储字符串。在前面介绍字符串常量时,已经解释过字符串总是使用 \0 作为字符串的结尾。因此,当字符串存储在数组中时,终止符 \0 也存储在数组中,用作字符串结束的标志。有了 \0 标志,就不再需要根据字符数组的长度来判断字符串的长度。
c语言允许以字符串的形式初始化数组赋值。例如:
char c[]={c ,, p , r , o , g , r , a , m };
可以写成:
char c[]={C程序 };
或者去掉{},写成:
char c[]=C程序;
按字符串赋值比按字符逐个赋值要多一个字节,用来存放字符串结束标志 \0 。上述数组C在内存中的实际存储量为:
“0”是由C编译系统自动添加的。因为采用了 \ 0 标志,所以用字符串赋值初始值时一般不需要指定数组的长度,系统会自己处理。
字符数组的输入和输出
使用字符串模式后,字符数组的输入输出会变得简单方便。除了上述给字符串赋初值的方法,还可以使用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不是使用循环语句逐个输入输出每个字符。
# include stdio . h # include stdlib . h int main(void){ charc[]= Hello \ n world ;printf(%s\n ,c);系统(“暂停”);return0}
运行结果:
注意,在这个例子的printf函数中,使用的格式字符串是" %s ",这表明输出是一个字符串。而在输出表列中给出数组名即可。无法写为:printf(%s ,c[]);
# include stdio . h # include stdlib . h int main(void){ charst[15];Printf(输入一个字符串:\ n );scanf(%s ,ST);printf(%s\n ,ST);系统(“暂停”);return0}
运行结果:
在本例中,由于数组长度被定义为15,输入字符串长度必须小于15,这样就可以保留一个字节来存储字符串结束标志“\ 0”。需要注意的是,对于一个字符数组,如果没有进行初始化赋值,就必须声明数组长度。还应该注意,当用scanf函数输入一个字符串时,该字符串不能包含空格,否则,空格将被用作字符串的终止符。
从输出结果可以看出,空格后的字符没有输出。为了避免这种情况,可以设置几个字符数组来存储分段中带有空格的字符串。
在C语言中,数组名表示数组的第一个地址。整个数组是从第一个地址开始的连续内存单元。如果有一个字符数组char c[10],可以如图所示在内存中表示。
设数组C的第一个地址是2000,也就是说单元c[0]的地址是2000。数组名c代表第一个地址。所以不能在c之前加地址运算符,写scanf(%s )是错误的。函数printf(%s ,C)执行时,通过数组名C找到第一个地址,然后逐个输出数组中的每个字符,直到遇到字符串标志 \0 结束。
字符串处理功能
c语言提供了丰富的字符串处理函数,大致可以分为字符串输入、输出、合并、修改、比较、转换、复制和搜索。使用这些函数可以大大减轻编程的负担。用于输入和输出的字符串函数在使用前应包含头文件“stdio.h”,而其他字符串函数应包含头文件“string.h”。
以下是一些最常用的字符串函数。
字符串输出函数将
格式:puts(字符数组名)
功能:将字符数组中的字符串输出到显示器。也就是说,字符串显示在屏幕上。
# include stdio . h # include stdlib . h int main(void){ charc[]= Hello world!\ n ;卖出期权(c);系统(“暂停”);return0}
运行结果:
从程序中可以看出,puts函数中可以使用转义字符,所以输出结果变成两行。puts函数可以完全由printf函数代替。当需要以某种格式输出时,通常使用printf函数。
字符串输入函数获取
格式:获取(字符数组名)
功能:从标准输入设备的键盘输入一个字符串。
这个函数获取一个函数值,它是字符数组的第一个地址。
# include stdio . h # include stdlib . h int main(void){ charst[15];Printf(输入一个字符串:\ n );gets(ST);看跌期权(ST);系统(“暂停”);return0}
运行结果:
当输入字符串包含空格时,输出仍然是所有字符串。说明gets函数不使用空格作为字符串输入的结束符号,只使用回车作为输入。这不同于scanf功能。
字符串连接函数strcat
格式:strcat(字符数组名1,字符数组名2)
作用:将字符数组2中的字符串连接到字符数组1中的字符串后面,删除字符串1后面的字符串标记“\0”。这个函数的返回值是字符数组1的第一个地址。
# include stdio . h # include stdlib . h int main(void){ static charst 1[30]=我的名字是;int st2[10];Printf(输入您的姓名:\ n );获取(st2);strcat(st1,st2);卖出(st1);系统(“暂停”);return0}
运行结果:
这个程序将初始化赋值的字符数组和动态赋值的字符串连接起来。注意字符数组1要定义足够的长度,否则不能加载所有连接的字符串。
复制字符串函数strcpy
格式:strcpy(字符数组名1,字符数组名2)
函数:将字符数组2中的字符串复制到字符数组1中。结束符号“\0”也被复制。几个字符2,或者一个字符串常量。这相当于将一个字符串赋给一个字符数组。
# include stdio . h # include stdlib . h int main(void){ charst 1[15],st2[]=Hello World!;strcpy(st1,st2);卖出(st1);printf( \ n );系统(“暂停”);return0}
这个函数要求字符数组1要有足够的长度,否则不能加载所有复制的字符串。
字符串比较函数strcmp
格式:strcmp(字符数组名1,字符数组名2)
函数:按照ASCII码顺序比较两个数组中的字符串,通过函数的返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串2 >字符串2,返回值> 0;
字符串1 <字符串2,返回值<0。
这个函数也可以用来比较两个字符串常量,或者用字符串常量比较数组。
#包含stdio.h
#包含stdlib.h
int main(void){ intk;staticcharst1[15],st2[]=Hello World!;Printf(输入一个字符串:\ n );gets(st1);k=strcmp(st1,st2);if(k==0)printf( st1=st2 \ n );if(k 0)printf( st1 st2 \ n );if(k 0)printf( st1 st2 \ n );系统(“暂停”);return0}
在这个程序中,将输入的字符串与数组st2中的字符串进行比较,将比较结果返回给K,然后根据K的值输出结果提示字符串,当输入为dbase时,从ASCII码可以知道“dBASE”大于“C语言”,所以k > 0,输出结果为“st1 st2”。
# include stdio . h # include stdlib . h int main(void){ intk;staticcharst[]=你好,世界!;k=strlen(ST);Printf(字符串的长度是:%d\n ,k);系统(“暂停”);return0}
字符串长度测量函数strlen
格式:strlen(字符数组名)
函数:测量字符串的实际长度(不包括字符串结束标志 \ 0 ),并以函数形式返回值。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。