C语言回文判断代码输出异常:输入seles却判定为非回文
问题分析与解决
错误根源
你代码里的核心问题是用==比较字符串内容:
b == a比较的是两个字符数组的内存首地址,而非字符串的实际内容。a和b是两个独立的数组,内存地址必然不同,所以不管字符串内容是否一致,这个判断都会返回假,导致输出"not palindrome"。- 额外隐患:
fgets会读取输入末尾的换行符\n,这会导致反转后的字符串开头多一个换行符,比如输入"seles"后,a实际存储的是"seles\n",反转后变成"\nseles",即使修正了比较逻辑,也会因为换行符的存在判断错误。
修正方案
- 用
strcmp函数比较字符串内容:string.h库提供的strcmp函数会逐字符对比两个字符串,当内容完全相同时返回0,这才是正确的字符串比较方式。 - 去除换行符:在使用
fgets读取字符串后,手动截断末尾的换行符,避免干扰回文判断。可以用strcspn函数快速完成这个操作。
修正后的完整代码
#include <stdio.h> #include <string.h> int main() { char a[40],b[40]; printf("character input: "); fgets(a, sizeof(a), stdin); // 截断fgets读取的换行符 a[strcspn(a, "\n")] = '\0'; strcpy(b, a); strrev(a); printf("%s\n", a); printf("%s\n", b); // 用strcmp比较字符串内容 if (strcmp(b, a) == 0) printf("palindrome"); else printf("not palindrome"); }
测试验证
输入seles后,程序输出:
seles seles palindrome
符合预期判断结果。
内容的提问来源于stack exchange,提问作者grant
相关产品推荐
相关产品推荐

