C++ strcmp()无法匹配"university"字符串问题及替代方案咨询
故障根因
你遇到的判断错误是输入缓冲区长度不足导致C字符串结束符丢失引发的:
- 先数目标单词
university的字符数:u、n、i、v、e、r、s、i、t、y,一共10个可见字符。C语言风格的字符串要求末尾必须存一个值为\0的结束符,才能被strcmp这类字符串函数正确识别长度,因此存下这个单词总共需要11字节的连续空间。 - 你代码里定义的接收用户输入的数组长度只有10:
当你输入完整的char newword[20], guess[10];university时,10个可见字符刚好占满guess数组的全部位置,没有多余空间存放末尾的\0结束符。 strcmp的比较逻辑是从两个字符串的起始地址开始逐字符对比,直到碰到任意一个字符串的\0才会停止。因为guess没有正确的结束符,函数会继续读取数组后方内存里的随机垃圾值参与对比,自然和存储正确、带结束符的目标单词不相等。
你把目标单词改成universit(共9个可见字符)时,9个字符加1个结束符刚好占满10字节的guess数组,字符串格式合法,所以判断能正常通过。
额外提两个你代码里的其他小问题:
- 存储词库的二维数组
char word[20][20]每个元素分配了20字节,存university是足够的,问题和词库定义无关。 - 你把
srand(time(0));写在了游戏循环内部,如果玩家操作速度快,1秒内选择重开游戏,会因为时间种子相同随机到同一个单词,建议把这句挪到main函数开头、循环外面。
strcmp()的替代方案
- 最推荐的C++原生方案:弃用C风格char数组,改用
<string>头文件下的std::string类型存储单词和用户输入。这种方式不需要手动管理数组长度、不需要关心结束符,直接用==运算符就能完成字符串相等判断,能从根源上避免缓冲区溢出、结束符丢失这类C字符串的常见bug。 - 保留C风格char数组的安全比较方案:用
strncmp()替代strcmp,调用时手动传入最大比较长度,避免函数越界读取内存。注意用这个方案依然需要给输入缓冲区分配足够长度,且预留1字节存结束符。 - 输入阶段兜底方案:读入用户输入时用
cin.getline()指定最大读入字符数,从输入环节就阻止超长内容写入缓冲区,再配合strcmp比较即可正常工作。
内容的提问来源于stack exchange,提问作者Tanmoy Sarkar
相关产品推荐
相关产品推荐

