仅使用<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
相关产品推荐
相关产品推荐

