Reputation: 10163
I write console application which performs several scanf for int And after it ,I performs getchar :
int x,y;
char c;
printf("x:\n");
scanf("%d",&x);
printf("y:\n");
scanf("%d",&y);
c = getchar();
as a result of this I get c = '\n'
,despite the input is:
1
2
a
How this problem can be solved?
Upvotes: 10
Views: 61012
Reputation: 31
A way to clean up anyspace before your desired char and just ignore the remaining chars is
do {
c = getchar();
} while (isspace(c));
while (getchar() != '\n');
Upvotes: 3
Reputation: 111
You can use the fflush function to clear anything left in buffer as a consquence of previous comand line inputs:
fflush(stdin);
Upvotes: 3
Reputation: 2640
Call fflush(stdin);
after scanf
to discard any unnecessary chars (like \r \n) from input buffer that were left by scanf
.
Edit: As guys in comments mentioned fflush
solution could have portability issue, so here is my second proposal. Do not use scanf
at all and do this work using combination of fgets
and sscanf
. This is much safer and simpler approach, because allow handling wrong input situations.
int x,y;
char c;
char buffer[80];
printf("x:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &x))
{
printf("wrong input");
}
printf("y:\n");
if (NULL == fgets(buffer, 80, stdin) || 1 != sscanf(buffer, "%d", &y))
{
printf("wrong input");
}
c = getchar();
Upvotes: 3
Reputation: 60047
For a start the scanf
should read scanf("%d\n", &x);
or y. That should do the trick.
Upvotes: 2
Reputation: 363858
This is because scanf
leaves the newline you type in the input stream. Try
do
c = getchar();
while (isspace(c));
instead of
c = getchar();
Upvotes: 13