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

仅使用<stdio.h>实现scanf循环至用户按回车,现有代码如何修复

问题根因

你遇到的问题由两个错误共同导致:

  • scanf("%c ", &num[i])中%c后的空格是核心错误:scanf格式串中的空白字符会匹配输入流中任意数量的空白字符(包括空格、制表符、换行符),会直接吞掉你输入的空格和结尾的换行符,永远无法将\n存入num[i]触发循环终止条件。
  • 你输入的0 1 2 3 4 5 6中数字间存在空格,这些空格会被依次存入数组:num[0]='0'、num[1]=' '、num[2]='1'、num[3]=' ',所以你输出num[3]时得到的是空格,看起来就是空内容。
  • 额外存在数组越界风险:你定义的char num[127]有效索引范围是0~126,循环条件i<=127会超出数组边界,触发未定义行为。

修复方案

方案1:调整scanf逻辑修复原有写法

去掉格式串中的多余空格,调整边界判断,如果你需要过滤掉输入中的空格只存储数字,可以额外加判断:

#include <stdio.h>
int main() {
  char num[127];
  int i = 0;
  // 循环条件顺序:先判断边界,再读入,最后判断是否为换行
  while (i < 127 && scanf("%c", &num[i]) == 1 && num[i] != '\n') {
    // 如果不需要存空格,打开下面两行注释即可
    // if (num[i] == ' ') continue;
    i++;
  }
  // 未过滤空格的情况下,输入的3对应索引为6
  printf("%c", num[6]);
  return 0;
}

方案2:使用fgets直接读取整行(更推荐)

如果你的需求就是读取一行输入直到用户按回车,用fgets不需要手动控制循环逻辑,稳定性更高:

#include <stdio.h>
int main() {
  char num[128];
  if (fgets(num, sizeof(num), stdin) != NULL) {
    // 对应输入0 1 2 3中的3,索引为6
    printf("%c", num[6]);
  }
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:54:02