21

如果在我的程序中我要求用户输入,我这样做是否有原因:

int number;
string str;
int accountNumber;

cout << "Enter number:";
cin >> number;
cout << "Enter name:";
getline(cin, str);
cout << "Enter account number:";
cin >> accountNumber;

为什么在输入第一个数字后,它会输出“输入姓名”,然后在我输入 getline(cin, str) 行之前的“输入帐号”之前立即输出“输入帐号”?谢谢!

4

7 回答 7

24

getline(cin, str);读取先前读取的数字之后的换行符,并立即返回此“行” 。为避免这种情况,您可以std::ws在阅读名称之前跳过空格:

cout << "Enter number:";
cin >> number;
cout << "Enter name:";
ws(cin);
getline(cin, str);
...

请注意,这也会跳过换行符后的前导空格,因此str即使用户确实输入了空格,也不会以空格开头。但在这种情况下,这可能是一个特性,而不是一个错误......

于 2009-11-16T20:50:10.340 回答
16

尝试

cout << "Enter name:";
cin.ignore();
getline(cin, str);
于 2009-11-16T20:46:41.250 回答
5

看起来你想要基于行的阅读。为此,getline如果您需要从读取的行中解析一个数字,您可能希望始终使用然后解析每一行。它使输入读数更加一致。

这样您就不必手动扫描每一行的结尾来保证下一个读取操作从新行开始。

它还简化了为重复输入请求添加错误处理。

例如

#include <string>
#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>

int parse_integer(const std::string& input)
{
    std::istringstream iss(input);
    int result;
    if (!(iss >> result))
    {
        // error - throw something?
    }
    return result;
}

int main()
{
    int number;
    std::string str;
    int accountNumber;

    std::string inputline;

    std::cout << "Enter number: ";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    number = parse_integer(inputline);

    std::cout << "Enter name:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    str = inputline;

    std::cout << "Enter account number:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    accountNumber = parse_integer(inputline);

    return 0;
}
于 2009-11-16T21:01:40.970 回答
4
cin >> number

只从缓冲区中抓取数字,它将“输入”留在缓冲区中,然后立即被 getline 抓取并解释为空字符串(或仅包含新行的字符串,我忘记了)。

于 2009-11-16T20:44:09.243 回答
2

我认为问题在于cin >>传递换行符(\n)。getline() 假定换行符是空格并将其传递。有人发布了您可以使用的解决方案。

您可以使用假人getline(cin, dummy);或真实的东西cin.ignore(100,'\n');

于 2009-11-16T20:48:59.607 回答
2
cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline
于 2009-11-16T20:36:53.610 回答
-2

不要使用getline(): 这对内存分配是一件坏事。使用fgets(). 请参阅fgets参考资料

于 2019-01-30T12:42:36.600 回答