📅  最后修改于: 2023-12-03 15:29:49.479000             🧑  作者: Mango
在 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()
函数不等待输入的问题。
我们可以使用 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;
}
现在,程序会在用户输入字符串之前等待用户输入,而不再跳过等待输入这一步。
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::cin
和 std::getline()
函数获取用户输入时,需要注意输入缓冲区可能包含多余的字符,导致 std::getline()
函数不等待输入。我们可以通过清空输入缓冲区或使用字符串流来解决这个问题。