我编写了一个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)
之前添加空格时,它可以正常工作。有人可以解释一下吗?
答案 0 :(得分:8)
如果在scanf()
的参数中有字符文字,它希望找到与格式字符串中指定完全相同的文字。
scanf("%d", &n_sets);
正确读取n_sets
,并在缓冲区中的换行符或其他空白字符处停止。下一个scanf()
:
scanf("(%d %d)", &m, &n);
期望在输入的开头找到一个左括号,但是会找到一个空白字符。所以它失败了,scanf()
没有读过任何内容就返回了。因此,您的m
和n
仍然未初始化,并且会产生垃圾结果。
当您在开括号之前放入空格时如下:
scanf(" (%d %d)", &m, &n);
它告诉scanf()
在输入缓冲区的括号之前跳过任何前导空格,以便程序正常工作。
答案 1 :(得分:2)
变化
scanf("%d", &n_sets);
到
scanf("%d\n", &n_sets);
并输入以[enter]结尾的n_sets,它可以正常工作。
答案 2 :(得分:2)
假设你的输入是这样的:
2 (1 2) (3 4)
在第一个数字后面有一个空格(或换行?),所以将循环中的scanf
更改为:
scanf("\n(%d %d)", &m, &n);
// ^^
答案 3 :(得分:1)
这听起来像程序的输入在你想要scanf解析的值之前有一些空格。字符串中的空格告诉scanf忽略空格。没有它,scanf会立即寻找完全匹配。