You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

代码细节说明

  1. 字符过滤与转换:
    • <ctype.h> 头文件提供的isalpha()和tolower()是标准库的高效实现,比手动判断ASCII范围更简洁且可移植
    • 双指针在移动时,只要遇到非字母字符就直接跳过,直到找到下一个有效字母或指针相遇
  2. 边界处理:
    • 如果输入字符串全是非字母字符(比如"!!!@@@###"),程序会判定为回文,这符合逻辑——没有需要比较的有效字符,自然满足回文定义
    • strcspn() 用来精准去除fgets读取到的换行符,避免换行符干扰后续判断
  3. 测试验证:
    • 输入A man, a plan, a canal, Panama! → 输出该字符串是回文
    • 输入Hello, World! → 输出该字符串不是回文

内容的提问来源于stack exchange,提问作者Luis angel Araiza Suárez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:21:01