关于c ++:需要getline()的帮助

Need help with getline()

为什么在我的程序中要求用户输入,并且这样做呢?

1
2
3
4
5
6
7
8
9
10
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)行输入我的" str"之前? 谢谢!


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

1
2
3
4
5
6
cout <<"Enter number:";
cin >> number;
cout <<"Enter name:";
ws(cin);
getline(cin, str);
...

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


尝试

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


看起来您想要基于行的阅读。为此,您可能需要一致地使用getline,然后在需要从随后读取的行中解析一个数字时解析每一行。它使输入读数更加一致。

这样,您不必手动扫描每行的末尾以确保下一个读取操作在新行上开始。

它还使为重复输入请求添加错误处理变得更加简单。

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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;
}

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

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


1
cin >> number

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


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


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