在编写C语言程序时,经常会遇到需要判断两个ref="/tag/255/" style="color:#874873;font-weight:bold;">字符串是否相同的情况。比如用户登录时输入的密码和系统中存储的密码比对,或者配置文件中的选项匹配。这时候,strcmp这个库函数就派上用场了。
strcmp 是做什么的?
strcmp是C标准库
它的函数原型是:
int strcmp(const char *str1, const char *str2);
返回值有三种情况:
- 返回0:表示两个字符串完全相同;
- 返回大于0:表示第一个字符串在字典序上更大;
- 返回小于0:表示第一个字符串在字典序上更小。
实际使用示例
假设我们要验证用户输入的命令是不是"exit",可以这样写:
#include <stdio.h>\n#include <string.h>\n\nint main() {\n char input[10];\n printf("请输入命令:");\n scanf("%s", input);\n\n if (strcmp(input, "exit") == 0) {\n printf("正在退出程序...\n");\n } else {\n printf("未知命令\n");\n }\n return 0;\n}
这里只有当输入的字符串和"exit"完全一致时,strcmp才会返回0,程序才会执行退出逻辑。
常见误区提醒
很多人误以为strcmp能直接用于安全敏感的场景,比如密码校验。但实际上,它存在时间侧信道风险——如果两个字符串前面匹配得越久,函数运行时间就越长,攻击者可能通过计时攻击推测出正确密码的部分字符。
另外,strcmp区分大小写。输入"Exit"和"exit"会被视为不同字符串。如果需要忽略大小写,应该使用strcasecmp(在Linux/Unix系统中)或自己实现不区分大小写的比较逻辑。
还有一点要注意:传给strcmp的指针不能是NULL,否则程序会崩溃。在调用前最好先判断一下指针是否有效。
和 == 比较有什么区别?
有些人刚学C语言时会犯一个错误:用==直接比较两个字符串变量。其实那只是比较了它们的地址,而不是内容。比如下面这段代码:
char a[] = "hello";\nchar b[] = "hello";\nif (a == b) { // 这个条件永远不会成立\n printf("相等\n");\n}
即使内容一样,a和b是两个不同的数组,地址不同,所以==比较结果为假。必须用strcmp才能真正比较内容。