C中scanf()的机制是什么?

时间:2010-06-11 02:59:38

标签: c visual-studio loops scanf

所以我今天开始学习C,作为练习,我被告知编写一个程序,要求用户输入数字,直到他们键入 0 ,然后将偶数和奇数加在一起。这是:

#include <stdio.h>;

int main() {
    int esum = 0, osum = 0;
    int n, mod;

    puts("Please enter some numbers, 0 to terminate:");
    scanf("%d", &n);

    while (n != 0) {
        mod = n % 2;
        switch(mod) {
        case 0:
            esum += n;
            break;
        case 1:
            osum += n;
        }
        scanf("%d", &n);
    }
    printf("The sum of evens:%d,\t The sum of odds:%d", esum, osum);
    return 0;
}

我的问题涉及scanf()函数的机制。似乎当您一次输入多个以空格分隔的数字时(例如1 22 34 2 8),scanf()函数会以某种方式记住该行中的每个不同数字,并分别逐步执行每个数字的while循环。为什么/如何发生这种情况?

命令提示符中的示例交互:

-> Please enter some numbers, 0 to terminate:  
42 8 77 23 11 (enter)  
0 (enter)  
-> The sum of evens:50,     The sum of odds:111

我正在通过命令提示符运行程序;它是使用Visual Studio为win32平台编译的。

2 个答案:

答案 0 :(得分:2)

请注意,每次进行循环时都要调用scanf();每次使用参数“%d”和&amp; n调用scanf()时,它会将一个整数读入变量n并前进到输入流中该整数之后的位置。

您可以将输入流视为各种“字符串”。假设我键入“25 16 0”;在scanf()读取第一个整数后,输入流变为“16 0”;如果再次调用scanf(),则会读取整数16,输入字符串变为“0”。

答案 1 :(得分:1)

这是因为scanf函数从标准输入 stream 获取输入。它被称为 stream ,原因是:您输入的所有内容都放入该流中,scanf读取该流。无论你输入到输入流中的是什么,都会留在那里,直到像scanf这样的东西离开那里。

换句话说,scanf并不真正“记住”任何东西。输入流可以完成所有“记忆”。