【问题标题】:Working of scanf under for loopscanf 在 for 循环下的工作
【发布时间】:2014-09-23 02:12:28
【问题描述】:

我有一个关于在 C 中使用 for 循环的问题。请查看以下代码:

#include<stdio.h>

void main()
{
    int ar[10],i;
    printf("Enter 10 numbers:");
    for(i=0;i<10;i++)
        scanf("%d",&ar[i]);
    for(i=0;i<10;i++)
        printf("%d",ar[i]);
}

当我执行此操作并提供以下输入时:

1 2 3 4 5 6 7 8 9 10 11 12

我已经给出了 12 个输入,但循环应该只运行 10 次(scanf 循环)。我可以提供更多输入,除非我按 Enter 键,否则我很乐意接受。我在这里遗漏了一些关于 for 循环的内容吗?

【问题讨论】:

  • 您可以输入任意数量的数字,但它只会读取其中的 10 个。下次尝试拨打scanf() 时可能会遇到问题,因为这些多余的号码仍然存在,等待读取。
  • For 循环是否应该只运行 10 次 @PaulGriffiths?
  • 应该做。这就是为什么它只会读取 12 个数字中的 10 个。但是,在您按下 Enter 之前,循环的第一次迭代不会结束,所以当您的第二次迭代开始时,有 11 个数字等待被读取。您的scanf() 调用将读取由空格分隔的单个数字,无论该空格是换行符还是常规空格。在您的第一个 scanf() 调用返回后,它只会读取第一个数字,而您的行的其余部分仍在输入缓冲区中等待下一次 scanf() 调用。
  • 如果您想读取 10 个数字,您应该在每次输入后终止该行而不是一行...也许这就是问题所在?

标签: c for-loop scanf


【解决方案1】:

也许下面的程序可以帮助你想象正在发生的事情:

#include<stdio.h>

int main(void)
{
    int ar[10], br[2], i;
    printf("Enter 12 numbers: ");
    fflush(stdout);

    for( i = 0; i < 10; ++i ) {
        scanf("%d", &ar[i]);
    }

    printf("We've read the first 10, let's print them...\n");

    for( i = 0; i < 10; ++i ) {
        printf("%d ", ar[i]);
    }

    printf("\nNow, let's read the last 2...\n");

    for( i = 0; i < 2; ++i ) {
        scanf("%d", &br[i]);
    }

    printf("We've read the last 2, let's print them...\n");

    for( i = 0; i < 2; ++i ) {
        printf("%d ", br[i]);
    }

    putchar('\n');

    return 0;
}

哪个输出:

paul@local:~/Documents/src/sandbox$ ./scanning
Enter 12 numbers: 1 2 3 4 5 6 7 8 9 10 11 12
We've read the first 10, let's print them...
1 2 3 4 5 6 7 8 9 10 
Now, let's read the last 2...
We've read the last 2, let's print them...
11 12 
paul@local:~/Documents/src/sandbox$ 

如您所见,在读取前十个数字后,最后两个数字仍在输入缓冲区中,我们可以在单独的循环中读取它们,而无需实际请求更多输入。在这种情况下,所有的输入都是在 firstscanf() 的调用结束之后完成的。程序可以继续读取输入缓冲区中的任何内容,而无需用户按下另一个键。

您的程序发生的事情是您刚刚从main() 返回并退出,而没有尝试读取您输入的最后两个数字。这个示例程序显示它们仍然在那里,但是可以读取。

如果您运行示例程序但输入的数字少于 12 个数字,那么在某些时候输入将用完,scanf() 将停止并等待您输入在继续之前还有一些。

【讨论】:

  • 所以如果我们一开始只输入了 11 个数字,那么 scanf 会要求我再次输入值。如果是这样,那我就明白其中的逻辑了。如果数组是用于在屏幕上打印十个字符的字符类型,逻辑也将相同。谢谢保罗。
  • @imox:是的,如果您输入了 11,您会看到最多 Now, let's read the last 2...,然后scanf() 将停止并等待您在第三次 @ 的第二次迭代中输入更多输入987654328@ 循环。逻辑与char 数组并不完全相同,因为scanf() 将读取由空格分隔的ints,例如,当它读取字符时,它只会处理空格,包括换行符,就像任何其他字符一样.因此,如果您实际输入了 10 个字符,它将能够读取 11 - 您输入的 10,加上换行符。如果你用空格分隔它们,就会有 20 个。
猜你喜欢
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 2020-02-16
  • 1970-01-01
  • 2013-05-03
  • 2015-01-30
  • 2023-03-07
相关资源
最近更新 更多