C语言回文检测程序:如何高效忽略非字母字符与处理大小写?
C语言实现忽略非字母字符与大小写的回文检测程序
核心实现思路
- 采用双指针法遍历字符串,一端从头部、一端从尾部向中间靠拢,无需额外创建处理后的字符串,空间效率更高
- 用标准库函数快速处理字符:
isalpha()判断字符是否为字母,跳过所有非字母的空格、标点、特殊字符tolower()将所有字母统一转为小写,消除大小写差异后再比较
完整可运行代码
#include <stdio.h> #include <ctype.h> #include <string.h> int isPalindrome(const char *str) { int left = 0; int right = strlen(str) - 1; while (left < right) { // 跳过左侧非字母字符 while (left < right && !isalpha(str[left])) { left++; } // 跳过右侧非字母字符 while (left < right && !isalpha(str[right])) { right--; } // 转小写后比较字符是否相等 if (tolower(str[left]) != tolower(str[right])) { return 0; // 不匹配,不是回文 } left++; right--; } return 1; // 所有有效字符匹配,是回文 } int main() { char input[1000]; printf("请输入字符串:"); fgets(input, sizeof(input), stdin); // 移除fgets自动读取的换行符 input[strcspn(input, "\n")] = '\0'; if (isPalindrome(input)) { printf("该字符串是回文\n"); } else { printf("该字符串不是回文\n"); } return 0; }
代码细节说明
- 字符过滤与转换:
<ctype.h>头文件提供的isalpha()和tolower()是标准库的高效实现,比手动判断ASCII范围更简洁且可移植- 双指针在移动时,只要遇到非字母字符就直接跳过,直到找到下一个有效字母或指针相遇
- 边界处理:
- 如果输入字符串全是非字母字符(比如"!!!@@@###"),程序会判定为回文,这符合逻辑——没有需要比较的有效字符,自然满足回文定义
strcspn()用来精准去除fgets读取到的换行符,避免换行符干扰后续判断
- 测试验证:
- 输入
A man, a plan, a canal, Panama!→ 输出该字符串是回文 - 输入
Hello, World!→ 输出该字符串不是回文
- 输入
内容的提问来源于stack exchange,提问作者Luis angel Araiza Suárez
相关产品推荐
相关产品推荐

