对于字符串来说,支持通过在 `` 头文件中的函数,进行字符串的长度、复制、连接、比较、查找等操作。常见的字符串处理函数和功能列表。
获取字符串长度
对于C语言字符串来说,可以通过 `strlen()` 函数获取字符串的长度。字符串的长度为指针指向首地址,到首个字符串结束的空字符 `\0` 之间的字符数(不包括空字符),可通过遍历计数来实现。
对于strlen函数,其原型如下所示。
plaintext
// 函数声明 strlen
// 函数功能:获取字符串的长度
// str:指向字符串首地址的指针
// 返回值:字符串的长度,类型为 size_t
size_t strlen(const char *str);
这里size_t是C语言中定义的无符号整数类型,用于表示字符串的长度。其具体类型一般与平台相关,在编译时确定;在32位平台上,size_t一般为32位无符号整数,在64位平台上,size_t一般为64位无符号整数。对于strlen的返回,建议使用size_t类型,避免返回值类型隐式转换导致数据错误。
对于strlen的测试示例如下所示。
plaintext
#include
#include
int main(int argc, char *argv[])
{
const char *str = "hello world";
char str1[20] = "hello world";
printf("strlen(str) = %zu\n", strlen(str)); // strlen(str) = 11
printf("strlen(str1) = %zu\n", strlen(str1)); // strlen(str1) = 11
return 0;
}
对于上述代码,具体执行结果如下所示。

字符串拷贝
对于C语言字符串来说,可以通过 `strcpy()` 函数和 `strncpy()` 函数进行字符串的拷贝复制。
这两个函数的原型如下所示。
plaintext
// 函数声明 strcpy
// 函数功能:将字符串src复制到字符串dest中
// dest:指向目标字符串首地址的指针
// src:指向源字符串首地址的指针
// 返回值:指向目标字符串首地址的指针
char *strcpy(char *dest, const char *src);
// 函数声明 strncpy
// 函数功能:将字符串src复制到字符串dest中,最多复制n个字符
// dest:指向目标字符串首地址的指针
// src:指向源字符串首地址的指针
// n:最多复制的字符数
// 返回值:指向目标字符串首地址的指针
char *strncpy(char *dest, const char *src, size_t n);
strcpy用于将源字符串复制的目标字符串,复制的长度为源字符串的长度;如果目的字符串的长度不足,仍然会继续写入,因此使用strncpy函数,可以指定最多复制的长度,避免写入超出目的字符串长度的内容。
对于strncpy,根据复制长度n的不同,具有以下特点。
需要注意的是,strcpy复制后,会在末尾添加'\0'作为结束字符,因此不需要手动添加。而strncpy复制后,并不会自动在末尾添加'\0'作为结束字符,因此需要复制前清零目的字符串或者复制后在末尾手动添加。这两个函数对于结尾的处理是不同的,在复制后需要注意。
对于strcpy和strncpy的测试示例如下所示。
plaintext
#include
#include
int main(int argc, char *argv[])
{
char src[15] = "hello world";
char dest[20] = {0};
char *ptr;
ptr = strcpy(dest, src);
printf("dest = %s\n", dest); // dest = hello world
printf("ptr = %s\n", ptr); // ptr = hello world
strncpy(dest, src, 5);
dest[5] = '\0';
printf("dest = %s\n", dest); // dest = hello
return 0;
}
对于上述代码,具体执行结果如下所示。

字符串比较
对于C语言字符串来说,可以通过 `strcmp()` 函数和 `strncmp()` 函数进行字符串的比较。
这两个函数的原型如下所示。
plaintext
// 函数声明 strcmp
// 函数功能:比较字符串str1和字符串str2
// str1:指向第一个字符串首地址的指针
// str2:指向第二个字符串首地址的指针
// 返回值:如果str1等于str2,返回0;如果str1大于str2,返回一个大于0的值;如果str1小于str2,返回一个小于0的值
int strcmp(const char *str1, const char *str2);
// 函数声明 strncmp
// 函数功能:比较字符串str1和字符串str2的前n个字符
// str1:指向第一个字符串首地址的指针
// str2:指向第二个字符串首地址的指针
// n:最多比较的字符数
// 返回值:如果str1等于str2,返回0;如果str1大于str2,返回一个大于0的值;如果str1小于str2,返回一个小于0的值
int strncmp(const char *str1, const char *str2, size_t n);
对于strcmp函数,比较的停止条件包括按照从左到右的顺序遇到不同的字符串,或者任意一个字符串检测到'\0'表示比较结束。对于strncmp函数,除了上述条件外,还包括到达指定的比较长度n。对于字符串的大小,主要按照字符的ASCII码进行比较,字符在前则返回负值,字符在后返回正值。
对于strcmp和strncmp函数,具体示例如下所示。
plaintext
#include
#include
int main(int argc, char *argv[])
{
char str1[] = "asio_user";
char str2[] = "asio_user_test";
// 字符串比较 strcmp
if (strcmp(str1, str2) == 0) {
printf("str1 = str2\n");
} else {
printf("str1 != str2\n");
}
// 字符串比较 strncmp, 比较长度小于两个字符串长度
if (strncmp(str1, str2, 9) == 0) {
printf("str1 = str2 (first 9 chars)\n");
} else {
printf("str1 != str2 (first 9 chars)\n");
}
// 字符串比较 strncmp, 比较长度大于两个字符串长度
if (strncmp(str1, str2, 15) == 0) {
printf("str1 = str2 (first 15 chars)\n");
} else {
printf("str1 != str2 (first 15 chars)\n");
}
return 0;
}
对于上述代码,具体执行结果如下所示。

字符串查找
对于C语言字符串来说,支持如下字符串查找函数。
这三个函数的原型如下所示。
plaintext
// 函数声明 strchr
// 函数功能:在字符串str中查找字符c第一次出现的位置
// str:指向字符串首地址的指针
// c:要查找的字符
// 返回值:如果找到字符c,返回指向该字符的指针;如果未找到字符c,返回NULL
char *strchr(const char *str, int c);
// 函数声明 strrchr
// 函数功能:在字符串str中查找字符c最后一次出现的位置
// str:指向字符串首地址的指针
// c:要查找的字符
// 返回值:如果找到字符c,返回指向该字符的指针;如果未找到字符c,返回NULL
char *strrchr(const char *str, int c);
// 函数声明 strpbrk
// 函数功能:在字符串str中查找任意字符firstc和任意字符lastc之间的字符
// str:指向字符串首地址的指针
// firstc:要查找的字符范围的第一个字符
// lastc:要查找的字符范围的最后一个字符
// 返回值:如果找到任意字符在firstc和lastc之间,返回指向该字符的指针;如果未找到任意字符在firstc和lastc之间,返回NULL
char *strpbrk(const char *str, const char *firstc, const char *lastc);
// 函数声明 strstr
// 函数功能:在字符串str中查找子字符串substr第一次出现的位置
// str:指向字符串首地址的指针
// substr:指向子字符串首地址的指针
// 返回值:如果找到子字符串substr,返回指向该子字符串的指针;如果未找到子字符串substr,返回NULL
char *strstr(const char *str, const char *substr);
对于strchr和strrchr函数来说,都是在字符串中查找字符,返回字符的指针;如果未找到字符,返回NULL。strpbrk函数和strstr函数都是查找子字符串,不过查找的区别是strpbrk函数查找任意字符,strstr函数查找子字符串;同样是成功返回子字符串的指针,失败返回NULL。
关于字符串查找函数,具体示例如下所示。
plaintext
#include
#include
int main(int argc, char *argv[])
{
char str1[] = "asio_user";
char str2[] = "asio_user_test";
// 字符串查找 strchr
char *p = strchr(str1, 's');
if (p != NULL) {
printf("strchr: %s\n", p);
} else {
printf("strchr: not found\n");
}
// 字符串查找 strrchr
p = strrchr(str1, 's');
if (p != NULL) {
printf("strrchr: %s\n", p);
} else {
printf("strrchr: not found\n");
}
// 字符串查找 strpbrk
p = strpbrk(str1, "io");
if (p != NULL) {
printf("strpbrk: %s\n", p);
} else {
printf("strpbrk: not found\n");
}
// 字符串查找 strstr
p = strstr(str1, "user");
if (p != NULL) {
printf("strstr: %s\n", p);
} else {
printf("strstr: not found\n");
}
}
对于上述代码,具体执行结果如下所示。

字符串拼接
对于C语言字符串来说,可以通过`strcat()`函数和`strncat()`函数在字符串末尾拼接字符串。函数的原型如下所示。
plaintext
// 函数声明 strcat
// 函数功能:将字符串src拼接到字符串dest的末尾
// dest:指向字符串首地址的指针
// src:指向要拼接的字符串首地址的指针
// 返回值:返回指向拼接后的字符串的指针
char *strcat(char *dest, const char *src);
// 函数声明 strncat
// 函数功能:将字符串src拼接到字符串dest的末尾,最多拼接n个字符
// dest:指向字符串首地址的指针
// src:指向要拼接的字符串首地址的指针
// n:要拼接的最大字符数
// 返回值:返回指向拼接后的字符串的指针
char *strncat(char *dest, const char *src, size_t n);
对于strcat函数来说,将字符串src拼接到字符串dest的末尾,返回拼接后的字符串的指针;在拼接时不会考虑dest字符串的长度,所以dest字符串必须有足够的空间来存储拼接后的字符串,否则会导致缓冲区溢出。strncat函数则可以指定最多拼接n个字符,避免缓冲区溢出的问题。
关于字符串拼接函数,具体示例如下所示。
plaintext
#include
#include
int main(int argc, char *argv[])
{
char str1[] = "hello";
char str2[] = " world";
char str3[20];
// 字符串拼接 strcat
strcat(str3, str1);
printf("str3: %s\n", str3);
strcat(str3, str2);
printf("str3: %s\n", str3);
// 字符串拼接 strncat
memset(str3, 0, sizeof(str3));
strncat(str3, str1, 3);
printf("str3: %s\n", str3);
return 0;
}
对于上述代码,具体执行结果如下所示。
