11

考虑以下代码:

#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%d c %d

4

4 回答 4

14

格式字符串中的空格匹配输入中的 0 个或多个空格字符。

所以"%d c %d"期望数字,然后是任意数量的空白字符,然后是字符c,然后是任意数量的空白字符,最后是另一个数字。

"%dc%d"期望数字, c, 数字。


另请注意,如果您*在格式字符串中使用,它会禁止赋值:
%*c= 读取 1 个字符,但不要将其分配给任何变量

因此,"%d%*c c%*c %d"如果您想强制用户输入:数字,至少 1 个字符后跟任意数量的空白字符,c至少 1 个字符后跟任意数量的空白字符和数字。

于 2012-10-11T08:44:35.883 回答
7

如果您想接受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]意味着“读取包含任意数量的空格和制表符的字符串”;但是使用附加的*,它变成“期望一个包含任意数量的空格和制表符的字符串;然后丢弃它

于 2012-10-11T09:56:11.990 回答
0

我想我会将 scanf 结果读入不同的变量(即不重用ij)作为"%d%s%d". 然后检查您从 %s 获得的字符串,如果它符合您的要求,请使用其他变量覆盖 i 和 j。

于 2012-10-11T08:49:08.710 回答
0

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

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

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

于 2012-10-11T08:52:22.317 回答