什么时候输入会停止?

时间:2017-09-08 10:55:31

标签: c++ string loops io stream

大家好我有以下问题:

string s;

std::cout << "give me a string" << std::endl;  
while (std::cin >> s){
    std::cout << "give me a string" << std::endl;
}
cin.clear();  

如果 s 是一个整数,那么我知道如果我输入 char ,那么会中断。如果是整数并输入 double ,则会发生同样的情况。但是字符串呢?在某个地方,我在Windows中读到这些内容(因为我正在Windows中的netbeans中写入),你必须按ctrl + z然后它会停止,因为它被视为一个假字符串。但是当我这样做时,这个过程会冻结而没有任何反应。

2 个答案:

答案 0 :(得分:2)

您需要发送EOF信号,在Netbeans中 Ctrl + D

但是,按Enter键两次将导致循环的条件以false结算,导致循环停止。这是被怀疑的:How is "std::cin>>value" evaluated in a while loop?

如果不起作用,请使用 Ctrl + z 和换行符,即Windows中的EOF信号,如here所述。 Ctrl + D 适用于Linux,但它适用于您的情况。

EOF信号关闭输入流,从而打破循环。

此外,在Netbeans中(如果以上不起作用),您似乎需要run your application from the command prompt才能实现此目的。另一种尝试是“按下Enter键后按 Ctrl + z ”,如here所述。

答案 1 :(得分:1)

当输入流关闭时,循环将停止。

如果从shell运行程序,则输入流可能无限期打开。具体如何关闭终端中的流,取决于您使用的终端。

在UNIX中,当您发送空输入时,流将关闭。 ctrl + d是用于将输入发送(刷新)到流的标准密钥组合(^d是ASCII控制代码EOT,传输结束)。按Enter也会发送输入,但它也会插入行尾字符,因此无法使用它来发送空输入。

ctrl + z在Windows中类似,但它有different behaviour (wikipedia)

  

Unix中的EOT字符与DOS中的Control-Z不同。 DOS控制-Z字节实际上被发送和/或放置在文件中以指示文本结束的位置。相比之下,Control-D使Unix终端驱动程序发出EOF条件信号,该条件不是字符,而如果实际从文件或终端读取或写入,该字节没有特殊含义。