检查特定的scanf格式

时间:2015-12-22 19:03:37

标签: c

我有这个scanf代码行:

scanf("%d,%d %d,%d", &X, &Y, &dirX, &dirY);

如何检查输入(例如1,2 3,4(2个逗号)是否确实是这样编写的,并且只是这样?

例如,我不想接受1,2,3,4(3个逗号)。

2 个答案:

答案 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进行常规格式验证,如字段宽度,字段类型(数字或字母数字),分隔符等。语义检查进入不同的层次。

如果您需要认真检查格式和语义等输入,我建议您推荐flexbison等工具。他们需要更多的关注,但他们更强大。

换句话说,你肯定需要这样的东西:

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));
}