Какова механика scanf () в C - PullRequest
2 голосов
/ 11 июня 2010

Итак, я начал изучать 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

Я запускаю программу через командную строку; он скомпилирован для платформ win32 с Visual Studio.

Ответы [ 2 ]

2 голосов
/ 11 июня 2010

Обратите внимание, что вы вызываете scanf () каждый раз, когда проходите цикл; каждый раз, когда вы вызываете scanf () с аргументами "% d" и & n, он считывает одно целое число в переменную n и перемещается на позицию сразу после этого целого числа во входном потоке.

Вы можете думать о входном потоке как о «строке». Предположим, я набрал «25 16 0»; после того, как scanf () прочитает первое целое число, входной поток станет «16 0»; если вы снова вызовете scanf (), вы прочитаете целое число 16, и строка ввода станет «0».

1 голос
/ 11 июня 2010

Это происходит потому, что функция scanf получает свой ввод от стандартного ввода stream . Он называется stream по причине: все, что вы вводите, помещается в этот поток, а scanf читает этот поток. Все, что вы поместите во входной поток, останется там до тех пор, пока что-то вроде scanf не получит его оттуда.

Другими словами, scanf ничего не помнит. Это входной поток, который делает все «запоминание».

...