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

时间:2012-10-11 08:32:46

标签: c input whitespace scanf stdio

请考虑以下代码:

#include<stdio.h>
int main() {
    int i=3, j=4;
    scanf("%d c %d",&i,&j);
    printf("%d %d",i,j);
    return 0;
}

如果我必须更改变量值,我可以将2c32 c 32c 3作为输入。如果我希望用户输入我想要的相同模式,我该怎么办意味着%dc%d只有2c3是可接受的而不是2 c 3,反之亦然{{1} }?

4 个答案:

答案 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);

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

答案 3 :(得分:0)

首先强制执行字符串解析:

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

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