【问题标题】:Keep looping until user enters a blank line?继续循环直到用户输入一个空行?
【发布时间】:2013-08-04 09:41:38
【问题描述】:

所以我遇到了以下问题。我的目标是创建一个循环,不断地接受用户输入,直到用户没有在“cin >>”中输入任何内容,将该行留空,然后简单地按下 ENTER 键继续前进,此时程序应该跳出循环并继续执行程序的其余部分。像这样的:

 do { 
    cout << "\nEnter a name: ";
    cin >> input1;
    if (input1.empty())
    {
        break;
    }
    else
    {
        user_name = input1;
    }
   } while (!input1.empty());

如您所见,我已经尝试过使用 empty() 函数,但是没有用,程序只是停留在循环中并且不会中断,无论我按了多少次 Enter。它只是不断提示我输入一个名字。我也尝试过使用类似的东西

if (input1 == "")

但这也不起作用。任何人都可以帮忙吗?如何跳出这个循环?

更新:好的,伙计们,我已经尝试了您的建议,并且成功了!太感谢了!不幸的是,虽然 getline 函数有效,但它也给我带来了一个新问题。基本上,在第一个初始循环中,程序提示输入一个名称,我输入一个名称,该名称存储在 user_name 中。然而,在第二个循环中,程序甚至没有给我输入任何输入的机会,它只是打印“输入名称:”,然后立即退出循环,继续执行程序的其余部分.为什么会这样?

【问题讨论】:

  • input1有什么类型?标准::字符串?
  • 您是否在每个 if 语句之后刷新/清除 input1?如果在第一次运行时直接按回车会发生什么?

标签: c++


【解决方案1】:

使用这个getline(std::cin, input1)

while (getline(std::cin, input1))
{
    if (input1.empty())
        break;
    username =input1;
    std::cout << input1 << std::endl << "Enter Input : ";
}

【讨论】:

  • 或者更好,getline(...) &amp;&amp; ! input1.empty()
  • @Potatoswatter 是的。任何时候你看到 break 被用来退出循环,这是一个很好的迹象,表明程序员还没有真正考虑过他在做什么:循环不变量和其余部分。
【解决方案2】:

改用std::getline(cin, input1); 从控制台读取一行。

使用cin 直接从标准输入准确读取一个单词。如果用户没有输入任何内容,则表示没有给出任何单词并且cin 还没有返回(甚至没有执行您的空检查)。

使用std::getline 后,您可以保留空支票:

    std::getline(cin, input1);
    if(input1.empty())
        break;

顺便说一句:在 C++ 中,您还应该检查底层流是否遇到错误。所以检查cin或getline的返回码。这可以通过以下代码完成:

if(!std::getline(cin, input1))
    // I/O error

【讨论】:

  • 大家好,感谢您的建议,他们真的很有帮助。然而,虽然 getline 函数有效,但它也给我带来了新的问题。基本上,在第一个初始循环中,程序提示输入一个名字,我输入一个名字,名字存储在 user_name 中。然而,在第二个循环中,程序甚至没有给我输入任何输入的机会,它只是打印“输入名称:”,然后立即退出循环,继续执行程序的其余部分.为什么会这样?
  • 也许在一个新问题中显示你的新代码,你很可能做错了什么。例如。您可能在两者之间有一个“cin >>”,它在流中留下了“换行符”字符 - 这反过来由您的 getline() 读取。
  • @GribblesChan:大概你在循环中有一个“cin >>”。将 cin.ignore() 放在后面。
【解决方案3】:

一般来说,循环直到输入一个空行是:

while ( std::getline( line ) && !line.empty() ) ...

如果需要提示:提示是输入逻辑的一部分,并且 应该这样实现:

std::string
getlineWithPrompt( std::string const& prompt )
{
    std::cout << prompt;
    std::string results;
    return std::getline( std::cin, results )
        ?  results
        :  std::string();
}

然后你做这样的事情:

std::string line = getlineWithPrompt( "prompt for first line" );
while ( !line.empty() ) {
    //  ...
    getlineWithPrompt( "prompt for further line" );
}

(这实际上有点简化,因为它处理硬错误 在输入、文件结尾和空行相同,即 在专业软件中很少有正确的东西。但对于 学习目的,应该足够了。)

【讨论】:

    【解决方案4】:

    Cin 不会读取您称为空行的空格。 Getline 可能会这样做,但我不完全确定。您可以定义一个用户将键入并检查的结束字符。 Gets 也可以,它只是将起始字符设置为 0x0。小心gets(),容易导致缓冲区溢出。

    【讨论】:

      【解决方案5】:

      这也有效:

      char line[128];
      
      do
      {
          cout << "Enter something: ";
          gets(line);
      } while (strcmp(&line[0], "\0") != 0);
      

      【讨论】:

      【解决方案6】:

      @JamesKanze

      所以像这样退出while循环?

      string str = "foo";
      while (str == "foo"){
          getline(cin, str);
      }
      str = "foo";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        相关资源
        最近更新 更多