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

时间:2013-08-28 03:06:37

标签: 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;
}

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

4 个答案:

答案 0 :(得分:8)

如果在scanf()的参数中有字符文字,它希望找到与格式字符串中指定完全相同的文字。

scanf("%d", &n_sets);

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

scanf("(%d %d)", &m, &n);

期望在输入的开头找到一个左括号,但是会找到一个空白字符。所以它失败了,scanf()没有读过任何内容就返回了。因此,您的mn仍然未初始化,并且会产生垃圾结果。

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

scanf(" (%d %d)", &m, &n);

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

答案 1 :(得分:2)

变化

scanf("%d", &n_sets);

scanf("%d\n", &n_sets);

并输入以[enter]结尾的n_sets,它可以正常工作。

enter image description here

答案 2 :(得分:2)

假设你的输入是这样的:

2 (1 2) (3 4)

在第一个数字后面有一个空格(或换行?),所以将循环中的scanf更改为:

scanf("\n(%d %d)", &m, &n);
//     ^^

答案 3 :(得分:1)

这听起来像程序的输入在你想要scanf解析的值之前有一些空格。字符串中的空格告诉scanf忽略空格。没有它,scanf会立即寻找完全匹配。