我有这段代码:
while (true){
std::string cmdline;
if (!std::getline( std::cin, cmdline )) break;
std::istringstream cmdstream( cmdline );
std::string cmd;
cmdstream >> cmd;
...}
if条件检查是什么?如果我遗漏!
,为什么它会以无限循环结束?
答案 0 :(得分:3)
由于C ++将隐式比较插入零,因此该行
if (!std::getline( std::cin, cmdline )) break;
相当于
if (!std::getline( std::cin, cmdline ) != 0) break;
或只是
if (std::getline( std::cin, cmdline ) == 0) break;
std::getline
返回调用它的流。流将转换为bool
或void*
,具体取决于C ++库的版本。到达输入结束时,转换后的值变为零。这就是为什么在没有额外的输入要读取时循环结束的原因。
编写相同代码的另一种方法如下:
std::string cmdline;
while (std::getline( std::cin, cmdline )) {
std::istringstream cmdstream( cmdline );
std::string cmd;
cmdstream >> cmd;
...
}
这允许您将结束条件放入循环标题中,但代价是在循环外声明cmdline
。
答案 1 :(得分:1)
std::getline
返回对作为第一个参数传递的流的引用,在您的情况下为std::cin
。这意味着你的
if (!std::getline( std::cin, cmdline )) break;
相当于
std::getline( std::cin, cmdline );
if (!std::cin) break;
最后一行相当于
if (std::cin.fail()) break;
如果getline
在流中引发failbit
标志,则会突破循环。如果I / O错误或流结束条件阻止getline
读取任何内容,则会发生这种情况。
答案 2 :(得分:0)
因为根据: http://www.cplusplus.com/reference/string/string/getline/
返回参数是输入流,在本例中是std :: cin,因此如果std :: cin输入为空,则返回为空。
基本上,用户输入了什么吗?