_stricmp字符串比较不符合预期,请求技术排查
问题分析与解决办法
哦,这个坑我刚学C的时候也踩过!问题的核心在于**fgets()会把输入末尾的换行符\n也一并读取到字符串里**,而你定义的test数组里只有"boy"(末尾是字符串结束符\0),两者内容不一致,所以_stricmp自然会返回非0值,判断为不相等。
举个具体的例子:当你输入boy然后按下回车键,test2数组里实际存储的内容是:'b' 'o' 'y' '\n' '\0',而test里是'b' 'o' 'y' '\0'——多出来的那个\n就是导致比较失败的罪魁祸首。
解决方法:去掉换行符
最简单且安全的方式是用strcspn()函数直接截断换行符,这个方法不管输入时有没有换行符(比如输入长度刚好填满缓冲区的情况)都能正常工作:
#include <stdio.h> #include <string.h> int main() { char test[] = "boy"; char test2[20]; fgets(test2, 20, stdin); // 关键:用strcspn找到换行符的位置,替换为字符串结束符 test2[strcspn(test2, "\n")] = '\0'; if (_stricmp(test2, test) == 0) { printf("the same"); } else { printf("Not"); } return 0; }
你也可以用另一种方式手动处理换行符,比如遍历字符串找到'\n'然后替换成'\0',但strcspn的写法更简洁高效。
另外补充一点:_stricmp是不区分大小写的字符串比较函数,所以输入Boy、BOY这类变体也能和test匹配,这部分是正常的,不用修改。
内容的提问来源于stack exchange,提问作者Xozu
相关产品推荐
相关产品推荐

