格式字符串中的空格(scanf)
请考虑以下代码:
#include int main() { int i=3, j=4; scanf("%dc %d",&i,&j); printf("%d %d",i,j); return 0; }
如果我必须更改变量的值,我可以将2c3
或2 c 3
或2c 3
作为输入。 如果我希望用户输入我想要的相同模式,我该怎么办意味着如果%dc%d
然后只有2c3
是可接受的而不是2 c 3
,反之亦然如果它是%dc %d
?
格式字符串中的空格与输入中的0个或更多空格字符匹配。
所以"%dc %d"
需要数字,然后是任何数量的空白字符,然后是字符c
,然后是任意数量的空白字符和最后的另一个数字。
"%dc%d"
需要数字c
,数字。
另请注意,如果在格式字符串中使用*
,则会禁止赋值:
%*c
=读取1个字符,但不要将其分配给任何变量
因此,如果要强制用户输入以下内容,则可以使用"%d%*cc%*c %d"
:数字,至少1个字符后跟任意数量的空白字符, c
,至少1个字符后跟任意数量的空白字符再次和数字。
如果要接受1c2
但不接受1 c 2
,请使用不带空格的模式:
scanf("%dc%d", &x, &y);
如果你想接受1c2
和1 c 2
(以及1 \t \tc \t 2
等),请使用带有空格的模式:
scanf("%dc %d", &x, &y);
如果要接受1 c 2
但不接受1c2
,请添加包含空格的假字符串:
scanf("%d%*[ \t]c%*[ \t]%d", &x, &y);
格式字符串%[ \t]
表示“读取包含任意数量空格和制表符的字符串”; 但使用额外的*
,它变成“ 期望一个包含任意数量的空格和制表符的字符串;然后丢弃它 ”
我想我会将scanf结果读入不同的变量(即不重用i
和j
)为"%d%s%d"
。 然后检查从%s获得的字符串,如果它符合您的要求,请使用其他变量覆盖i和j。
首先强制解析字符串:
char a[100], b[100]; scanf("%99s c %99s", a, b);
然后使用sscanf()将字符串转换为int。