📜  c++ getline 不等待输入 - C++ (1)

📅  最后修改于: 2023-12-03 15:29:49.479000             🧑  作者: Mango

C++ getline 不等待输入

在 C++ 中,我们通常使用 std::cin 获取用户输入。而当我们需要获取一行或多行输入时,我们会使用 std::getline() 函数。然而,有时候 std::getline() 函数似乎不起作用,程序会直接跳过等待用户输入这一步。这通常是由于输入缓冲区中包含了多余的字符造成的。

问题分析

当我们使用 std::cin 输入一个数字或字符串时,输入数据会被存储在输入缓冲区中。如果输入的数据长度大于缓冲区长度,那么多余的字符会留在输入缓冲区中。当我们随后使用 std::getline() 函数获取一行输入时,函数会读取输入缓冲区中的数据,包括多余的字符,直到遇到第一个换行符 \n。因此,可能会导致 std::getline() 函数直接跳过等待用户输入这一步。

例如,考虑以下代码:

#include <iostream>
#include <string>

int main() {
    std::string input;
    int number;

    std::cout << "Please enter a number: ";
    std::cin >> number;

    std::cout << "Please enter a string: ";
    std::getline(std::cin, input);

    std::cout << "You entered: " << input << std::endl;
    return 0;
}

当我们运行这个程序并依次输入数字和字符串时,程序会直接跳过等待输入字符串的这一步,输出结果会显示为空字符串。

解决方案

有多种方式可以解决 std::getline() 函数不等待输入的问题。

1. 清空输入缓冲区

我们可以使用 std::cin.ignore() 函数来清空输入缓冲区中的多余字符,直到遇到第一个换行符 \n。代码如下:

#include <iostream>
#include <string>

int main() {
    std::string input;
    int number;

    std::cout << "Please enter a number: ";
    std::cin >> number;
    std::cin.ignore();

    std::cout << "Please enter a string: ";
    std::getline(std::cin, input);

    std::cout << "You entered: " << input << std::endl;
    return 0;
}

现在,程序会在用户输入字符串之前等待用户输入,而不再跳过等待输入这一步。

2. 使用 std::getline() 读取所有输入

我们可以使用 std::getline() 函数读取所有的输入,包括数字和字符串。然后,我们可以将读取到的字符串转换为数字,或使用字符串流进行解析。代码如下:

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string input;
    int number;

    std::cout << "Please enter a number and a string: ";
    std::getline(std::cin, input);

    std::stringstream ss(input);
    ss >> number >> input;

    std::cout << "You entered: " << number << " and " << input << std::endl;
    return 0;
}

现在,我们可以在一行中输入数字和字符串,程序会正确解析输入并输出结果。

结论

在 C++ 中,使用 std::cinstd::getline() 函数获取用户输入时,需要注意输入缓冲区可能包含多余的字符,导致 std::getline() 函数不等待输入。我们可以通过清空输入缓冲区或使用字符串流来解决这个问题。