对于字符串来说支持通过在 头文件中的函数进行字符串的长度、复制、连接、比较、查找等操作。常见的字符串处理函数和功能列表。获取字符串长度对于C语言字符串来说可以通过 strlen() 函数获取字符串的长度。字符串的长度为指针指向首地址到首个字符串结束的空字符 \0 之间的字符数(不包括空字符)可通过遍历计数来实现。对于strlen函数其原型如下所示。// 函数声明 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的测试示例如下所示。#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() 函数进行字符串的拷贝复制。这两个函数的原型如下所示。// 函数声明 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的测试示例如下所示。#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() 函数进行字符串的比较。这两个函数的原型如下所示。// 函数声明 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函数具体示例如下所示。#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语言字符串来说支持如下字符串查找函数。这三个函数的原型如下所示。// 函数声明 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。关于字符串查找函数具体示例如下所示。#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()函数在字符串末尾拼接字符串。函数的原型如下所示。// 函数声明 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个字符避免缓冲区溢出的问题。关于字符串拼接函数具体示例如下所示。#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; }对于上述代码具体执行结果如下所示。
C语言常用字符串函数:长度、比较、拼接和查找
对于字符串来说支持通过在 头文件中的函数进行字符串的长度、复制、连接、比较、查找等操作。常见的字符串处理函数和功能列表。获取字符串长度对于C语言字符串来说可以通过 strlen() 函数获取字符串的长度。字符串的长度为指针指向首地址到首个字符串结束的空字符 \0 之间的字符数(不包括空字符)可通过遍历计数来实现。对于strlen函数其原型如下所示。// 函数声明 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的测试示例如下所示。#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() 函数进行字符串的拷贝复制。这两个函数的原型如下所示。// 函数声明 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的测试示例如下所示。#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() 函数进行字符串的比较。这两个函数的原型如下所示。// 函数声明 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函数具体示例如下所示。#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语言字符串来说支持如下字符串查找函数。这三个函数的原型如下所示。// 函数声明 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。关于字符串查找函数具体示例如下所示。#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()函数在字符串末尾拼接字符串。函数的原型如下所示。// 函数声明 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个字符避免缓冲区溢出的问题。关于字符串拼接函数具体示例如下所示。#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; }对于上述代码具体执行结果如下所示。