需要帮助getline()

问题描述 投票:19回答:7

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

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)线?谢谢!

c++ getline
7个回答
19
投票

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

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

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


13
投票

尝试

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

5
投票

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

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

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

EG

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

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

2
投票

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

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


2
投票
cin >> number

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


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.