我有以下代码提示用户输入猫的年龄和名称:
#include <iostream>
#include <string>
int main()
{
int age;
std::string name;
std::cin >> age;
std::getline(std::cin, name);
if (std::cin)
{
std::cout << "My cat is " << age << " years old and their name is " << name << std::endl;
}
}
我发现已经成功读取了年龄,但没有读取名称。这是输入和输出:
Input: "10" "Mr. Whiskers" Output: "My cat is 10 years old and their name is "
为什么输出中省略了名称?我已经给出了正确的输入,但是代码以某种方式忽略了它。为什么会这样?
原文由 David G 发布,翻译遵循 CC BY-SA 4.0 许可协议
为什么会这样?
这与您自己提供的输入无关,而是与默认行为
std::getline()
有关系。当您提供年龄输入时(std::cin >> age
),您不仅提交了以下字符,而且当您输入Enter
时,还会在流中附加一个隐式换行符:assert(std::cin); // Success!
std::cin >> age; std::getline(std::cin >> std::ws, name);
assert(std::cin); // Success!
// Unformatted I/O std::string age, name; std::getline(std::cin, age); std::getline(std::cin, name);
// Formatted I/O int age; std::string firstName, lastName; std::cin >> age >> firstName >> lastName;
”`
如果您选择使用未格式化的操作将所有内容读取为字符串,您可以在之后将它们转换为适当的类型。