3

所以我遇到了以下问题。我的目标是创建一个循环,不断地接受用户输入,直到用户没有在“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 中。然而,在第二个循环中,程序甚至没有给我输入任何输入的机会,它只是打印“输入名称:”,然后立即退出循环,继续执行程序的其余部分. 为什么会这样?

4

6 回答 6

7

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

while (getline(std::cin, input1))
{
    if (input1.empty())
        break;
    username =input1;
    std::cout << input1 << std::endl << "Enter Input : ";
}
于 2013-08-04T09:46:55.497 回答
4

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

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

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

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

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

if(!std::getline(cin, input1))
    // I/O error
于 2013-08-04T09:45:29.407 回答
2

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

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

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

于 2013-08-04T11:38:43.210 回答
0

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

于 2013-08-04T12:07:20.577 回答
0

这也有效:

char line[128];

do
{
    cout << "Enter something: ";
    gets(line);
} while (strcmp(&line[0], "\0") != 0);
于 2013-08-04T11:49:53.587 回答
0

@JamesKanze

所以像这样退出while循环?

string str = "foo";
while (str == "foo"){
    getline(cin, str);
}
str = "foo";
于 2017-02-26T07:58:56.230 回答