4.3.3 与字符串处理有关的几个函数
由于在C语言中,字符串的应用非常广泛,为了简化用户的程序设计,C语言提供了丰富的字符串处理函数,这样可以大大减轻编程的工作量。
C语言提供的字符串处理函数除了上一节讲的gets和puts这两个用于输入输出的函数被包含在stdio.h这个头文件中外,下面要讲述的函数都包含在头文件string.h中。
1.字符串长度测量函数strlen
在实际使用中,存储字符串的字符数组的长度不是很重要,因为在程序中一般依靠字符串结束标志'\0'的位置来判定字符串是否结束。这样字符串的长度与存储它的字符数组的长度是不变的,而实际使用中,更需要知道字符串的长度,即字符串中的字符个数。
C语言提供了测试字符串长度的函数,其一般形式为:
strlen(字符数组名);
这个函数返回一个整型值,其值为字符串中的实际字符数(不包括'\0'在内),例如:
char word[10]= "abcd";
printf("%d",strlen(word));
输出的结果,既不是字符数组word的长度10,也不是字符串"abcd"所占用的字符数5,而是这个字符串中的实际字符数4。
2. 字符串复制函数strcpy
其一般形式为:
strcpy(字符数组名1,字符串2);
这个函数将字符串2的所有字符一个一个地复制到字符数组1中,直到遇到结束标志'\0'为止,并把结束标志也写入到字符数组1中。
对于字符数组而言,只有在初始化时可以整体赋值,以后就只能一个元素一个元素地赋值,C语言提供这个函数,就可以实现对字符数组的整体赋值。
上面的程序实现了将字符串word2复制到字符数组word1中这一功能。注意,如果使用“word1=word2;”来代替“strcpy(word1,word2);”则程序会出现错误。这是因为word1=word2试图用word2这个字符数组的地址去修改word1这个字符数组的地址,而字符数组的地址是不能在程序中修改的。
另外,在使用此函数,一定要保证字符数组1的长度要大于字符串2中的字符数,否则字符数组1会发生越界错误。
此外,C语言还提供了函数strncpy,用于将字符串2的前几个字符复制到字符数组1中,其一般形式为:
strncpy(字符数组名1,字符串2,要复制的字符数);
比如:
char str1[]="Sichuan";
strncpy(str1,"Chengdu",3);
用于将字符串"Chengdu"的前3个字符,即Che复制到str1中,覆盖str1的前三个字符,即str1的值变为:Chehuan。
3.字符串连接函数strcat
其一般形式为:
strcat(字符数组名1,字符串2);
这个函数用两个字符串为参数,取消第一个字符数组中的字符串的结束标志'\0',把第二个字符串拼接至第一个字符串后面,并把拼接的结果存放到第一个字符数组中。
使用这个函数需要注意的是:这个函数将两个字符串拼接后存放在第一个字符数组中,因此第一个字符数组必须足够大,以便容纳拼接后的新字符串。
下面的程序运行时会出错,其原因就是因为第一个字符数组的长度不够。
4.字符串比较函数strcmp
其一般形式为:
strcmp(字符串1,字符串2);
这个函数,将两个字符串按字典排序的方式进行比较,即从字符串1和字符串2的第一个字符开始从左至右依次按ASCII码进行比较,直到出现不相同的字符或碰到结束标志'\0'为止,以第一个不相等的字符的比较结果作为整个字符串的比较结果。比较的结果由函数值带回。
函数的返回值是一个整数,它的意义如下:
(1)在不相同字符的ASCII码中,如果字符串1与字符串2相等,即它们的长度相等,且对应的字符也相等,则返回0;
(2)在不相同字符的ASCII码中,如果字符串1大于字符串2,则函数返回一个正整数;
(3)在不相同字符的ASCII码中,如果字符串1小于字符串2,则函数返回一个负整数。
在使用字符串时,需注意要比较两个字符串中是否相同,只能通过这个函数来比较,不能直接对存储它们的数组名进行比较,因为那样比较的是两个字符串地址的大小,而不是字符串的大小。例如:
以上程序的输出为:
−1
1
前一个−1表示字符串word1的值小于字符串word2,而后一个1表示作为字符数组地址的word1大于word2这个字符数组的首地址,该关系表达式的值为真。
5.其他字符串处理函数
C语言提供的字符串处理函数还有很多,一些常用的字符串处理函数如表4.3.1所示。
表4.3.1 常用字符串处理函数
下面完成例4-5。
算法分析:
按照例4-5给出的规则进行判断。
用字符数组word[100]存放单词,用整型变量len表示原单词的长度。
(1)以字母y结尾,且y前面是一个辅音字母,即len〉1&&word[len−2]!='a'&&word[len−2]!='e'&&word[len−2]!='i'&&word[len−2]!='o'&&word[len−2]!='u'&&word[len−1]=='y',则将y改成i,再加es,即word[len−1]= 'i',word[len]= 'e',word[len+1]= 's',word[len+2]= '\0';
(2)以s、x、ch、sh结尾,即len〉1&&((word[len−1]== 's')||(word[len−1]== 'x')||(word[len−1]== 'h'&&(word[len−2]=='c'||word[len−2]== 's'))),则加es,即word[len]= 'e',word[len+1]= 's',word[len+2]= '\0';
(3)以字母o结尾 ,即word[len−1]= 'o',则加es,即;word[len]= 'e',word[len+1]= 's',word[len+2]= '\0';
(4)其他情况直接加s,即word[len]= 's',word[len+1]= '\0'。
参考程序如下:
程序的运行情况如图4.3.5所示。
图4.3.5 求单词复数
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。