3

我写了一个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&n。但是当我在 之前添加一个空格时(%d %d),它可以正常工作。有人可以解释一下吗?

4

4 回答 4

9

当您的参数中有字符文字时scanf(),它希望找到与格式字符串中指定的完全一致的文字。

scanf("%d", &n_sets);

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

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

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

当您像这样在左括号之前放入空格时:

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

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

于 2013-08-28T03:16:10.967 回答
2

改变

scanf("%d", &n_sets);

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

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

在此处输入图像描述

于 2013-08-28T03:12:22.400 回答
2

假设您的输入是这样的:

2 (1 2) (3 4)

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

scanf("\n(%d %d)", &m, &n);
//     ^^
于 2013-08-28T03:21:01.667 回答
1

听起来程序的输入在您希望 scanf 解析的值之前有一些空格。字符串中的空格告诉 scanf 忽略空格。没有它,scanf 会立即寻找精确匹配。

于 2013-08-28T03:12:26.563 回答