SCANF无法正常工作

Scanf does not work as expected

本文关键字:工作 常工作 SCANF      更新时间:2023-10-16

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

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

这将收到来自用户的输入,没问题。但是

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

i输入整数,即使我多次按" Enter",程序也不会终止,除非我输入另一个整数号码。

请注意,Scanf的格式字符串中有一个" n"。所以我尝试添加一个语句

printf("%dn", i);

很好,它打印出我刚输入的第一个号码。这是正确但很奇怪的,为什么在扫描后,该程序要求我输入任何角色而不是n,以退出程序?

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

  scanf("%dn",&i);

让我们阅读scanf的manpage:

whitespace字符:该功能将读取并忽略下一个非Whitespace字符之前遇到的任何空格字符(Whitespace字符包含空格,Newline和Tab字符 - 请参见ISSPACE)。格式字符串中的单个空格验证了从流中提取的任何数量的白色空格字符(包括无)。

scanf的含义将搜索一个整数,然后是选项whitespace。这就是为什么他在等你两次输入。如果使用"%dnn",则必须是三次。等等。

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

scanf("%dn",&i);等于 std::cin >> i >> std::ws;

如果您想要scanf的相同行为,请删除nscanf("%d",&i);

这是由于 scanf中的任何空格字符含义"跳过输入直到找到非惠特的事实)引起的。