YAKOVM
YAKOVM

Reputation: 10163

read char from console

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

Answers (5)

Josué
Josué

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

ETFovac
ETFovac

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

Zuljin
Zuljin

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

Ed Heal
Ed Heal

Reputation: 60047

For a start the scanf should read scanf("%d\n", &x); or y. That should do the trick.

man scanf

Upvotes: 2

Fred Foo
Fred Foo

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

Related Questions