保持循环直到用户输入空行

Keep looping until user enters a blank line?

本文关键字:输入 用户 循环      更新时间:2023-10-16

所以我遇到了以下问题。我的目标是创建一个循环,不断地接受用户输入,直到用户没有在"cin>>"中输入任何内容,将行留空,并简单地按enter键继续前进,此时程序应该脱离循环,继续执行其余的程序。类似这样的东西:

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

正如你所看到的,我已经尝试过使用empty()函数,但没有成功,无论我按了多少次回车键,程序都只是停留在循环中,不会中断。它只是不断提示我输入一个名字。我也尝试过使用类似的东西

if (input1 == "")

但这也不起作用。有人能帮忙吗?我该如何打破这个循环?

更新:好的,伙计们,我试过你们的建议,效果很好!非常感谢!不幸的是,尽管getline函数有效,但它也给我带来了一个新的问题。基本上,在第一个初始循环中,程序会提示输入一个名称,我输入一个名字,这个名称存储在user_name中。然而,在第二个循环中,程序甚至没有给我输入任何输入的机会,它只是打印"输入一个名称:",然后立即退出循环,继续执行程序的其余部分。为什么会发生这种情况?

使用此getline(std::cin, input1):

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

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

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

使用std::getline后,您可以按如下方式留下空白支票:

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

BTW:在C++中,您还应该检查底层流是否出现错误。因此,请检查cin或getline的返回代码。这可以用以下代码完成:

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

通常情况下,循环直到输入空行是:

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" );
}

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

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

这同样有效:

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

@JamesKanze

所以用这样的方法退出while循环?

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