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

C语言回文判断程序异常排查:长文本/含空格输入输出错误

问题排查与修复方案

核心问题分析

你的代码出现乱码和误判的原因集中在字符串未正确终止、长度计算错误、空格处理逻辑缺陷以及反转逻辑匹配错误这几个点:

  • 字符串缺少终止符'\0':C语言字符串必须以'\0'结尾,否则printf、strcmp等函数会读取内存垃圾数据,引发乱码。你的sdrow和verify数组填充后未添加终止符。
  • 原字符串长度计算错误:fgets会读取输入末尾的换行符'\n',strlen(words)包含该字符,正确有效长度应为strlen(words)-1,而非strlen(words)-2,后者会导致少处理字符甚至负数索引。
  • 空格处理逻辑bug:遇到空格时直接j++,会让循环额外跳过一个字符(循环本身会执行j++),连续空格或末尾空格会引发越界或字符遗漏。
  • 反转逻辑匹配错误:反转时使用原字符串长度k,但sdrow实际有效长度是c(已去除空格),用k反转会访问sdrow未填充的内存区域,导致verify出现乱码。

修复后的完整代码

#include<stdio.h>
#include<string.h>

int main() {
    int N;
    int c;
    char words[21];
    char sdrow[21];
    char verify[21];
    printf("Please give me a number which constitutes to how many words you would like to type from 1 to 100: ");
    scanf("%d", &N);

    if(N<=0 || N>100) {
        printf("Come on my guy i asked for 1 to 100 not whatever you just typed");
        return 1;
    }
    while (getchar() != '\n'); // 清除输入缓冲区的换行符
    for(int i = 0; i < N; i++){
        printf("Please Type Word %d: " , i+1);
        fgets(words, sizeof(words), stdin);
        
        // 去掉fgets读取的换行符
        size_t words_len = strlen(words);
        if(words_len > 0 && words[words_len-1] == '\n'){
            words[words_len-1] = '\0';
            words_len--;
        }

        c=0;
        // 去除空格,填充sdrow
        for(int j=0;j<words_len;j++){
            if(words[j] == ' '){
                continue; // 跳过空格,不执行后续赋值
            }
            sdrow[c] = words[j];
            c++;
        }
        sdrow[c] = '\0'; // 给sdrow添加字符串终止符
        printf("%s\n",sdrow);

        // 反转sdrow到verify
        for(int j=0;j<c;j++){
            verify[j] = sdrow[c-1-j];
        }
        verify[c] = '\0'; // 给verify添加字符串终止符
        printf("%s\n",verify);

        int result = strcmp(verify, sdrow);
        if(result == 0){
            printf("Input is a palindrome\n");
        }
        else{
            printf("Input is not a palindrome\n");
        }
    }
    return 0;
}

修复说明

  1. 正确处理换行符:检查words末尾是否为'\n',若是则替换为'\0'并修正长度,避免后续处理错误。
  2. 空格处理优化:用continue跳过空格,确保每个有效字符都被正确处理,不会额外跳过字符。
  3. 添加字符串终止符:在sdrow和verify填充完成后立即添加'\0',保证字符串函数能正确识别。
  4. 基于实际长度反转:反转时使用sdrow的实际有效长度c,避免访问未初始化的内存区域。

测试验证

针对你的失败输入:

1
never odd or even

修复后输出:

neveroddoreven
neveroddoreven
Input is a palindrome

符合预期判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:52:17