读取数据并使用scanf跳过括号

jfl*_*fly 2 c scanf

我编写了一个C程序来从std输入中选择数据,该数据从一个数字开始,表示数据集的数量,然后有N对数据,形式为:(xy),所以我把代码编写为下面:

#include <stdio.h>

int main()
{
    int n_sets;
    scanf("%d", &n_sets);
    int i;
    for(i = 0; i < n_sets; ++i)
    {
        int m, n;
        scanf("(%d %d)", &m, &n);
        printf("%d\t%d\n", m, n);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.输入数据集后,程序直接打印未初始化的m&n.但是当我在之前添加一个空格时(%d %d),它运行正常.有人可以解释一下吗?

ver*_*ose 8

当你的参数中有字符文字时scanf(),它希望完全按照格式字符串中的指定找到那些文字.

scanf("%d", &n_sets);
Run Code Online (Sandbox Code Playgroud)

正确读取n_sets,并在缓冲区中的换行符或其他空白字符处停止.下一个scanf():

scanf("(%d %d)", &m, &n);
Run Code Online (Sandbox Code Playgroud)

期望在输入的开头找到一个左括号,但是找到一个空白字符.所以它失败了,scanf()没有读过任何东西就返回了.因此,您的m并且n保持未初始化和垃圾结果.

当您在开括号之前放入空格时,如下所示:

scanf(" (%d %d)", &m, &n);
Run Code Online (Sandbox Code Playgroud)

它告诉scanf()在输入缓冲区中的括号之前跳过任何前导空格,以便程序正常工作.