格式字符串中的空格(scanf)

请考虑以下代码:

#include int main() { int i=3, j=4; scanf("%dc %d",&i,&j); printf("%d %d",i,j); return 0; } 

如果我必须更改变量的值,我可以将2c32 c 32c 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); 

如果你想接受1c21 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结果读入不同的变量(即不重用ij )为"%d%s%d" 。 然后检查从%s获得的字符串,如果它符合您的要求,请使用其他变量覆盖i和j。

首先强制解析字符串:

 char a[100], b[100]; scanf("%99s c %99s", a, b); 

然后使用sscanf()将字符串转换为int。