考虑以下代码:
#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
?
考虑以下代码:
#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
?
格式字符串中的空格匹配输入中的 0 个或多个空格字符。
所以"%d c %d"
期望数字,然后是任意数量的空白字符,然后是字符c
,然后是任意数量的空白字符,最后是另一个数字。
"%dc%d"
期望数字, c
, 数字。
另请注意,如果您*
在格式字符串中使用,它会禁止赋值:
%*c
= 读取 1 个字符,但不要将其分配给任何变量
因此,"%d%*c c%*c %d"
如果您想强制用户输入:数字,至少 1 个字符后跟任意数量的空白字符,c
至少 1 个字符后跟任意数量的空白字符和数字。
如果您想接受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]
意味着“读取包含任意数量的空格和制表符的字符串”;但是使用附加的*
,它变成“期望一个包含任意数量的空格和制表符的字符串;然后丢弃它”
我想我会将 scanf 结果读入不同的变量(即不重用i
和j
)作为"%d%s%d"
. 然后检查您从 %s 获得的字符串,如果它符合您的要求,请使用其他变量覆盖 i 和 j。
首先强制进行字符串解析:
char a[100], b[100];
scanf("%99s c %99s", a, b);
然后使用 sscanf() 将字符串转换为 int。