我知道scanf()的基本原理;需要一个转换指定符%和一个变量地址来存储输入值&。
在做一个任务的时候,有一个任务需要输入任意数量的值,一个例子是:5 4 3 2 1。
进入scanf,然后打印出与输入的整数相对应的符号数(例如'?'),这样它就会在终端显示为。
5 4 3 2 1
?????
????
???
??
?
在这种情况下,我把scanf放在一个while循环中,就像这样。
int i, num;
while(scanf("%d",&num)==1){
printf("%d",num);
for (i=0; i<num; i++){
printf("?");
}
printf("/n");
}
我完全不明白scanf是如何在一行输入中读取多个整数的(5 4 3 2 1),而许多来源都规定scanf只读取一个整数,直到它读取到一个空格。我看了一下,我的理解是,整数之间的空格表示在前一个整数之后有一个新的迭代?当我试图跟踪打印工作时,它的打印结果是:
5 4 3 2 1
5?????
4????
3???
2??
1?
...所以我的问题是,scanf是如何将这些整数 "保存 "在一行 "num "中,并将相应的符号打印到输入后的值上的?在没有数组的情况下,整数是不是会取代变量中的前一个?
如果这个问题没有意义的话,很抱歉--对编码还是很陌生。谢谢你!我知道scanf的基础知识。
你对 scanf
为真,scanf只取一个整数,直到读到一个whitespace。
这里让你困惑的是算法的工作原理。您的算法首先读取整数5,然后 "立即 "打印出五个 ?
. 它继续读4,打印4 ?
,读3,印3 ?
,以此类推。
scanf
将该行存储在一个内部缓冲区中,如果缓冲区不是空的,则尝试从缓冲区中读取并删除成功读取的部分;如果缓冲区为空,则等待用户输入。如果缓冲区不是空的,它尝试从缓冲区中读取并删除成功读取的部分;如果缓冲区是空的,它等待用户输入。在你的外循环的第一次迭代中(while
),缓冲区是空的。你输入了 "5 4 3 2 1",所以缓冲区包含了这个。第一个 sscanf("%d",&num)
从缓冲区中读取第一个整数,即5;缓冲区现在包含" 4 3 2 1"。在第二次迭代时,你读取4,缓冲区将是" 3 2 1"。这样一直到缓冲区用完为止。这时,你的程序继续进行;它只是在等待更多的输入。
scanf
从标准输入流中 "读取 "字符。stdin
(如果那里还没有什么东西,它就会提示用户输入一些东西来添加到里面),并根据格式字符串中使用的转换指定器将它们转换为一种格式。
你可以想一想 stdin
作为一个字符序列在内存中,每次用户在终端中输入东西并按下Enter键时,输入的内容都会被添加到 stdin
.
所以在你的情况下,当你输入 5 4 3 2 1
并按终端中的Enter键。stdin
将接收到的字符序列 "5 4 3 2 1\n"
注意,新的行字符是在按Enter键时添加的)。
然后是 scanf("%d",&num)
读取 "和 "消耗",它只期待1个十进制整数。stdin
相关字符组成一个连续的十进制整数。
在这种情况下 5
初读 scanf
被执行,并且 " 4 3 2 1\n"
留在 stdin
. 然后随着条件的满足,循环语句被执行。第二次 scanf
执行的时候,前导空格会被 %d
规定者和 4
改为,留下 " 3 2 1\n"
在 stdin
. 以此类推,直到没有十进制整数数字可以被读取。stdin
...