// using structures
#include <iostream>
#include <string>
using namespace std;
struct playerinfo
{
string name;
int level;
};
int main()
{
playerinfo arr[5];
for (int i = 0; i < 5; i++)
{
cout << " enter name for player " << i << endl;
getline(cin, arr[i].name, '\n');
cout << " and level \n";
cin >> arr[i].level;
}
for (int i = 0; i < 5; i++)
cout << "the level of player " << arr[i].name << " is " << arr[i].level << endl;
}
我正在阅读一本关于 C++ 语法的书,并且正在练习。我希望代码的行为使得代码要求用户填写玩家和级别的名称,然后代码将它们全部打印出来。但它不是这样的。当我运行代码并输入玩家的名字说“tom cat”然后代码询问级别并且我打印一个整数说“100”,然后意想不到的事情开始发生,我无法理解的原因.你能帮忙吗? 编辑-很少有人要求我详细说明什么“意想不到的事情”开始发生。 出乎意料的是,当我输入玩家的名字和玩家 0 的等级时,屏幕上的下一个输出是“输入玩家 1 的名字和等级”,而我预计它应该只在之后输出“和等级”我输入玩家 1 的名字。
最佳答案
当使用 operator>>()
从格式化输入切换时,例如,在 cin >> arr[i].level
和未格式化输入中,例如,使用 std::getline()
您需要注意输入中可能等待的空白:整数的格式化输入一旦找到空白(例如换行符)就会停止。另一方面,std::getline()
将在找到换行符后立即停止!所以你收到一个空行。解决方法是在切换到无格式输入时跳过前导空格,例如:
std::getline(std::cin >> std::ws, arr[i].name);
操纵符 std::ws
在与 std::istream
一起使用时会跳过前导空格。
您还应该始终在使用它们之前验证您的输入是否成功:如果任何输入失败,流将停止运行并转换为false
:
if (std::cin >> arr[i].level) {
// process the data
}
else {
// report that the input is wrong and bail out
}
关于c++ - 为什么我的小 C++ 代码表现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692860/