【问题标题】:Why do interleaved scanf() + printf() statements result in both scanf() calls executing first, then both printf() calls?为什么交错的 scanf() + printf() 语句会导致两个 scanf() 调用首先执行,然后是两个 printf() 调用?
【发布时间】:2014-01-05 19:39:35
【问题描述】:

你能在下面的代码中解释一件事吗:

#include<stdio.h>

int main()
{
    int n;char ch,ch1;
    scanf("%d\n",&n);
    printf("d-%d \n",n);

    scanf("\n%c",&ch);
    printf("ch-%d \n",ch);

    scanf("\n%c",&ch1);
    printf("ch1-%d \n",ch1);

    printf("%d %d %d\n",n,ch,ch1);
    return 0;
}

为什么输入n的值后,直接求ch的值,然后直接执行语句打印各自的值,即语句:

printf("d-%d \n",n);
printf("ch-%d \n",ch);

【问题讨论】:

  • 呃。不确定我的 cmets 在哪里,也许有一些数据丢失。无论如何,@OP:由于这是一个可以通过阅读man 3 scanf 直接回答的问题,因此不适合 Stack Overflow。
  • 另外,dupe1,dupe2。 (这个用户一天两次问同一个问题。这是不正常的。)
  • 重新打开,因为我刚刚关闭了其他问题之一作为这个的副本(另一个作为那个的副本)。
  • @Shog9 不应该把原来的打开,后面的两个作为骗子关闭吗?
  • 这是三者中最好的,恕我直言。尤其是第一个值得“最低限度的理解”结束。

标签: c printf scanf


【解决方案1】:

scanf("%d\n",&amp;n); 在实际输入后跳过任意数量的尾随空格(包括无)。也可以写成scanf("%d ",&amp;n);。

scanf("\n%c",&amp;ch); 在实际输入之前跳过任意数量的前导空格(包括无)。也可以写成scanf(" %c",&amp;ch);。

注意:格式说明符中的空格可以跳过任意数量的空格。

现在 跳过空格 是什么意思?

这意味着scanf 重复地从输入中读取空白字符,直到它到达一个非空白 字符。现在缓冲区中没有空白字符了。
当遇到非空白字符时,则放回,以便在扫描下一个输入项或下次调用@时再次读取该字符987654326@。

现在来回答你的问题。

为什么交错的scanf() + printf() 语句会导致两个scanf() 调用首先执行,然后是printf() 调用?

我假设n 的输入是15。当您按下 Enter 键时,\n 字符将与输入缓冲区中的15 一起出现。 scanf("%d\n",&amp;n); 读取 15 然后跳过 \n。现在这个scanf 等待输入一个非空白 字符(不像你认为应该打印15)。当您输入 a 时,它会将其放回以供下次调用 scanf。下一条语句scanf("\n%c",&amp;ch); 从缓冲区中读取这个a,并且不让用户输入ch 的值。由于n 和ch 的值现在都被这些scanfs 读取,因此似乎都是

printf("d-%d \n",n);
printf("ch-%d \n",ch);   

在两次scanfs 调用之后执行(事实并非如此!)。

【讨论】:

  • 我尽力了。希望你能理解。如果您对此有任何疑问,请告诉我。
【解决方案2】:

scanf 格式的任何空格都与scanf 格式的任何其他空格一样。它只是告诉scanf 跳过输入中的任何空格。

尽管大多数格式代码不需要它,因为它们会自动跳过前导空格,但需要它(除非您想实际读取空格字符)是 "%c" 格式代码。

您可能还想阅读this reference。

【讨论】:

  • 据我所知,OP 问题在于理解输入的缓冲性质以及 \n 字符虽然不可见但仍然存在这一事实 - 但我当然可能错了
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 2015-06-29
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多