为什么我的小c ++代码出乎意料?

Ara*_*hya 1 c++

// 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;
}
Run Code Online (Sandbox Code Playgroud)

我正在读一本关于c ++语法的书,我正在练习.我希望代码的行为使得代码要求用户填写播放器的名称和级别,然后代码将它们全部打印出来.但它的表现并不像这样.当我运行代码并输入播放器的名称说"汤姆猫"然后代码询问级别,我打印一个整数说"100",然后意外的事情开始发生,其中的原因,我无法理解.你能帮忙吗?编辑 - 很少有人让我详细说明"意想不到的事情"开始发生的事情.意想不到的是,当我输入播放器的名称和播放器0的级别时,屏幕上的下一个输出是"输入播放器1和级别的名称",而我希望它只能输出"和级别"之后我输入了播放器1的名称.

Die*_*ühl 6

当使用operator>>()例如in cin >> arr[i].level和unformatted输入从格式化输入切换时,例如,使用std::getline()你需要知道可能在输入中等待的空格:整数的格式化输入一旦找到空格就停止,例如换行符.另一方面,std::getline()一旦找到换行符就会停止!所以你得到一个空行.修复是在切换到无格式输入时跳过前导空格,例如:

std::getline(std::cin >> std::ws, arr[i].name);
Run Code Online (Sandbox Code Playgroud)

std::ws当使用它时,操纵器会跳过前导空格std::istream.

在使用它们之前,您还应始终验证输入是否成功:如果任何输入失败,流将停止运行并转换为false:

if (std::cin >> arr[i].level) {
    // process the data
}
else {
    // report that the input is wrong and bail out
}
Run Code Online (Sandbox Code Playgroud)