我编写了一个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),它运行正常.有人可以解释一下吗?
当你的参数中有字符文字时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()在输入缓冲区中的括号之前跳过任何前导空格,以便程序正常工作.