需要帮助getline()

时间:2009-11-16 20:31:27

标签: c++ getline

有没有理由说如果在我的程序中我要求用户输入,我会这样做:

int number;
string str;
int accountNumber;

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

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

7 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:13)

尝试

cout << "Enter name:";
cin.ignore();
getline(cin, str);

答案 2 :(得分:5)

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

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

它还可以简化重复输入请求的错误处理。

e.g。

#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;
}

答案 3 :(得分:2)

cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline

答案 4 :(得分:2)

cin >> number

只从缓冲区中获取数字,它在缓冲区中留下“enter”,然后由getline立即抓起并解释为空字符串(或者只是新行的字符串,我忘了)。 / p>

答案 5 :(得分:2)

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

您可以使用虚拟getline(cin, dummy);或真实cin.ignore(100,'\n');

答案 6 :(得分:-2)

不要使用getline():这对于内存分配是一件坏事。使用fgets()。参见fgets reference