字符串与字符数组都是描述由多个字符构成的数据,字符串借用字符数组来完成处理。但请注意:
(1)表示字符串数据用双引号表示,而字符数据用单引号。
(2)字符串的长度可以根据串中字符个数临时确定,而字符数组的长度必须事先规定。
(3)对字符串,系统在串尾加’\0’作为字符串的结束标志,而字符数组并不要求最后一个字符为’\0’。
(4)用字符数组来处理字符串时,字符数组的长度应比要处理的字符串长度大1,以存放串尾结束符’\0’。
例如:
staticchar city[9]={ ’c’,’h’,’a’,’n’,’g‘,’s’,’h’,’a’,’’0\'}.可用字符串描述为:
staticchar city[9]={ "changsha"}或"changsha";
上述两条语句可分别理解为用字符数组来处理字符串,用字符串对字符数组初始化。但千万请注意不能在程序中给字符数组赋值。
比如你定义了一个字符数组char str[10];
在程序中:
printf("please input str\n");
//scanf("%s",str);
str="good"; //这就是错的
str[10]="good";//也是错的
而如下就是对的:
char str[10]="tood";
char *strr="good";
也就是字符数组只能在定义初始化时赋值或通过输入赋值,而不能中途直接赋值。
下面介绍用字符数组来处理字符串的一些整体操作。
1.输入输出
输入输出用scanf()、printf()函数完成,采用”%s”格式。输入输出参数用字符数组名。n
printf函数的用法与scanf函数类似,输出参数可以是字符串常量,一般格式为:
printf("%s",字符数组名或字符串常量)。如:
char x[10]="Hi, all.\n";
printf("%s",x);
printf("%s","Hello.\n");
再如,有如下程序:
main()
{charcomp[:9];
scan{(”%s”,comp);/*本身就是地址,不需加地址运算符*/
print{COMP=%s”,comp);
}
输入数据:CHINAONE
运行结果:COMP—CHINAONE
说明:
(1)输入字符串数据时不需用界定符。
(2)输入多个字符串数据时,以空格分隔数据。如果字符串数据本身包含有空格字符,需采用特殊处理。
(3)输出先找到存放字符串的字符数组的首地址,遇串尾结束符’\0’结束。输出字符不包括串尾结束符’\0’。
(5)如果字符数组长度大于字符串实际长度,也只输出到’\0’结束。
2.字符串处理函数
puts()与gets()函数包含在头文件stdio.h中,字符串处理函数包含在头文件string.h中,用#include,,String.h”指明。
在以下的函数中,参数str、str1、str2为字符数组类型或指向字符的指针类型。
(1)puts(str)
输出指定字符串。参数可以为字符串常量。
会在结束时自动换行。
(2)gets(str)
从键盘输入字符串至字符数组str中,输入的字符串可以包含空格。函数的返回值是字符数组str的首地址。具体如下:
使用gets函数可输入一句话(包含空格、制表符),其语法为:
gets( 字符数组 )
存入字符数组的是一个字符串(以 '\0' 结束),但不包括回车符
char s[100];
gets(s);
若输入是(“_”为空格): _ _I'm_a_sport_ _
则s的内容为"_ _I'm_a_sport_ _"
(3)strcpy(strl,str2)
将str2的值复制到strl中,实际上完成字符串的赋值操作。要求strl的长度大于str2的长度,第二个参数可以是字符串常量。
(4)strcat(strl,str2)
将str2的值连接到strl中原有值的后面。注意strl必须足够大,以便能容纳两个字符数组中的所有值。连接完成后,两个字符串并成一个字符串,第一个字符串后面的原结束符自动取消。
(5)strcmp(st1,str2)
比较strl和str2,若两者相同,返回函数值为0;若strl大于str2,返回函数值为一个正整数;若strl小于str2,返回函数值为一个负整数。字符串比较规则与其它语言相同,将两个字符串中的字符从左至右依次比较,如果全部字符相同,则认为相等;若出现不同字符,则以第一个不同字符比较结果为准。 两个参数可以是字符串常量。
字符串比较大小的概念:
字符串的大小由字符串中的字符的编码决定,对于任意两个字符串,从它们的第一个字符开始比较,若相同,则继续比较下一个字符,直到出现不同的字符或者遇到了结束符。若存在不同的字符,则编码较大的字符所在的字符串较大。如果同时遇到结束符,则两个字符串相等
"ABC"小于"AbC"
"ABC"大于"AB"
"123"等于"\x31\x32\x33"
关系运算符不能用来比较字符串的大小,只能使用库函数。
(6)strlen(str)
函数的返回值为字符串的实际长度。
(7)strlwr(str)
将字符串中大写字母转换成小写字母。
(8)strupr(str)
将字符串中小写字母转换成大写字母。
如果字符数组中包含多个’\0’,输出遇到第一个’\0’结束。
(9)strncpy(字符数组1, 字符串2, 整数n )
strncpy函数最多复制前n个字符
(10)strncat(字符数组1,字符串2,整数n)
strncat函数仅把“字符串2”的前n个字符连接到“字符数组1”的字符串后边
(11)strcmp(字符串1,字符串2)
strncmp(字符串1,字符串2,整数n)
stricmp(字符串1,字符串2)
函数的函数值都是整型的,如果函数值为0,表示两个字符串相等;如果函数值大于0,则“字符串1”大于“字符串2”;如果函数值小于0,则“字符串1”小于“字符串2”
strcmp函数是最常用的函数之一,从左到右逐一比较每个字符,直到遇到不同的字符或遇到字符串结束为止.
strncmp函数只比较两个字符串的前n个字符
用stricmp函数比较两个字符串时,将忽略字母符号的大小写
(12)strstr函数的一般形式为:
strstr(字符串1,字符串2)
strstr函数的功能是在“字符串1”中查找“字符串2”,如果找不到,则函数返回空指针NULL,若找到了,则返回与“字符串1”中所包含的“字符串2”的首字符对应的指针
如果“字符串1”中包含“字符串2”,那么“字符串2”常被称作“字符串1”的子串
(13)char *strchr(char *str,char ch)
查找字符ch在字符串str中第一次出现的位置,查找失败,返回空指针NULL。
(14)char *strrchr(const char *s, int c)
查找字符ch在字符串s中最后一次出现的位置,查找失败,返回空指针NULL。
如char *s="123456780",*p;
p=strchr(s,'0'); 则p的值为s.
p=strrchr(s,'0');则p的值为s+8.
(15)void *memcpy(void *dest, const void *src, size_t n)
从内存地址src拷贝n字节到内存地址dest.
void *memset(void *s, int c, size_t n)
将字符c存入内存dest开始的n字节单元中。