strcmp按ASCII码逐字符比较字典序,非数值大小;必须传入以'\0'结尾的合法C字符串,否则越界读导致未定义行为;不支持std::string,需用c_str()转换。

strcmp 比较的是字典序,不是数值大小
直接用 strcmp 比较两个 C 风格字符串(即以 '\0' 结尾的 char 数组),返回值是整数:负数表示第一个字符串“小于”第二个,0 表示相等,正数表示“大于”。这个“大小”是按 ASCII 码逐字符比较的字典序,不是把整个数组当数字来比。比如 "10" 和 "2",strcmp("10", "2") 返回负数(因为 '1' 的 ASCII 是 49,'2' 是 50),但数值上 10 > 2。
必须确保传入的是合法的空终止字符串
strcmp 会一直读到遇到第一个 '\0' 才停,如果传进去的 char 数组没正确以 '\0' 结尾,就会越界读内存,导致未定义行为——常见表现是程序崩溃、随机结果或看似正常但实际不可靠。
- 错误写法:
char a[3] = {'a', 'b', 'c'};—— 没有'\0',strcmp(a, "ab")危险 - 正确写法:
char a[] = "abc";或char a[4] = {'a','b','c','\0'}; - 若从其他地方拷贝数据,记得手动补
'\0',比如用strncpy后要加a[n] = '\0';
不能直接比较非空终止的字符数组或 std::string
strcmp 只接受 const char* 类型参数,对以下情况会出错:
- 传入未以
'\0'结尾的char数组 → 越界读 - 传入
std::string对象(如s1)→ 编译失败,需改用s1.c_str() - 传入局部数组但长度不足,比如
char buf[5]; strcpy(buf, "hello");→ 缓冲区溢出,buf不再安全
示例:std::string s1 = "test", s2 = "team"; if (strcmp(s1.c_str(), s2.c_str())
立即学习“C++免费学习笔记(深入)”;
替代方案:C++ 中更安全的比较方式
纯 C++ 项目里,优先用 std::string 自带的 operator<、== 等,它们不依赖空终止,也避免手动管理内存;若必须处理 C 风格字符串,可考虑 std::string_view(C++17 起)配合 compare() 方法,零拷贝且边界安全。
容易被忽略的一点:即使你只写 strcmp(a, b),也要确认 a 和 b 都指向有效、已初始化、以 '\0' 结尾的内存区域——这个前提不满足时,函数行为完全不可预测,调试起来往往和问题源头隔得很远。


















