Какова механика scanf () в C
Итак, сегодня я начал изучать C, и в качестве упражнения мне сказали написать программу, которая запрашивает у пользователя числа, пока они не наберут a 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 ответа:
Обратите внимание, что вы вызываете scanf() каждый раз, когда вы проходите через цикл; каждый раз, когда вы вызываете scanf() с аргументами "%d" и &n, он считывает одно целое число в переменную n и переходит на позицию сразу после этого целого числа во входном потоке.
Входной поток можно рассматривать как своего рода" строку". Предположим, я ввел "25 16 0"; после того, как scanf() считывает первое целое число, входной поток становится "16 0"; если вы снова вызовете scanf (), вы прочитаете целое число 16 и входная строка становится "0".
Это происходит потому, что функция
Другими словами,scanf
получает свой вход из стандартного входного потока . Это называется поток по причине: все, что вы вводите, помещается в этот поток, иscanf
читает этот поток. Все, что вы введете во входной поток, останется там, пока что-то вродеscanf
не вытащит его оттуда.scanf
на самом деле ничего не "помнит". Это входной поток, который делает все "запоминание".