繁体   English   中英

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

[英]C - How scanf inputs work and how it iterates in loops?

我知道 scanf() 的基础知识; 需要转换说明符 % 和变量地址来存储输入值 &。

在进行分配时,有一项任务涉及输入任意数量的值,例如:5 4 3 2 1

进入scanf,然后打印出integer类型对应的符号数(例如'?'),所以终端显示为:

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 只需要一个 integer 直到它读取一个空格时,我完全混淆了 scanf 如何在一个输入行(5 4 3 2 1)中读取多个整数。 从这个角度来看,我的理解是分隔整数的空格表示在之前的 integer 之后的新迭代? 当我试图追踪打印的工作原理时,它打印为:

5 4 3 2 1
5?????
4????
3???
2??
1?

...所以我的问题是 scanf 如何将所有这些整数在一行中“保存”到“num”并将每个相应的符号打印到输入后给定的值? 如果没有数组,整数不会替换变量中的前一个吗?

抱歉,如果这个问题没有意义 - 对编码来说还是很新的。 谢谢!

你对scanf的理解是对的,scanf 只需要一个 integer 直到它读取一个空格。

在这里让你感到困惑的是算法是如何工作的。 您的算法首先读取 integer 5 并“立即”打印 5 ? . 它继续读 4,打印 4 ? , 读 3, 打印 3 ? , 等等。

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

如果没有数组,整数不会替换变量中的前一个吗?

这里根本不需要数组。

scanf() function 取值(假设包括空格)并将它们一一保存到变量num中。 如果您使用调试器(假设使用 GDB)并在while()中设置断点,您将通过逐步了解变量num在每次迭代中更改并且for循环运行直到达到num来了解。

下面提供了使用调试器进行两次迭代的示例(关注左角的num ):

迭代1:

迭代 1

迭代 2:

迭代 2

scanf从标准输入stdin标准输入中“读取”字符(如果还没有任何内容,它会提示用户输入要添加的内容),并将它们转换为取决于格式字符串中使用的转换说明符的格式。

您可以将stdin视为 memory 中的字符序列,每次用户在终端中键入内容并按 Enter 时,键入的内容都会添加到stdin

因此,在您的情况下,当您在终端中键入5 4 3 2 1并按 Enter 时, stdin将收到字符序列"5 4 3 2 1\n" (请注意,当您按 Enter 时添加了换行符) .

然后scanf("%d",&num) ,它只需要 1 个十进制 integer 数字,从标准输入中“读取”和“消耗”形成一个连续十进制stdin数字的相关字符。

在这种情况下,第一次执行scanf时会读取5 ,并将" 4 3 2 1\n"留在stdin中。 然后在满足条件时执行循环语句。 第二次执行scanf时,前导空格被%d说明符丢弃并读取4 ,在stdin中留下" 3 2 1\n" 依此类推,直到无法从stdin中读取十进制整数...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM