Consider the following code:
#include<stdio.h>
int main() {
int i=3, j=4;
scanf("%d c %d",&i,&j);
printf("%d %d",i,j);
return 0;
}
It works if I give 2c3
or 2 c 3
or 2c 3
as input if I have to change the value of variables. What should I do if I want the user to enter the same pattern as I want means if %dc%d
then only 2c3
is acceptable and not 2 c 3
and vice versa if it is %d c %d
?
Whitespace in the format string matches 0 or more whitespace characters in the input.
So "%d c %d"
expects number, then any amount of whitespace characters, then character c
, then any amount of whitespace characters and another number at the end.
"%dc%d"
expects number, c
, number.
Also note, that if you use *
in the format string, it suppresses assignment:
%*c
= read 1 character, but don't assign it to any variable
So you can use "%d%*c c%*c %d"
if you want to force user to enter: number, at least 1 character followed by any amount of whitespace characters, c
, at least 1 character followed by any amount of whitespace characters again and number.
If you want to accept 1c2
but not 1 c 2
, use the pattern without the space:
scanf("%dc%d", &x, &y);
If you want to accept 1c2
and 1 c 2
(and also 1 \t \t c \t 2
etc), use the pattern with the space:
scanf("%d c %d", &x, &y);
If you want to accept 1 c 2
but not 1c2
, add a fake string containing whitespace:
scanf("%d%*[ \t]c%*[ \t]%d", &x, &y);
Here the format string %[ \t]
would mean "read a string that contains any number of space and tab characters"; but using the additional *
, it becomes "expect a string that contains any number of space and tab characters; then discard it"
I think I would read the scanf result into different variables (i.e. not reuse i
and j
) as "%d%s%d"
. Then check the string you got from the %s and if it matches your requirements, use the other variables to overwrite i and j.
Force a string parsing first :
char a[100], b[100];
scanf("%99s c %99s", a, b);
Then use sscanf() to convert the strings to int.