在日常写C程序时,处理字符串是家常便饭。比如读取用户输入的姓名、拼接文件路径、判断密码是否正确,都离不开对字符串的操作。C语言本身没有内置字符串类型,而是用字符数组来表示,这时候就得靠标准库里的字符串函数来帮忙。
\n\nstrcpy 和 strncpy:字符串复制
\n把一个字符串内容拷贝到另一个字符数组里,最常用的就是 strcpy。比如你有个缓冲区要存用户输入的名字,就可以这样复制:
#include <stdio.h>\n#include <string.h>\n\nint main() {\n char name[50];\n strcpy(name, \"小明\");\n printf(\"你好,%s\\n\", name);\n return 0;\n}\n\n但 strcpy 不检查目标空间大小,容易溢出。更安全的做法是用 strncpy,可以指定最多复制多少个字符。
strcat 和 strncat:字符串拼接
\n要把两个字符串连起来,比如生成日志信息或构造路径,可以用 strcat。假设你要把目录和文件名拼成完整路径:
char path[100] = \"/home/user/\";
strcat(path, \"config.txt\");
printf(\"路径:%s\\n\", path);\n\n同样地,strncat 能限制追加长度,避免数组越界。
strcmp 和 strncmp:字符串比较
\n判断两个字符串是否相等,不能用 ==,得用 strcmp。它返回0表示相同。比如验证密码:
if (strcmp(password, \"123456\") == 0) {\n printf(\"登录成功\\n\");\n} else {\n printf(\"密码错误\\n\");\n}\n\n如果只想比前几个字符,比如识别命令开头,strncmp 更合适。
strlen:获取字符串长度
\n想知道一个字符串有几个字符,用 strlen 最直接。比如限制用户名不能超过10个字符:
if (strlen(username) > 10) {\n printf(\"用户名太长\\n\");\n}\n\n注意它不包含末尾的 \\0。
\n\nstrstr:查找子串
\n在一个大字符串里找关键词,strstr 很实用。比如检查日志行是否包含“error”:
char *log = \"[ERROR] 打开文件失败\";\nif (strstr(log, \"ERROR\")) {\n printf(\"发现错误信息\\n\");\n}\n\n它返回第一次出现的地址,没找到就返回 NULL。
\n\nstrchr:查找单个字符
\n想找字符串中某个字符的位置,比如提取文件扩展名,可以用 strchr:
char *filename = \"report.pdf\";\nchar *dot = strchr(filename, '.');\nif (dot) {\n printf(\"扩展名:%s\\n\", dot + 1); // 输出 pdf\n}\n\n这些函数都在 <string.h> 头文件里,用之前记得包含。
实际编程中,光会用还不够,还得注意安全。像 strcpy、strcat 这类不检查边界的函数,在处理不可信输入时容易引发漏洞。建议优先使用带 n 限制的版本,或者用更现代的替代方案。