在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<s20: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




















