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

C语言实现句子单词分行打印时末尾出现异常字符问题求助

问题解决:将句子单词逐行打印并修复末尾多余字符

你当前的代码能实现基本的单词逐行打印,但行末尾出现多余字符,核心问题出在循环逻辑和边界判断上,具体分析如下:

  • 循环条件i<1024;i++ ||check<=2逻辑错误,会导致循环超出输入字符串的实际长度,访问内存中不属于该字符串的垃圾数据,这就是末尾多余字符的来源
  • 未判断字符串结束符'\0',循环强制执行1024次,必然会打印不属于输入内容的内存垃圾
  • check变量的设计冗余,反而干扰了正常的循环终止逻辑
  • 变量i定义为char类型不合适,字符串长度可能超过char的取值范围,应改为int或size_t

规范代码实现

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

int main() {
    // 初始分配足够内存
    char *s = malloc(1024 * sizeof(char));
    if (s == NULL) {
        perror("malloc failed");
        return 1;
    }
    
    // 读取整行输入(包含空格)
    if (scanf("%[^\n]", s) != 1) {
        fprintf(stderr, "input error\n");
        free(s);
        return 1;
    }
    
    // 重新分配到实际需要的大小
    size_t len = strlen(s);
    char *temp = realloc(s, len + 1);
    if (temp != NULL) {
        s = temp;
    }
    
    int in_word = 0; // 标记是否在单词中,避免连续空格多次换行
    for (size_t i = 0; s[i] != '\0'; i++) {
        if (s[i] != ' ') {
            printf("%c", s[i]);
            in_word = 1;
        } else {
            // 只有当前在单词中时才换行,避免连续空格输出多个空行
            if (in_word) {
                printf("\n");
                in_word = 0;
            }
        }
    }
    // 最后一个单词后换行(可选,根据需求调整)
    if (in_word) {
        printf("\n");
    }
    
    free(s);
    return 0;
}

代码说明

  • 增加了内存分配失败的错误处理,避免空指针访问
  • 循环以字符串结束符'\0'为终止条件,确保只处理输入的有效内容
  • 用in_word变量处理连续空格的情况,避免输出多余空行
  • 使用size_t类型遍历字符串,匹配strlen的返回值类型,更规范
  • 最后释放分配的内存,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:10:15