C语言回文检测代码无法识别语句末尾单词的技术求助
问题:无法识别句末的回文单词(kayak、ossesso)
现有一段C语言代码,功能是从input.txt读取文本,将每个单词转为小写后判断是否为回文,若是则转为大写输出。目前代码仅无法识别位于语句末尾的kayak和ossesso这两个回文单词。
原代码
#include <stdio.h> #include <string.h> #include <ctype.h> #define NMAX 1000 int main() { char line[NMAX]; int palindromo = 1; FILE*fp; fp=fopen("input.txt", "r"); if(fp != NULL){ while(fgets(line, NMAX, fp)){ char*word = strtok(line, " "); while(word != NULL){ palindromo = 1; int lunghezza = strlen(word); if((lunghezza>0) && (word[lunghezza-1] == '\n')){ word[lunghezza-1] = '\0'; } for(int i=0; i<lunghezza; i++){ word[i] = tolower(word[i]); } for(int i=0; i<lunghezza/2; i++){ if(word[i] != word[lunghezza-1-i]){ palindromo = 0; } } if(palindromo == 1){ for(int i=0; i<lunghezza; i++){ word[i] = toupper(word[i]); } } puts(word); word = strtok(NULL, " "); } } } }
输入文件内容(input.txt)
Anna ha preso otto a scuola. la mamma le ha regalato una spilla in oro e le ha organizzato un giro in kayak Anche il cane ha avuto in premio un osso lo ha mangiato come un ossesso.
问题原因分析
- 分隔符不完整:
strtok仅用空格作为分隔符,导致句末带标点的单词(如ossesso.)被完整读取,回文判断时会把末尾的句号算入,导致首尾字符不匹配。 - 字符串长度未更新:处理换行符时,将
\n替换为\0后,没有重新计算字符串长度,仍使用原来的长度进行回文判断。比如kayak\n的原长度是6,替换后实际长度为5,但代码仍用6来循环比较,会把末尾的\0参与判断,导致回文识别失败。
修复后的代码
#include <stdio.h> #include <string.h> #include <ctype.h> #define NMAX 1000 int main() { char line[NMAX]; int palindromo = 1; FILE* fp = fopen("input.txt", "r"); if(fp != NULL){ while(fgets(line, NMAX, fp)){ // 用空格、句号、换行作为分隔符,拆分出纯单词 char* word = strtok(line, " .\n"); while(word != NULL){ palindromo = 1; int lunghezza = strlen(word); // 先转小写 for(int i=0; i<lunghezza; i++){ word[i] = tolower(word[i]); } // 回文判断,发现不匹配立即退出循环 for(int i=0; i<lunghezza/2; i++){ if(word[i] != word[lunghezza-1-i]){ palindromo = 0; break; } } // 是回文则转大写 if(palindromo == 1){ for(int i=0; i<lunghezza; i++){ word[i] = toupper(word[i]); } } puts(word); word = strtok(NULL, " .\n"); } } fclose(fp); // 释放文件资源 } return 0; }
修复说明
- 扩展
strtok的分隔符为" .\n",确保拆分出不带标点和换行的纯单词。 - 移除单独处理换行符的逻辑,因为分隔符已包含
\n,strtok会自动处理。 - 回文判断循环中添加
break,一旦发现不匹配立即终止循环,提升效率。 - 添加
fclose(fp)和return 0,完善代码的资源释放与规范。
内容的提问来源于stack exchange,提问作者Crescenzo De Marco
相关产品推荐
相关产品推荐

