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

使用fgets去除尾随换行符:回文检测程序异常问题求助

解决回文判断中尾随换行符的问题

嘿,我一眼就瞅出问题啦——最后那个单词带的\n(换行符)直接搞砸了你的回文判断!因为strlen()会把这个换行符算进字符串长度里,对比的时候最后一位是\n,和首字母肯定不匹配,自然判定不是回文。下面给你一步步捋清楚解决方案:

核心问题拆解

你的文件末尾的radar后面跟着换行符,当你读取内容时,这个换行符会被一起读进字符串里。比如实际读到的最后一个单词是radar\n,strlen算出来长度是6,对比时str[0] = 'r',str[5] = '\n',直接就判定不相等了。

针对性解决方案

1. 读取后手动摘除换行符

不管你用fgets还是其他方式读字符串,读完后检查最后一个字符是不是\n,是的话就把它替换成字符串结束符\0:

// 假设用fgets读取了一整行到buffer里
char buffer[100];
fgets(buffer, sizeof(buffer), fp);
int len = strlen(buffer);
if (len > 0 && buffer[len - 1] == '\n') {
    buffer[len - 1] = '\0';
}

2. 用scanf读单词(自动跳过空白符)

如果是逐个读取单词,scanf("%s", str)会自动跳过所有空白字符(空格、换行、制表符都算),根本不会把换行符读进单词里,省心又好用:

char word[50];
while (scanf("%s", word) != EOF) {
    palindrome(word);
}

3. 额外优化:忽略大小写判断回文

你的输入里有leVel这种大小写混合的回文,原代码直接对比字符会误判,建议统一转成小写(或大写)后再对比:

#include <ctype.h> // 要包含这个头文件才能用tolower
void palindrome(char str[]){
    int length = strlen(str);
    int i = 0;
    int j = length - 1;
    while (i < j) { // 用while循环更高效,不用遍历整个长度
        char left = tolower(str[i]);
        char right = tolower(str[j]);
        if (left != right) {
            printf("String %s is not a palindrome.\n", str);
            return;
        }
        i++;
        j--;
    }
    printf("String %s is a palindrome.\n", str);
}

完整可运行代码

把这些点整合起来,完整代码如下:

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

void palindrome(char str[]){
    int length = strlen(str);
    int i = 0;
    int j = length - 1;
    while (i < j) {
        char left = tolower(str[i]);
        char right = tolower(str[j]);
        if (left != right) {
            printf("String %s is not a palindrome.\n", str);
            return;
        }
        i++;
        j--;
    }
    printf("String %s is a palindrome.\n", str);
}

int main() {
    // 如果要从文件读取,把stdin换成打开的文件指针即可
    char word[50];
    // 用scanf逐个读单词,自动跳过所有空白符(包括换行)
    while (scanf("%s", word) != EOF) {
        palindrome(word);
    }
    return 0;
}

测试你给出的输入leVel CompUtER Science theORY radar,输出会是:

String leVel is a palindrome.
String CompUtER is not a palindrome.
String Science is not a palindrome.
String theORY is not a palindrome.
String radar is a palindrome.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:44:37