views:

69

answers:

2

So I started learning C today, and as an exercise i was told to write a program that asks the user for numbers until they type a 0, then adds the even ones and the odd ones together. Here is is (don't laugh at my bad style):

#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;
}

My question concerns the mechanics of the scanf() function. It seems that when you enter several numbers at once separated by spaces (eg. 1 22 34 2 8), the scanf() function somehow remembers each distinct numbers in the line, and steps through the while loop for each one respectively. Why/how does this happen?

Example interaction within command prompt:

-> 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

I'm running the program through the command prompt, it's compiled for win32 platforms with visual studio.

+1  A: 

It happens because scanf function gets its input from the standard input stream. It is called stream for a reason: everything you enter is put into that stream, and scanf reads that stream. Whatever you put into the input stream will stay there until something like scanf gets it out of there.

In other words, scanf doesn't really "remember" anything. It is the input stream that does all the "remembering".

AndreyT
+1  A: 

Notice that you're calling scanf() each time you go through the loop; each time you call scanf() with the arguments "%d" and &n, it reads a single integer into the variable n and advances to the position immediately after that integer in the input stream.

You can sort of think of the input stream as a "string" of sorts. Suppose I typed "25 16 0"; after scanf() reads the first integer, the input stream becomes "16 0"; if you call scanf() again, you'll read the integer 16 and the input string becomes "0".

Elliott
Is it possible in / directly after the scanf() call to tell it 'only take the first int you find' / explicitly clear the input stream of the leftover string?
Riemannliness
Elliott
If you want more information about the gritty details of scanf(), especially how to use that first argument, I recommend reading the man page: http://www.netadmintools.com/html/3scanf.man.htmlAdmittedly, this is not easy to read, but if you can get through it, you will really understand how to use scanf().
Elliott
@Riemannliness Use scanf ("%d", fflush(stdin); scanf ("%d", This way every time you use fflush(stdin); the input buffer is flushed (cleared).
CVS-2600Hertz
Ah, excellent. Thanks, Riemannliness!
Elliott