所以我今天开始学习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平台编译的。
答案 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
并不真正“记住”任何东西。输入流可以完成所有“记忆”。