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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:05:20