scanf如何处理标准输入与流水线输入

时间:2018-01-04 05:16:29

标签: c++ input printf output scanf

在以下代码中:

#include <cstdio>
using namespace std;
int N;
char x[110];
int main() {
    scanf("%d\n", &N);
    while (N--) {
        scanf("0.%[0-9]...\n", x);
        printf("the digits are 0.%s\n", x);
    }
}

当我使用命令

输入文件输入时
  

./ a.out&lt; “INPUTFILE”

它按预期工作,但当我通过std输入输入输入时,它会延迟printf函数。

为什么?

输入

  

3
  0.1227 ...
  0.517611738 ......
  0.7341231223444344389923899277 ...

通过文件输出

  

数字为0.1227
  数字是0.517611738
  数字是0.7341231223444344389923899277

通过标准输入

输出
  

数字为0.1227
  数字是0.517611738

代码来自一本书 commpetitive programminging 3 ch1_02_scanf.cpp

2 个答案:

答案 0 :(得分:0)

将第二个scanf()行更改为

scanf(" 0.%[0-9]...", x);

答案 1 :(得分:0)

因为\n格式字符串中有额外的scanf,它会读取并丢弃所有空格(空格,换行符和制表符,如果存在)。需要指示空格序列的结束,因此您应该按Ctrl-D表示EOF,或输入另一个允许scanf停止的非WS字符。

正如 Sid S 建议的那样,您可以改变格式字符串,如下所示:

scanf(" 0.%[0-9]...", x);

该程序有效,因为当您将其stdin重定向到文件时,scanf将知道它是否到达EOF并终止最后一个输入。从控制台输入时需要手动提供EOF。这就是区别。