使用getline()需要帮助

23

如果我的程序要求用户输入,并且我这样写:

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”?谢谢!

7个回答

27
getline(cin, str); 读取之前输入的数字后会包含一个换行符,因此会立即返回该“行”。为了避免这种情况,可以在读取名称之前使用std::ws跳过空格。
cout << "Enter number:";
cin >> number;
cout << "Enter name:";
ws(cin);
getline(cin, str);
...

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


3
请注意,此方法不允许用户输入空行。 - interjay

17

尝试

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

7
cin >> number

该函数仅从缓冲区中获取数字,它将保留缓冲区中的“回车”,然后立即由getline获取并解释为空字符串(或只包含换行符的字符串,我忘记了)。


是的,他只是打错了。 - Secko
@Secko 是的,那正是我想要传达的。如果我显得粗鲁,我很抱歉。 - pmr
哎呀,我好久没用流了,我忘记那些运算符的方向了。 - Ape-inago

6

看起来你想要基于行的读取。为此,您可能希望始终使用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;
}

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

3
我认为问题在于 cin >> 会传递换行符 (\n)。getline() 假设换行符是空格并将其传递。有人发布了一个解决方案,你可以使用。
你可以使用虚拟的 getline(cin, dummy); 或者真正的 cin.ignore(100,'\n');

-2

不要使用getline():它对内存分配来说是个坏东西。请使用fgets()。参见fgets 参考手册


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接