1.字符串和字符串常量
字符串是一种常用的、重要的数据,比如各种名字、编号等。C语言中,字符串常量是用双引号引起来的一串字符序列,如“I am happy!”“Hello world!”等。注意双引号仅仅是在程序中使用,是为了区分字符串和一般的标识符而设定的,系统在存储字符串时不会存储双引号。如果只给出happy这样一串字符,系统没有办法知道它是一个字符串还是某一个其他对象的名字。
C语言中没有字符串的类型定义,当给出一个字符串常量时,系统将其作为一个字符数组来处理。和普通的字符数组不同的是,系统在存储字符串时,会自动在最后补加一个'\0',也就是说是以'\0'作为字符串结束标记的。例如给出字符串“happy”,则系统在存储该字符串时需要一个长度为6的字符数组,最后一个单元中自动存放'\0'。
字符串本身就是用一维字符数组存储的,因此在程序中我们也可以用一个自己定义的一维字符数组来存储一个字符串,此时可以将自定义的字符数组“看成”是字符串的变量形式。如一个长度为80的一维字符数组中,可以存储“Hello,World”,也可以存储“I love China”,也就是说其存储的字符串是可以变化的,只要长度不超过79(不要忘了'\0')的字符串都可以存储在该数组中。
可以使用字符串常量对字符数组初始化,如:
char ch[20]={“Hello,world!”};
例或:
char ch[20]=“Hello,World!”;
两种方法等价,因为双引号本身已经定义了字符串,两边的花括号可以省略。
请比较以下两种初始化形式:
char ch[5]={'H','e','l','l','o'};
char ch[5]=“Hello”;
第一种写法是正确的,ch数组的每一个获得了唯一的初值;第二种写法是错误的,用字符串初始化时,字符串后边有'\0',因此数组长度最少要为6。以下两种写法是等价的:
char ch[6]={'H','e','l','l','o','\0'};
char ch[5]=“Hello”;
2.字符数组的输入输出
引入字符串后,字符数组的输入输出可以使用以下两种方法:
(1)用格式符“%c”格式符逐个字符输入或输出,如例6-17那样。
(2)将字符数组作为字符串,用“%s”格式符,一次性整体输入或输出。
【例6-18】整体输入输出字符数组。
和其他类型的数组相比较,这是字符数组比较特殊的地方。其他类型的数组只能逐个单元地引用,但由于字符数组可以作为字符串的存储结构,它可以作为一个整体进行输入和输出。
使用字符数组处理字符串时应注意以下几点:
(1)一般字符数组应定义的足够大,以便能够存储足够长的字符串。
(2)数组名字代表的就是数组的起始地址,因此在输入时直接使用数组名,前边不能再加“&”来取地址。
(3)scanf输入字符串时,将空格、回车等作为字符串输入结束的标记,如例6-18中,程序运行时若输入“Hello World!”,则在输出时只输出“Hello”。
(4)使用多个%s一次可以输入或输出多个字符串。
【例6-19】输入或输出多个字符串。
以空格隔开的两部分作为两个字符串分别输入给了str1和str2,输出时中间没有空格,若想输出的两个部分之间也隔开则修改为printf(“%s %s”,str1,str2)即可。
3.常用字符串处理函数
编程中经常要处理字符串,为了减轻程序员负担,C语言中提供了丰富的字符串处理库函数供程序员调用。用于输入输出的库函数其头文件仍是stdio.h,其他的字符串函数定义在string.h头文件中。
下面介绍常用的字符串处理函数。
(1)get函数。
其一般形式为:gets(字符数组名)
功能:输入一个字符串到指定数组中。
gets函数在输入字符串时,以回车作为字符串输入结束的标记,因此用该函数能够输入一个内部包含空格的字符串。和scanf相比较,gets一次只能输入一个字符串。
(2)puts函数。
其一般形式为:puts(字符数组名)
功能:把字符数组中以'\0'结束的字符串输出到显示器。
同printf相比,该函数一次只能输出一个字符串。
【例6-20】用gets和puts输出输出字符串。
(3)strcpy函数和strncpy函数。(https://www.xing528.com)
其一般形式为:strcpy(字符数组名,字符串)
功能:把字符串拷贝到字符数组中,赋值时串结束标志'\0'会一同拷贝。
参数1必须是一个字符数组的名字且该数组应足够容纳字符串中的所有的字符(包括'\0');参数2可以是一个字符数组,也可以是一个字符串常量。例如:
strcpy(str,”I am happy!”);
在做字符串的复制时不能使用简单的赋值。如:
char str1[20],str2[20]=”I Love China”;
str1=str2;
这种写法是错误的,因为数组名字不允许赋值。
也可以使用strncpy函数将字符串中前n个字符复制到字符数组中去。
【例6-21】strcpy和strncpy函数的使用。
strncpy函数中只是复制字符串前边指定的字符数,此n值不应该大于字符串的长度,且复制时不赋值'\0'。
(4)strcat函数。
其一般形式为:strcat(字符数组名1,字符数组名2)。
功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串结束标志'\0'。
使用字符串连接函数时,要求字符数组1的长度足够大,至少要大于两个字符数组的长度和,否则不足以容纳二者连接以后的字符串。
【例6-22】strcat函数的使用。
(5)strcmp函数。
其一般形式为:strcmp(字符数组名1,字符数组名2)
功能:比较两个字符串的大小,比较结果由函数值来确定。
若字符串1=字符串2,则函数只为0;
若字符串1>字符串2,则函数值为一个正整数;
若字符串1<字符串2,则函数值为一个负整数。
本函数也可用于比较两个字符串常量的大小,或比较字符数组和字符串常量。
字符串比较大小时不允许直接使用关系运算符进行比较。两个字符串比较的规则是对两个字符串按照从左向右的顺序逐个字符进行比较,直到遇到不同的字符或'\0'为止。若全部字符都相同,则说明两个字符串相等;若出现了不相同的字符,则按字符的ASCII编码比较两个字符的大小,其比较结果即为字符串的比较结果。
【例6-23】输入三个字符串并按从小到大的顺序输出。
(6)strlen函数。
其一般格式为:strlen(字符串)
功能:返回字符串的实际长度(不含字符串结束标志'\0')。
例如:
printf(“%d”,strlen(“family”));
其值为6。
格式中的字符串可以是字符串常量,也可以是字符数组。
(7)strlwr函数。
其一般格式为:strlwr(字符串)
功能:将字符串中的大写字母转换为小写字母。
(8)strupr函数。
其一般格式为:strupr(字符串)
功能:将字符串中的小写字母转换为大写字母。
这些函数都是在编程过程中经常会用到的,请大家熟练掌握其使用方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
