使用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
相关产品推荐
相关产品推荐

