C - scanf输入如何工作,如何在循环中迭代?

问题描述 投票:0回答:2

我知道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的基础知识。

c loops input scanf
2个回答
0
投票

你对 scanf 为真,scanf只取一个整数,直到读到一个whitespace。

这里让你困惑的是算法的工作原理。您的算法首先读取整数5,然后 "立即 "打印出五个 ?. 它继续读4,打印4 ?,读3,印3 ?,以此类推。


0
投票

scanf 将该行存储在一个内部缓冲区中,如果缓冲区不是空的,则尝试从缓冲区中读取并删除成功读取的部分;如果缓冲区为空,则等待用户输入。如果缓冲区不是空的,它尝试从缓冲区中读取并删除成功读取的部分;如果缓冲区是空的,它等待用户输入。在你的外循环的第一次迭代中(while),缓冲区是空的。你输入了 "5 4 3 2 1",所以缓冲区包含了这个。第一个 sscanf("%d",&num) 从缓冲区中读取第一个整数,即5;缓冲区现在包含" 4 3 2 1"。在第二次迭代时,你读取4,缓冲区将是" 3 2 1"。这样一直到缓冲区用完为止。这时,你的程序继续进行;它只是在等待更多的输入。


0
投票

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...


0
投票

没有数组的情况下,整数是不是会代替变量中的前一个?

这里根本不需要数组。

这里根本不需要数组。scanf() 函数取值(假设包括空格),并将所有的值逐一保存到变量 num. 如果你使用一个调试器(假设使用GDB),并在 while(),你会知道通过步入该变量的 num 在每次迭代中都会发生变化,而 for 循环往复 num 是达到了。

下面提供了一个使用调试器进行两次迭代的例子(重点是关于 num 在左角)。)

迭代1:

Iteration 1

迭代2:

Iteration 2

© www.soinside.com 2019 - 2024. All rights reserved.