C语言--第九章 字符串、字符和字节
9.3 不受限制的字符串函数
9.3.2 连接字符串strcat
想要实现字符串的拼接,可以使用strcat函数,它的原型如下:
char * strcat ( char * destination, const char * source );
函数参数说明:
1.destination:目标字符串的指针,即要追加到的字符串。strcat函数要求该参数原先已经包含了一个字符串(可以是空字符串)。
2.source:源字符串的指针,即要追加的字符串。
3.函数返回值:返回一个指向目标字符串的指针,即追加后的字符串。
示例代码:
#include <stdio.h>
#include <string.h>
int main() {
char destination[20] = "Hello, ";
const char *source = "world!";
strcat(destination, source);
printf("%s\n", destination); // 输出:Hello, world!
return 0;
}
由于strcpy和strcat函数返回值都是一个指向目标字符串的数组的指针,因此可以嵌套调用这些函数,例如:
strcat(strcpy(dst,a),b);
strcpy首先执行,把字符串从a复制到dst并返回dst。然后这个返回值成为strcat的第一个参数,stract把b添加到dst后面。等同于下面这种形式:
strcpy(dst,a);
strcat(dst,b);
9.3.3 字符串比较函数strcmp
比较两个字符串涉及对两个字符串对应字符的逐个比较,知道发现不匹配为止。最先不匹配的字符中较“小”(在字符集中序数较小)的那个字符所在的字符串被认为“小于”另外一个字符串。如果其中一个字符串是另外一个字符串前面的一部分,也被认为是小于另外一个字符串,因为它的NUL结尾字节出现的更早。这种被称为“词典比较”,只包含大写字母或者小写字母的比较。函数原型如下:
int strcmp ( const char * str1, const char * str2 );
函数参数说明:
str1:第一个要比较的字符串。
str2:第二个要比较的字符串。
函数返回值:
如果 str1 小于 str2,则返回一个负数。
如果 str1 等于 str2,则返回 0。
如果 str1 大于 str2,则返回一个正数。
!!!注意:
标准并没有规定用于提示不相等的具体值,只是说str1 小于 str2,则返回一个负数; str1 大于 str2,则返回一个正数。一个常见的错误认知就是把返回值误认为1和-1,但这并不总是正确。
示例程序:
#include <stdio.h>
#include <string.h>
int main() {
const char *str1 = "apple";
const char *str2 = "banana";
int result = strcmp(str1, str2);
if (result < 0) {
printf("%s is less than %s\n", str1, str2);
} else if (result == 0) {
printf("%s is equal to %s\n", str1, str2);
} else {
printf("%s is greater than %s\n", str1, str2);
}
return 0;
}
9.4 长度受限制的字符串函数
标准库还包含了一些函数,它们以一种不同的方式处理字符串。这些函数接受一个显式的长度参数,用于限定进行复制或比较的字符数。这些函数的原型如下:
char * strncpy ( char * destination, const char * source, size_t num );
char * strncat ( char * destination, const char * source, size_t num );
int strncmp ( const char * str1, const char * str2, size_t num );
1.和strcpy一样,strncpy把源字符串的字符复制到目标数组,但他总是向destination写入num个字符。如果strlen(source)的值小于num,destination数组就用额外的NUL字节填充到num长度;如果strlen(source)的值大于或等于num,那么只有num个字符被复制。注意!它的结果将不会以NUL字节结尾。
2.strncat和strncpy不同,strncat从源字符串中最多复制num个字符到目标数组的后面。但是,strncat总在结果字符串后面添加一个NUL字节,而且它不会像strncpy那样用NUL对数组进行填充。
3.strncmp也用于比较两个字符串,但它最多比较num个字节。如果两个字符串在第num个字符之前存在不相等的字符,就会停止比较并返回结果。如果两个字符串前num个字符相等,就返回零。
9.5 字符串查找
9.5.1 查找一个字符
在一个字符串中查找一个特定字符最容易的方法是使用strchr和strrchr函数:
char *strchr(char const *str,int ch);
char *strrchr(char const *str,int ch);
它们的第二个参数是一个整型值。但是,它包含了一个字符值。strchr在字符串str中查找字符ch第一次出现的位置,找到后函数返回一个指向该位置的指针,如果所找字符不存在于字符串中则返回一个NULL指针。strrchr与strchr基本一致,只是它返回的是该字符最后一次出现的位置。
9.5.2 查找任何几个字符strpbrk
strpbrk是查找任何一组字符第一次在字符串中出现的位置。原型如下:
char *strpbrk(char const *str,char const *group);
该函数返回一个指向str中第一个匹配group中任何一个字符的位置,如果未找到,返回NULL指针。
9.5.3 查找一个子串strstr
在字符串中查找一个子串,可以使用strstr函数,原型如下:
char *strstr(char const *s1,char const *s2);
strstr 函数用于在一个字符串中查找第一次出现指定子字符串的位置,并返回该子字符串的指针。
函数返回值:
如果找到子字符串,则返回指向子字符串的指针。
如果第二个参数是一个空字符串,则返回s1。
如果未找到子字符串,则返回 NULL。
/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
strncpy (pch,"sample",6);
puts (str);
return 0;
}
9.6 字符转换
转换函数用于将大写字母转换为小写字母或把小写字母转换为大写字母。
int tolower(int ch);
int toupper(int ch);
函数返回值:
如果转换成功,则返回转换后的小写字母。
如果转换失败(即字符不是大写字母),则返回原始字符。