c++ 当没有输入任何内容时结束循环

a1o7rhls  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(538)

通常我写一个控制循环如下:输入的循环将int写入向量nVec,直到输入“done”。

while (cin >> sString){
    if (sString="done")
    { 
        break;
    }
    nVec.push_back(sString);

}

这很好用,但是如果我想让循环在用户什么都没输入(只是按了回车键)时结束,我该怎么做呢?

5t7ly7z5

5t7ly7z51#

你不能在token-wise提取中“不输入任何东西”。停止循环的唯一方法是用户发送文件结束(Linux上的Ctrl-D)。我个人认为这是正确的行为,但如果你想以空输入结束,你需要阅读行:

Sales_item total;

for (std::string line; std::getline(std::cin, line); )
{
     if (line.empty()) { exit_program(); /* or "break" */ }

     std::istringstream iss(line);
     for (Sales_item book; iss >> book; )
     {
          total += book;
          std::cout << "The current total is " << total << std::endl;
     }
}

这样,你就可以将每行标记为多本书。如果你只想每行一本书,那么去掉内部循环,只写std::istringstream(line) >> book;

t9aqgxwy

t9aqgxwy2#

实际上,当输入“nothing”时,它可能会中断。您可以使用stream_buf来实现这一点。下面是您的代码按预期工作:

auto buff = std::cin.rdbuf();
while (true)
{
    // if a newline was entered
    if (buff->sgetc() == '\n')
    {
        // discard the newline
        buff->stossc();
        // get next character, if newline then quit
        if (buff->sgetc() == '\n')
        {
            buff->stossc();
            break;
        }
    }
    
    // read input into string
    std::cin >> sString;
    nVec.push_back(sString);
}

此代码将等待输入空换行符后退出。
如果你想在一行中输入所有的字符串,并且在第一个换行符处换行,那么你可以使用下面的代码:

auto buff = std::cin.rdbuf();
while (buff->sgetc() != '\n')
{
    // read input into string
    std::cin >> sString;
    nVec.push_back(sString);
}

buff->stossc();

相关问题