为什么getline跳过第一行?

7
在下面的代码中,getline()跳过读取第一行。 我注意到当注释掉"cin >> T"这一行时,它正常工作。但我无法弄清原因。 在读取行之前,我想先读取一个整数!如何修复?
#include <iostream>
using namespace std;

int main () {
    int T, i = 1;
    string line;

    cin >> T;

    while (i <= T) {
        getline(cin, line);
        cout << i << ": " << line << endl;
        i++;
    }

    return 0;
}
3个回答

11
cin >> T;

这会消耗你在标准输入(stdin)中提供的整数。

当你第一次调用时:

getline(cin, line)

当你输入一个整数后,你需要消耗掉换行符。

你可以通过在cin >> T;之后添加以下代码使cin忽略换行符:ignore

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

在使用std::numeric_limits时,您需要包含 #include <limits>


4
很可能你的输入文件中有一个换行符,这个问题在这个页面上已经解释了:http://augustcouncil.com/~tgibson/tutorial/iotips.html。你可以调用cin.ignore()来拒绝一个字符,但是你可能需要阅读更多的提示,因为有关于如何处理读取数字的建议。

@Osama:该页面已经有详细的文档说明。我在我的回答中添加了一个简单的修复方法,但你真的应该仔细阅读并理解解释。 - johnsyweb

3

这行代码只读取一个数字:

cin >> T;

如果您想解析用户输入,需要考虑到他们会不断按<enter>键,因为输入是缓冲的。为了避免这种情况,有时候更简单的方法是使用getline来读取交互式输入,然后解析行的内容。

std::string userInput;
std::getline(std::cin, userInput);

std::stringstream(userInput) >> T;

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