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

C语言反转字符串单词顺序时输出异常、单词计数偏差问题求助

问题根因
  • 多余换行的原因:fgets 函数读取用户输入时会把末尾的回车换行符 \n 一并存入输入缓冲区,你的代码初始 end 指针指向了这个 \n 的位置,拷贝第一个单词时会把 \n 也写入结果数组,就出现了多余的换行。
  • 计数少1的原因:你当前的计数逻辑只有遇到空格时才累加,统计的实际是单词之间的分隔符数量,N个单词对应N-1个分隔符,最后一个(原字符串最开头的)单词拷贝完成后没有触发计数,所以最终结果比实际少1。此处后续补充的计数是逻辑补全,不属于临时补丁。
修复方案
  1. 首先处理fgets读取的换行符,在获取字符串长度后先移除末尾的\n:
length = strlen(ent);
// 新增代码 移除fgets带入的换行符
if (length > 0 && ent[length - 1] == '\n') {
    ent[length - 1] = '\0';
    length--;
}
start = length - 1;
end = length - 1;
  1. 在最后拷贝完开头的单词后,补充对应最后一个单词的计数:
for (i = 0; i <= end; i++) {
    rev[j] = ent[i];
    j++;
}
// 新增代码 最后一个单词拷贝完成 计数加1
count++;
修复后完整代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main(void) {
    char ent[50], rev[50];
    int length, i = 0, start, end, j = 0, count = 0, k;

    printf("Enter a statement: ");
    fgets(ent, 50, stdin);

    length = strlen(ent);
    // 移除fgets带入的换行符
    if (length > 0 && ent[length - 1] == '\n') {
        ent[length - 1] = '\0';
        length--;
    }
    start = length - 1;
    end = length - 1;


    while (start > 0) {
        if (ent[start] == ' ') {
            i = start + 1;
            count++; 

            while (i <= end) {
                rev[j] = ent[i];
                i++;
                j++;
            }
            rev[j++] = ' ';
            end = start - 1;
        }
        start--;
    }

    for (i = 0; i <= end; i++) {
        rev[j] = ent[i];
        j++;
    }
    // 补充最后一个单词的计数
    count++;

    rev[j] = '\0';

    printf("Reversed statement: %s\n", rev);
    printf("Words in statement: %d\n", count);

    return(0);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:03