【问题标题】:Scanf does not work as expectedScanf 没有按预期工作
【发布时间】:2016-06-24 12:13:27
【问题描述】:

我尝试比较 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;
}

我输入一个整数,即使我多次按“enter”,程序也不会终止,除非我输入另一个整数。

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

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

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

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

【问题讨论】:

    标签: c++ scanf cin


    【解决方案1】:
      scanf("%d\n",&i);
    

    让我们阅读manpage of scanf :

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

    这意味着 scanf 将搜索一个整数,后跟一个可选的空格。这就是为什么他在等你使用两次进入。如果您使用"%d\n\n",则必须是三倍。以此类推。

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

    【讨论】:

      【解决方案2】:

      scanf("%d\n",&amp;i); 等价于std::cin &gt;&gt; i &gt;&gt; std::ws;

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-21
        • 2021-10-19
        • 2020-03-18
        • 2012-06-14
        • 2014-11-15
        • 1970-01-01
        • 2012-07-02
        • 2011-09-07
        相关资源
        最近更新 更多