在C语言中,字符串以字符数组形式存在,以\0
(空字符)结尾。标准库<string.h>
提供了丰富的字符串操作函数,掌握这些函数是C语言编程的基础。本文ZHANID工具网将详细讲解常用字符串操作函数的使用方法及注意事项,并附上完整示例代码。
一、字符串基础操作函数
1. 计算字符串长度:strlen()
函数原型:
size_t strlen(const char *str);
功能:返回字符串的实际长度(不包含结尾的\0
)。
示例:
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello, World!"; printf("Length: %zu\n", strlen(str)); // 输出 13 return 0; }
2. 字符串复制:strcpy()
和 strncpy()
函数原型:
char *strcpy(char *dest, const char *src); char *strncpy(char *dest, const char *src, size_t n);
功能:将源字符串src
复制到目标数组dest
。
区别:
strcpy
:复制直到遇到\0
,不检查目标缓冲区大小(可能溢出)。strncpy
:最多复制n
个字符,若src
长度不足n
,剩余空间填充\0
。
示例:
#include <stdio.h> #include <string.h> int main() { char src[] = "Hello"; char dest[10]; // 安全复制:确保目标缓冲区足够大 strcpy(dest, src); printf("strcpy: %s\n", dest); // 输出 Hello // 限制复制长度 strncpy(dest, src, 3); dest[3] = '\0'; // 手动添加结束符(strncpy不保证自动添加) printf("strncpy: %s\n", dest); // 输出 Hel return 0; }
3. 字符串连接:strcat()
和 strncat()
函数原型:
char *strcat(char *dest, const char *src); char *strncat(char *dest, const char *src, size_t n);
功能:将src
追加到dest
末尾。
区别:
strcat
:不检查目标缓冲区大小(可能溢出)。strncat
:最多追加n
个字符,并确保结果以\0
结尾。
示例:
#include <stdio.h> #include <string.h> int main() { char dest[20] = "Hello"; char src[] = ", World!"; strcat(dest, src); printf("strcat: %s\n", dest); // 输出 Hello, World! strncat(dest, "!!!", 2); printf("strncat: %s\n", dest); // 输出 Hello, World!! return 0; }
二、字符串比较函数
1. 字典序比较:strcmp()
和 strncmp()
函数原型:
int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n);
返回值:
<0
:s1
<s2
0
:s1
==s2
>0
:s1
>s2
示例:
#include <stdio.h> #include <string.h> int main() { char s1[] = "apple"; char s2[] = "apples"; printf("strcmp: %d\n", strcmp(s1, s2)); // 输出负数(s1 < s2) printf("strncmp: %d\n", strncmp(s1, s2, 5)); // 输出0(前5个字符相同) return 0; }
三、字符串查找函数
1. 查找字符:strchr()
和 strrchr()
函数原型:
char *strchr(const char *str, int c); char *strrchr(const char *str, int c);
功能:
strchr
:从左到右查找字符c
首次出现的位置。strrchr
:从右到左查找字符c
最后一次出现的位置。
示例:
#include <stdio.h> #include <string.h> int main() { char str[] = "hello@example.com"; char *pos = strchr(str, '@'); if (pos) { printf("First '@' at: %s\n", pos); // 输出 @example.com } pos = strrchr(str, 'e'); if (pos) { printf("Last 'e' at: %s\n", pos); // 输出 example.com } return 0; }
2. 查找子串:strstr()
函数原型:
char *strstr(const char *haystack, const char *needle);
功能:在haystack
中查找子串needle
首次出现的位置。
示例:
#include <stdio.h> #include <string.h> int main() { char text[] = "C programming is fun"; char *sub = strstr(text, "pro"); if (sub) { printf("Substring found: %s\n", sub); // 输出 programming is fun } return 0; }
四、内存操作相关函数
1. 内存复制:memcpy()
函数原型:
void *memcpy(void *dest, const void *src, size_t n);
功能:复制n
字节内存(不依赖\0
,需确保目标缓冲区足够大)。
示例:
#include <stdio.h> #include <string.h> int main() { char src[] = "Hello"; char dest[10]; memcpy(dest, src, strlen(src) + 1); // 包含结尾的\0 printf("memcpy: %s\n", dest); // 输出 Hello return 0; }
2. 内存清零:memset()
函数原型:
void *memset(void *s, int c, size_t n);
功能:将内存的前n
字节设置为字符c
。
示例:
#include <stdio.h> #include <string.h> int main() { char buf[10]; memset(buf, '*', sizeof(buf)); buf[9] = '\0'; // 手动添加结束符 printf("memset: %s\n", buf); // 输出 ********* return 0; }
五、格式化输入/输出函数
1. 格式化字符串:sprintf()
函数原型:
int sprintf(char *str, const char *format, ...);
功能:将格式化数据写入字符串。
示例:
#include <stdio.h> int main() { char buf[20]; int num = 42; sprintf(buf, "Number: %d", num); printf("sprintf: %s\n", buf); // 输出 Number: 42 return 0; }
2. 从字符串解析数据:sscanf()
函数原型:
int sscanf(const char *str, const char *format, ...);
功能:从字符串中读取格式化数据。
示例:
#include <stdio.h> int main() { char str[] = "Alice 25"; char name[20]; int age; sscanf(str, "%s %d", name, &age); printf("sscanf: Name=%s, Age=%d\n", name, age); // 输出 Name=Alice, Age=25 return 0; }
六、安全编程建议
缓冲区溢出防护:
优先使用带
n
的函数(如strncpy
、strncat
)。确保目标缓冲区足够大,或使用动态内存分配。
字符串结尾符:
手动操作字符串时,确保以
\0
结尾。避免修改字符串字面量:
char *str = "immutable"; // 错误:尝试修改会导致未定义行为 char str[] = "mutable"; // 正确:可修改的副本
七、完整示例代码
#include <stdio.h> #include <string.h> int main() { // 字符串复制与连接 char src[] = "Hello"; char dest[20] = "World"; strncpy(dest, src, strlen(src)); // 安全复制 strncat(dest, "!", 1); // 追加! printf("Result: %s\n", dest); // 输出 Hello! // 字符串查找 char *pos = strchr(dest, '!'); if (pos) { printf("Found '!' at: %s\n", pos); // 输出 ! } // 内存操作 char buf[10]; memset(buf, 'A', sizeof(buf)); buf[9] = '\0'; printf("Memory: %s\n", buf); // 输出 AAAAAAAAA return 0; }
八、总结
C语言字符串操作的核心是理解字符数组和空字符\0
的终止机制。通过合理使用标准库函数,可以高效安全地处理字符串。但需特别注意缓冲区溢出问题,优先选择带长度限制的函数(如strncpy
),并在必要时手动添加结束符。掌握这些技巧将显著提升代码的健壮性。
本文由@战地网 原创发布。
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/4615.html