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

C语言回文检测程序求助:大小写转换与特殊字符过滤失效

回文检测程序问题排查

我想要实现一款忽略空格与特殊字符、将字符串中所有大写字母转为小写的回文检测程序,目前已完成代码编写,但运行时发现大小写转换和特殊字符过滤这两个功能均无法正常工作。请帮忙排查问题所在。

原代码

#include<stdio.h>
#define SIZE 1000
#include <ctype.h>
#include<string.h>

// 检测回文的函数
int isPalindrome(char inputString[]) {
    int l = 0;
    int r = strlen(inputString) - 1;

    while (r > l) {
        if (inputString[l++] != inputString[r--]) {
            return 0;
        }
    }
    return 1;
}

// 过滤非字母字符的函数
int no_special_characters(char inputString[]) {
    char temp[SIZE];
    int temp_index = 0;
    int abc = 0;
    int r = strlen(inputString);
    for (int i = 0; i < r; i++) {
        char abc = inputString[i];
        if (isalpha(abc) != 0) {
            temp[temp_index++] = abc;
        }
    }
    temp[temp_index] = '\0';

    return isPalindrome(temp);
}

// 大小写转换函数(原逻辑错误)
void to_lower(char inputstring[]) {
    int length = strlen(inputstring);

    for (int i = 0; i < length; i++) {
        if (isupper(inputstring[i]))
            inputstring[i] = tolower(inputstring[i]);
        else if (islower(inputstring[i]))
            inputstring[i] = toupper(inputstring[i]);
    }

    return 0;
}

int main(void) {
    int try_again = 1;
    int end_run = 0;

    while (try_again == 1) {
        int try_again;

        char inputString[SIZE] = "";

        printf("Enter a string to check if it is a palindrome!\n");
        scanf_s("%s", &inputString, SIZE);

        if (isPalindrome(inputString)) {
            printf("That is a palindrome!\n");
        } else {
            printf("This is not a palindrome!\n");
        }

        printf("Do you want to try again: 1 for yes 0 for No?");
        scanf_s("%d", &try_again);

        if (try_again != 1) {
            end_run = 0;
        }
    }

    return 0;
}

问题排查与修复方案

1. 核心功能完全未被调用

主函数main直接调用了最基础的isPalindrome函数,但完全没执行你写的no_special_characters(过滤特殊字符)和to_lower(大小写转换)函数,等于这两个功能根本没启用。

2. to_lower函数逻辑彻底错误

  • 函数目标是把所有大写转小写,但代码中小写字母被错误转为大写,完全违背需求;
  • 函数声明为void类型,却使用return 0;返回值,属于语法错误。

修正后的to_lower(也可以直接整合到过滤函数中,避免冗余):

void to_lower(char inputstring[]) {
    int length = strlen(inputstring);
    for (int i = 0; i < length; i++) {
        // 统一转为小写,无需判断原字符大小写
        inputstring[i] = tolower(inputstring[i]);
    }
}

3. 输入读取方式无法处理空格

scanf_s("%s", ...)会在空格处截断输入,无法读取像A man a plan a canal Panama这类带空格的典型回文,必须改用fgets读取整行输入:

// 替换原scanf_s读取字符串的代码
fgets(inputString, SIZE, stdin);
// 去掉fgets自动读取的换行符
size_t len = strlen(inputString);
if (len > 0 && inputString[len-1] == '\n') {
    inputString[len-1] = '\0';
}

4. 过滤特殊字符时未处理大小写

no_special_characters函数只过滤了非字母,但没有统一转换大小写,导致大小写不同的字母会被判定为不相等。需要在过滤时同时转小写:

修正后的no_special_characters:

int no_special_characters(char inputString[]) {
    char temp[SIZE];
    int temp_index = 0;
    int len = strlen(inputString);
    for (int i = 0; i < len; i++) {
        char c = inputString[i];
        if (isalpha(c)) {
            // 过滤同时转为小写
            temp[temp_index++] = tolower(c);
        }
    }
    temp[temp_index] = '\0';
    return isPalindrome(temp);
}

5. 主函数变量作用域与逻辑错误

原代码中循环内重新定义了try_again变量,导致外层循环的变量无法被正确更新;同时读取整数前需要清理输入缓冲区的换行符,避免读取错误。

修复后完整代码

#include<stdio.h>
#define SIZE 1000
#include <ctype.h>
#include<string.h>

// 基础回文检测函数
int isPalindrome(char inputString[]) {
    int l = 0;
    int r = strlen(inputString) - 1;

    while (r > l) {
        if (inputString[l++] != inputString[r--]) {
            return 0;
        }
    }
    return 1;
}

// 整合过滤+大小写转换的函数
int processAndCheckPalindrome(char inputString[]) {
    char temp[SIZE];
    int temp_index = 0;
    int len = strlen(inputString);
    for (int i = 0; i < len; i++) {
        char c = inputString[i];
        // 只保留字母并统一转小写
        if (isalpha(c)) {
            temp[temp_index++] = tolower(c);
        }
    }
    temp[temp_index] = '\0';
    return isPalindrome(temp);
}

int main(void) {
    int try_again = 1;

    while (try_again == 1) {
        char inputString[SIZE] = "";

        printf("Enter a string to check if it is a palindrome!\n");
        // 读取整行输入
        fgets(inputString, SIZE, stdin);
        size_t len = strlen(inputString);
        if (len > 0 && inputString[len-1] == '\n') {
            inputString[len-1] = '\0';
        }

        // 调用整合后的检测函数
        if (processAndCheckPalindrome(inputString)) {
            printf("That is a palindrome!\n");
        } else {
            printf("This is not a palindrome!\n");
        }

        printf("Do you want to try again: 1 for yes 0 for No? ");
        // 清理输入缓冲区的换行符
        while (getchar() != '\n');
        scanf_s("%d", &try_again);
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者badprogrammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:05:55