使用终端无法获得准确的输出形式

时间:2015-09-14 12:57:27

标签: c++ terminal output

#include <iostream>
using namespace std;
int main()
{
    int t;
    int n;

    cin>>t;
    while(t--) {
        cin>>n;
        cout<<n<<endl;
    }
}

输入测试文件:

2
1
2

现在,当我复制此输入并将其粘贴到终端时,它会输出如下输出:

2
1
21

2

Process returned 0 (0x0)   execution time : 3.485 s
Press ENTER to continue.

但我希望输出采用以下格式,就像IDE中的代码块一样。

2
1
1
2
2

将输入复制到终端时,是否可以以这种格式显示输出?

2 个答案:

答案 0 :(得分:1)

您的代码会为您生成所需的正确输入。您的问题很可能是将粘贴输入到终端中,因此所有内容都会立即显示。如果您使用键盘手动输入输入,逐个,则应生成所需的视图。

虽然我不知道为什么你会这样做,因为你的终端“输出”的某些行不是输出而是由于竞争条件而输入。

2 // Input (stdin)
1 // Input (stdin)
1 // Output (stdout)
2 // Input (stdin)
2 // Output (stdout)

修改:回复对此回答的评论

  

我希望在粘贴输入后按下输入后stdout有2 1 1 2 2。

要实现这一点,您需要了解stdinstdout之间的区别,同时在运行应用程序时打印到终端,它们是单独的流。 stdin通常从键盘读取,这与通常打印到终端输出窗口的stdout不同。

以下简单程序将输入和输出分成两个独立的for循环,以便您可以看到差异。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int t, n, i;
    vector<int> numbers;

    cin >> t;

    // Input
    for (i = 0; i < t; ++i) {
        cin >> n;
        numbers.push_back(n);
    }

    // Output
    cout << t << endl;
    for (vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
        cout << *it << "\n" << *it << endl;
    }
}

运行此程序时,您将看到

$ ./a.out
2
1
2
2
1
1
2
2

在此“输出”中,前3个数字来自stdin,而后5个来自stdout,并产生您需要的正确输出。

$ ./a.out
2 // Input (stdin)
1 // Input (stdin)
2 // Input (stdin)
2 // Output (stdout)
1 // Output (stdout)
1 // Output (stdout)
2 // Output (stdout)
2 // Output (stdout)

答案 1 :(得分:0)

您的输入反馈与程序输出之间存在竞争条件。

在复制和粘贴输入时,无法以便携方式阻止终端显示您输入的内容。

如果您延迟程序的输出,直到您确定没有输入,您总能得到可靠的结果。但除非你自己人性化,耐心地等待上一行的输出然后再输入你的下一行,否则你无法反过来。但是,对于大多数终端的复制粘贴工具,你无法实现这一目标。