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

如何读取含多行、空格的用户输入?现有scanf代码输出异常

解决scanf读取用户输入出现乱码的问题

看起来你遇到的“大量3/4分数”其实是未初始化数组的垃圾值,核心问题出在两个地方:数组没初始化,也没加字符串终止符。咱们一步步来修正:

问题分析

你的代码逻辑本身是能读取字符、空格和换行的(scanf("%c")不会跳过空白字符,这点没问题),但:

  • 数组user_input没有初始化,未被写入的内存区域是随机的垃圾数据,输出时就会显示成奇怪的符号
  • 读取结束后没有手动添加字符串终止符\0,当你把user_input当作字符串处理时,程序会一直读到内存里的垃圾值为止

修正后的代码

#include <stdio.h>

int main() {
    // 初始化数组,所有元素默认设为'\0',避免未写入区域的垃圾值
    char user_input[1000] = {0};
    int i = 0;

    // 限制读取数量,留一个位置放终止符,防止数组越界
    while (i < 999 && scanf("%c", &user_input[i]) == 1) {
        i++;
    }
    // 手动添加字符串终止符,确保是合法的C字符串
    user_input[i] = '\0';

    // 测试输出验证结果
    printf("你输入的内容:\n%s", user_input);
    return 0;
}

更严谨的替代方案(用getchar)

getchar()在处理EOF时更直观,因为它返回int类型,可以明确区分普通字符和EOF(Ctrl+D触发的结束信号):

#include <stdio.h>

int main() {
    char user_input[1000] = {0};
    int i = 0;
    int c; // 用int存getchar的返回值,区分EOF和字符

    while (i < 999 && (c = getchar()) != EOF) {
        user_input[i] = (char)c;
        i++;
    }
    user_input[i] = '\0';

    printf("你输入的内容:\n%s", user_input);
    return 0;
}

关键改进点

  • 初始化数组:char user_input[1000] = {0}会把数组所有元素设为\0,即使没读满数组,剩下的位置也不会输出乱码
  • 数组越界保护:i < 999确保不会写满整个数组,留一个位置给终止符\0
  • 手动添加终止符:不管有没有读满数组,最后都加上\0,保证程序把它当作正常字符串处理

这样修改后,就能正确读取所有输入的字符、空格、换行,直到你按下Ctrl+D结束输入啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:36:10