C语言scanf格式串含\n为何输入超循环次数才输出结果
问题原因分析
#include<stdio.h> int main(){ int arr[10]; printf("Enter: "); for(int i=0;i<6;i++){ scanf("%d\n",&arr[i]); } for(int i=0;i<10;i++){ printf("%d",arr[i]); } return 0; }
核心问题:scanf格式字符串错误使用了\n
scanf格式控制串中的空白字符(包括空格、换行\n、制表符\t等)的作用是:匹配输入中任意数量的连续空白字符,直到遇到第一个非空白字符才会终止本次匹配,且该非空白字符会被放回输入缓冲区。
你使用了"%d\n"作为格式串,每次scanf的执行逻辑就变成了:
- 先读取一个整数存入对应的变量
- 持续吞掉后续所有的空白字符(你每次输入完按的回车都属于空白字符),直到碰到第一个非空白字符,本次
scanf才会结束,进入下一轮循环。
输入过程对应逻辑
你需要执行6次scanf,每一次都需要在读完整数后额外输入一个非空白字符才能终止本次调用:
- 前5次输入的1、2、3、4、5刚好作为上一次
scanf终止匹配的非空白字符,流程正常推进 - 第6次
scanf读完6之后,还需要一个非空白字符才能结束,你输入的7刚好作为这个终止符,所以直到输入7按下回车后,6次scanf才全部执行完成,开始执行后续的printf输出逻辑,这就是输出延迟的原因。
其他现象说明
输出末尾的随机乱码是因为arr是局部栈变量,定义时没有统一初始化,你只给前6个元素写入了有效值,剩下4个元素是内存中的随机值,输出就会显示为乱码。
修复方案
把scanf("%d\n",&arr[i]);中的\n删除,改为scanf("%d",&arr[i]);即可。
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

