for循环中scanf的工作原理

3
我有一个关于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循环)。我可以提供更多的输入,它也可以接受,除非我按下回车键。这里有什么关于for循环的问题我漏掉了吗?


1
你可以输入任意数量的数字,但程序只会读取其中的十个。当下一次尝试调用scanf()时可能会出现问题,因为多余的数字仍然存在于缓存中等待被读取。 - Crowman
@PaulGriffiths,for循环难道不应该只运行10次吗? - imox
这就是为什么它只会读取你的12个数字中的10个。虽然循环的第一次迭代不会结束,直到你按下Enter键,但是当第二次迭代开始时,有11个数字等待被读取。你的scanf()调用将读取由空格分隔的单个数字,无论这些空格是换行符还是普通空格。在第一次scanf()调用返回后,它只读取了第一个数字,而你输入行的其余部分仍在输入缓冲区中等待下一次scanf()调用。 - Crowman
如果你想读取10个数字,你应该在每次输入后终止该行,而不是一行输入所有数字...也许这就是问题所在? - Nokdu
1个回答

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$ 

在阅读前十个数字后,您会发现最后两个数字仍然在输入缓冲区中,我们可以在一个单独的循环中读取它们,而无需实际请求更多输入。在这种情况下,所有的输入都是在第一次调用 scanf() 之后完成的。程序可以继续读取输入缓冲区中的任何内容,而用户永远不必再按键。
您的程序发生了什么事情是,您只是从 main() 返回并退出,而从未尝试读取您输入的那最后两个数字。但是,此示例程序显示它们仍然存在,并可供读取。
如果您运行示例程序,但输入的数字少于12个,则在某些时候输入将用完,scanf() 将停止并等待您输入更多内容才能继续。

所以如果我们一开始只输入了11个数字,那么scanf将会要求我再次输入值。如果是这样的话,我已经理解了逻辑。如果数组是字符类型,用于在屏幕上打印十个字符,那么逻辑是否相同呢?谢谢Paul。 - imox
@imox:是的,如果您输入11,您将看到最多现在,让我们读取最后2个...,然后scanf()会停止并等待您在第三个for循环的第二次迭代中输入更多输入。逻辑与char数组不完全相同,因为虽然scanf()将读取由空格分隔的int,例如,当它读取字符时,它将像任何其他字符一样处理空格,包括换行符。因此,如果您实际输入了10个字符,它将能够读取11个-您输入的10个加上换行符。如果您用空格分隔它们,那么就会有20个。 - Crowman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接