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

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.

问题原因分析

  1. 分隔符不完整:strtok仅用空格作为分隔符,导致句末带标点的单词(如ossesso.)被完整读取,回文判断时会把末尾的句号算入,导致首尾字符不匹配。
  2. 字符串长度未更新:处理换行符时,将\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:07:29