C语言回文判断程序异常排查:长文本/含空格输入输出错误
问题排查与修复方案
核心问题分析
你的代码出现乱码和误判的原因集中在字符串未正确终止、长度计算错误、空格处理逻辑缺陷以及反转逻辑匹配错误这几个点:
- 字符串缺少终止符
'\0':C语言字符串必须以'\0'结尾,否则printf、strcmp等函数会读取内存垃圾数据,引发乱码。你的sdrow和verify数组填充后未添加终止符。 - 原字符串长度计算错误:
fgets会读取输入末尾的换行符'\n',strlen(words)包含该字符,正确有效长度应为strlen(words)-1,而非strlen(words)-2,后者会导致少处理字符甚至负数索引。 - 空格处理逻辑bug:遇到空格时直接
j++,会让循环额外跳过一个字符(循环本身会执行j++),连续空格或末尾空格会引发越界或字符遗漏。 - 反转逻辑匹配错误:反转时使用原字符串长度
k,但sdrow实际有效长度是c(已去除空格),用k反转会访问sdrow未填充的内存区域,导致verify出现乱码。
修复后的完整代码
#include<stdio.h> #include<string.h> int main() { int N; int c; char words[21]; char sdrow[21]; char verify[21]; printf("Please give me a number which constitutes to how many words you would like to type from 1 to 100: "); scanf("%d", &N); if(N<=0 || N>100) { printf("Come on my guy i asked for 1 to 100 not whatever you just typed"); return 1; } while (getchar() != '\n'); // 清除输入缓冲区的换行符 for(int i = 0; i < N; i++){ printf("Please Type Word %d: " , i+1); fgets(words, sizeof(words), stdin); // 去掉fgets读取的换行符 size_t words_len = strlen(words); if(words_len > 0 && words[words_len-1] == '\n'){ words[words_len-1] = '\0'; words_len--; } c=0; // 去除空格,填充sdrow for(int j=0;j<words_len;j++){ if(words[j] == ' '){ continue; // 跳过空格,不执行后续赋值 } sdrow[c] = words[j]; c++; } sdrow[c] = '\0'; // 给sdrow添加字符串终止符 printf("%s\n",sdrow); // 反转sdrow到verify for(int j=0;j<c;j++){ verify[j] = sdrow[c-1-j]; } verify[c] = '\0'; // 给verify添加字符串终止符 printf("%s\n",verify); int result = strcmp(verify, sdrow); if(result == 0){ printf("Input is a palindrome\n"); } else{ printf("Input is not a palindrome\n"); } } return 0; }
修复说明
- 正确处理换行符:检查
words末尾是否为'\n',若是则替换为'\0'并修正长度,避免后续处理错误。 - 空格处理优化:用
continue跳过空格,确保每个有效字符都被正确处理,不会额外跳过字符。 - 添加字符串终止符:在
sdrow和verify填充完成后立即添加'\0',保证字符串函数能正确识别。 - 基于实际长度反转:反转时使用
sdrow的实际有效长度c,避免访问未初始化的内存区域。
测试验证
针对你的失败输入:
1 never odd or even
修复后输出:
neveroddoreven neveroddoreven Input is a palindrome
符合预期判断。
内容的提问来源于stack exchange,提问作者IaMaPsYcHo
相关产品推荐
相关产品推荐

