if(!getline(std::cin,str1))break;这个条件检查什么

if(!getline(std::cin, str1)) break; what does this condition check?

本文关键字:条件 什么 检查 break str1 getline std cin if      更新时间:2023-10-16

我有这个代码:

 while (true){
 std::string cmdline;
 if (!std::getline( std::cin, cmdline )) break;
 std::istringstream cmdstream( cmdline );
 std::string cmd;
 cmdstream >> cmd;
 ...}

if条件检查什么?如果我省略了!,为什么它会以无休止的循环结束?

由于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返回调用它的流。流被转换为boolvoid*,具体取决于C++库的版本。当达到输入的末尾时,转换后的值变为零。这就是为什么当没有额外的输入要读取时循环结束的原因。

另一种编写相同代码的方法如下:

std::string cmdline;
while (std::getline( std::cin, cmdline )) {
    std::istringstream cmdstream( cmdline );
    std::string cmd;
    cmdstream >> cmd;
    ...
}

这允许您将结束条件放入循环头中,代价是在循环外声明cmdline

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;

如果CCD_ 8在流中提升CCD_。如果I/O错误或流结束条件阻止getline读取任何内容,就会发生这种情况。

由于根据:http://www.cplusplus.com/reference/string/string/getline/

return参数是输入流,在本例中为std::cin,因此,如果std::cin输入为空,则返回为空。

基本上,用户输入了什么吗?