Scanf无法按预期工作

时间:2016-06-24 12:13:27

标签: c++ scanf cin

我尝试比较std::cinscanf,我希望它们具有相同的行为,但实际上并非如此:

#include<iostream>
using namespace std;
int main()
{
  int i;
  cin>>i;
  return 0;
}

这会收到用户的输入,没问题。 但

#include<stdio.h>
int main()
{
  int i;
  scanf("%d\n",&i);
  return 0;
}

我输入一个整数,即使按下&#34;输入&#34;程序也不会终止。多次,除非我输入另一个整数。

请注意&#34; \ n&#34;在scanf的格式字符串中。 所以我试着添加一个语句

printf("%d\n", i);

好吧,它打印出我输入的第一个数字。这是正确但很奇怪,为什么在scanf之后,程序要求我输入任何字符而不是\n,以退出程序?

我尝试了VC和GCC,同样的问题。什么是\n表示?

2 个答案:

答案 0 :(得分:3)

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

让我们阅读manpage of scanf :

  

空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空格字符包括空格,换行符和制表符 - 请参阅isspace)。格式字符串中的单个空格验证从流中提取的任何数量的空白字符(包括无)。

这意味着scanf将搜索一个整数,后跟一个optionnal空格。这就是他等你两次进入的原因。如果您使用"%d\n\n",那么它必须是三次。等等。

如果您只想要一个整数,请使用scanf("%d",&i);

答案 1 :(得分:2)

scanf("%d\n",&i);相当于std::cin >> i >> std::ws;

如果您希望scanf采用相同的行为,请删除\nscanf("%d",&i);

这是因为scanf中的任何空格字符意味着“跳过输入,直到找到非空格”