Scanf使用\ n。不知道它做了什么

时间:2015-04-15 19:18:04

标签: c++ c++11 scanf

我是编程新手,我无法弄清楚发生了什么。这是我的代码:

#include <iostream>
#include <stdio.h>
using namespace std;

int main(){
   int c,d;
   scanf("%d\n", &c);
   cout<<c<<endl;
   return 0;
}

我无法理解为什么它会输入两个输入并打印出第一个输入。

2 个答案:

答案 0 :(得分:2)

\n格式字符串中的scanf表示读取任意数量的whitespace

因此,为了确保执行此操作,它必须继续读取,直到它读取非空格字符。

另一个因素是终端输入默认为行缓冲;因此,在您按Enter键之前,scanf无法检查数据。

结果是您需要输入您的号码和另一个非空格字符,然后按Enter键以满足"%d\n"

答案 1 :(得分:-1)

首先,不要将C风格的输入/输出(sacnfprintf等)与C ++风格(coutcin,stc混合使用)。 关于您的问题,问题出在scanf函数的格式行中。将代码更改为:

#include <iostream>
#include <stdio.h>
using namespace std;

int main(){
   int c,d;
   scanf("%d", &c);
   cout<<c<<endl;
   return 0;
}

并看到差异。

"%d\n"为什么需要第二次输入的最简单解释是: scanf使用%d作为在输入流中查找数字的指令,其他\n需要等待代码等于换行代码的字符,但scanf始终停止读取输入流并在读取换行符后停止工作,因此scanf("%d\n", &c)需要两个换行符 - 第一个用于满足格式行的要求,第二个用于确保输入已完成。