我有这个scanf代码行:
scanf("%d,%d %d,%d", &X, &Y, &dirX, &dirY);
如何检查输入(例如1,2 3,4
(2个逗号)是否确实是这样编写的,并且只是这样?
例如,我不想接受1,2,3,4
(3个逗号)。
答案 0 :(得分:1)
您可以做的是检查scanf()
的返回值,以查看用户输入的输入是否是正确的格式。像
int main (void)
{
int i, j, k, l;
if(scanf("%d,%d %d,%d", &i, &j, &k, &l) != 4)
printf("User entered input in wrong format\n");
printf("please enter in the format i,j k,l");
//exit here
else
printf("%d %d %d %d", i, j, k, l);
}
这使用以下事实:如果用户以其他格式输入输入(除了1,2 3,4之外),那么scanf()
将无法读取所有4
输入,因此不归4
。
答案 1 :(得分:0)
如果您确实需要精确的输入检查,为什么不仅使用scanf("%s", &s)
(只是字符串)然后使用strncmp(3)
?
格式化输入只是格式,而不是语义。因此,选项是仅对scanf
进行常规格式验证,如字段宽度,字段类型(数字或字母数字),分隔符等。语义检查进入不同的层次。
如果您需要认真检查格式和语义等输入,我建议您推荐flex和bison等工具。他们需要更多的关注,但他们更强大。
换句话说,你肯定需要这样的东西:
int main (int argc, char **argv)
{
int num. i, j, k, l;
// Check format.
num = scanf("%d,%d %d,%d", &i, &j, &k, &l);
assert(num == 4);
// Check semantics.
assert((i == 1) && (j ==2) && (k == 3) && (l == 4));
}