Reputation: 73
I have trouble with scanf and a loop on linux.
#include <stdio.h>
#include <stdlib.h>
#include <stdio_ext.h>
int main(int argc, char ** argv){
int i = 0;
char s[255];
char c;
while(i<10){
printf("Here : ");
scanf(" %s", s);
printf("%s\n", s);
i++;
while((c = getchar()) != '\n' && c != EOF);
}
return EXIT_SUCCESS;
}
If in the shell Linux, if I execute my file like this :
echo "lol" | ./testWhileScanf
Then the result will be this :
Here : lol
Here : lol
Here : lol
Here : lol
Here : lol
Here : lol
Here : lol
Here : lol
Here : lol
Here : lol
I dont know why this is the result, a line of my code is to flush the stdin, to not have this kind of problem.
Seeking for solution I tried : __fpurge, fpurge, fflush But none worked.
I would like to get only :
Here ? : lol
Here ? :
And waiting for input. Surely I am missing something here.. but I can't figure what =/
Upvotes: 3
Views: 315
Reputation: 726987
When you call
scanf(" %s", s);
for the first time, it sets s
to lol
, and returns 1
. When you call it for the second time, there is no further input, so scanf
returns zero without setting your variable. However, your code ignores the return value of scanf
, and prints s
anyway.
Adding a check and a break
should fix this problem:
if (scanf(" %254s", s) != 1) break;
Note the size limiter in the format string, it will prevent scanf
from causing buffer overruns.
Upvotes: 4