Scanf() 不区分括号

Scanf() does not distinguish between brackets

提问人:vojtam 提问时间:10/15/2023 最后编辑:TechGeek49vojtam 更新时间:10/16/2023 访问量:95

问:

我有这个测试代码:


#include <stdio.h>
#include <stdlib.h>


int main(){

    int a, b;

    int ret = scanf("( %d , %d )", &a, &b);


    if (ret != 2 ){

        printf("Wrong input!\n");
        return EXIT_FAILURE;
    }

    printf("Everything fine\n");
    return EXIT_SUCCESS;
}

如您所见,main 函数需要输入,例如 。此输入失败。但是这个输入是可以的。为什么呢?如何使用scanf()在括号类型之间进行区分?(10, 15)(10, 15test(10, 15]

c 扫描

评论

1赞 n. m. could be an AI 10/15/2023
无法重现。您使用的是什么编译器?
0赞 vojtam 10/15/2023
@n.m.couldbeanAI g++
0赞 pmg 10/15/2023
scanf()不是这项工作的合适工具。
3赞 n. m. could be an AI 10/15/2023
为什么要使用 C++ 编译器编译 C 代码?

答:

2赞 Ted Lyngmo 10/15/2023 #1

这两者都可以使用,并且将成功提取两个:scanfint

(10, 15test
(10, 15]

不匹配的部分 和 将保留在输入流中,因此如果或不是预期的,则下一个完成很可能会失败。test]scanftest]

这意味着,如果你有一个循环:

while (scanf("( %d , %d )", &a, &b) == 2) {
    printf("%d, %d\n", a, b);
}

并给出上面的输入,只有第一个会成功。scanf

要在成功提取后丢弃所有内容,您可以一直读取到行尾,或者一直只读取完整的行,然后一次解析一行:sscanf

char buf[1024];

while (fgets(buf, sizeof buf, stdin) && sscanf(buf, "( %d , %d )", &a, &b) == 2) {
    printf("%d, %d\n", a, b);
}

如果要验证数字后面是否包含 a,则需要提取:))

char buf[2];
scanf(" ( %d , %d %1[)]", &a, &b, buf) == 3

(或同上使用)sscanf

3赞 dave_thompson_085 10/15/2023 #2

请注意,%d 之前不需要空格 -- 所有数字 scanf 说明符,以及 %s,但不包括 %c 和 %[...],跳过任何与空格相同的前导空格。如果要在逗号和 %1[)] 之前允许空格,则需要空格,而示例数据未显示空格。

int a,b; char c[2 /* or more */];

int ret = scanf("(%d ,%d %1[)]", &a,&b,c);
if( ret == 3 ) // all good