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