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

C语言回文判断函数仅对代码内字符串生效,输入流字符串失效求助

问题分析与解决方案

核心问题1:指针未初始化

你的isPalindrome函数里的front指针从未赋值,属于野指针,指向内存中随机位置,程序行为完全不可预测——对input2有效只是巧合的未定义行为结果。

修复方法:在函数开头给front赋值为传入的字符串指针:

int isPalindrome(char* string) {
    char *end, *front = string; // 初始化front指向字符串开头
    // ... 后续代码不变
}

核心问题2:fgets读取的字符串包含换行符

fgets会把用户输入时按下的Enter键(即\n字符)也读进字符串。比如输入anna,input实际存储的是"anna\n\0",末尾的\n和开头的a不匹配,导致回文判断失败。

解决换行符的两种方法:

  1. 手动遍历替换:
    fgets(input, 1000, stdin);
    // 找到换行符并替换为结束符
    for (int i = 0; input[i] != '\0'; i++) {
        if (input[i] == '\n') {
            input[i] = '\0';
            break;
        }
    }
    
  2. 用strcspn函数(需包含<string.h>头文件):
    #include <string.h>
    
    fgets(input, 1000, stdin);
    input[strcspn(input, "\n")] = '\0'; // 直接替换换行符为\0
    

修复后的完整代码

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

int isPalindrome(char* string) {
    char *end, *front = string; // 初始化front指针
 
    end = string;
    while (*end != '\0') {
        ++end;
    }
    --end;
 
    while (end >= front) {
        if (*end == *front) {
            --end;
            front++;
        } else {
            break;
        }
    }
 
    if (front > end) {
        printf("string is palindrome\n");
        return 1;
    } else {
        printf("string isnt palindrome\n");
        return 0;
    }
}

int main() {
    char input[1000];
    char input2[1000] = "anna";

    printf("Enter a string:\n");

    fgets(input, 1000, stdin);
    input[strcspn(input, "\n")] = '\0'; // 移除换行符

    printf("%s\n", input);

    isPalindrome(input);
    isPalindrome(input2);
}

额外说明

  • 若用scanf读取字符串,它会自动忽略开头空白,读到空格/换行停止,适合读取无空格的单单词字符串,需限制长度避免溢出:scanf("%999s", input);,这种情况无需处理换行符,但无法读取带空格的字符串。
  • 若需要忽略大小写或非字母字符的回文判断,可后续添加对应逻辑,当前先保证基础功能正常。

内容的提问来源于stack exchange,提问作者Oliver-René Goltsche

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:10:33