如何修改C语言回文检测代码以忽略非字母数字字符
回文检测代码修改方案
核心问题分析
原代码直接对比原字符串的首尾字符,既没有跳过非字母数字的字符(空格、标点等),也没有统一字符大小写,导致这类干扰字符会破坏回文检测逻辑,同时大小写差异也会造成误判,比如Rise to vote sir!中的空格、感叹号以及大小写差异都会让原代码认为不是回文。
具体修改点
- 预处理输入字符串:遍历原输入,仅保留字母和数字字符,并统一转为小写(或大写),存入单独的过滤后数组。
- 调整回文检测逻辑:基于过滤后的有效字符数组进行首尾对比,不再处理原字符串中的无效字符。
- 优化退出条件:基于过滤后的字符判断是否为"END",避免输入带空格或标点的"END"时无法正常退出。
修改后的完整代码
/* 回文检测程序(支持忽略标点、空格,统一大小写)*/ #include <stdio.h> #include <ctype.h> #define EOL '\n' #define TRUE 1 #define FALSE 0 #define MAX_LEN 80 int main() { int loop = TRUE; char original[80]; char filtered[MAX_LEN]; int filter_idx, count, countback, flag; /* 主循环 */ while (loop) { flag = TRUE; filter_idx = 0; /* 读取输入 */ printf("\n请输入单词、短语或句子:\n"); for (count = 0; (original[count] = getchar()) != EOL; ++count) ; /* 过滤并转换有效字符:保留字母数字,统一转为小写 */ for (count = 0; original[count] != EOL; ++count) { if (isalnum((unsigned char)original[count])) { filtered[filter_idx++] = tolower((unsigned char)original[count]); } } filtered[filter_idx] = '\0'; // 添加字符串结束符 /* 检测退出指令:过滤后的字符为"end"时退出 */ if (filter_idx == 3 && filtered[0] == 'e' && filtered[1] == 'n' && filtered[2] == 'd') { break; } /* 处理空输入情况 */ if (filter_idx == 0) { printf("输入内容为空,请重新输入。\n\n"); continue; } /* 回文检测逻辑 */ for (count = 0, countback = filter_idx - 1; count < countback; ++count, --countback) { if (filtered[count] != filtered[countback]) { flag = FALSE; break; } } /* 输出结果 */ for (count = 0; original[count] != EOL; ++count) putchar(original[count]); if (flag) printf(" --> 是回文!\n\n"); else printf(" --> 不是回文。\n\n"); } return 0; }
修改细节说明
isalnum函数:用于判断字符是否为字母或数字,自动跳过空格、逗号、感叹号等无效字符。tolower函数:将所有有效字符转为小写,消除大小写差异带来的误判(比如'R'和'r'会被视为相同字符)。- 过滤后数组:单独存储有效字符,回文检测仅针对该数组执行,彻底排除无效字符的干扰。
- 退出逻辑优化:基于过滤后的字符判断是否为"end",即使输入
END!这类带干扰字符的指令,也能正确识别并退出程序。
内容的提问来源于stack exchange,提问作者Sennacheribest
相关产品推荐
相关产品推荐

