C语言回文判断函数仅对代码内字符串生效,输入流字符串失效求助
问题分析与解决方案
核心问题1:指针未初始化
你的isPalindrome函数里的front指针从未赋值,属于野指针,指向内存中随机位置,程序行为完全不可预测——对input2有效只是巧合的未定义行为结果。
修复方法:在函数开头给front赋值为传入的字符串指针:
int isPalindrome(char* string) { char *end, *front = string; // 初始化front指向字符串开头 // ... 后续代码不变 }
核心问题2:fgets读取的字符串包含换行符
fgets会把用户输入时按下的Enter键(即\n字符)也读进字符串。比如输入anna,input实际存储的是"anna\n\0",末尾的\n和开头的a不匹配,导致回文判断失败。
解决换行符的两种方法:
- 手动遍历替换:
fgets(input, 1000, stdin); // 找到换行符并替换为结束符 for (int i = 0; input[i] != '\0'; i++) { if (input[i] == '\n') { input[i] = '\0'; break; } } - 用
strcspn函数(需包含<string.h>头文件):#include <string.h> fgets(input, 1000, stdin); input[strcspn(input, "\n")] = '\0'; // 直接替换换行符为\0
修复后的完整代码
#include <stdio.h> #include <string.h> int isPalindrome(char* string) { char *end, *front = string; // 初始化front指针 end = string; while (*end != '\0') { ++end; } --end; while (end >= front) { if (*end == *front) { --end; front++; } else { break; } } if (front > end) { printf("string is palindrome\n"); return 1; } else { printf("string isnt palindrome\n"); return 0; } } int main() { char input[1000]; char input2[1000] = "anna"; printf("Enter a string:\n"); fgets(input, 1000, stdin); input[strcspn(input, "\n")] = '\0'; // 移除换行符 printf("%s\n", input); isPalindrome(input); isPalindrome(input2); }
额外说明
- 若用
scanf读取字符串,它会自动忽略开头空白,读到空格/换行停止,适合读取无空格的单单词字符串,需限制长度避免溢出:scanf("%999s", input);,这种情况无需处理换行符,但无法读取带空格的字符串。 - 若需要忽略大小写或非字母字符的回文判断,可后续添加对应逻辑,当前先保证基础功能正常。
内容的提问来源于stack exchange,提问作者Oliver-René Goltsche
相关产品推荐
相关产品推荐

