c++ - 为什么我的小 C++ 代码表现异常?

标签 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;
}

我正在阅读一本关于 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/

相关文章:

c++ - 使用宏替代功能

c++ - 如何在 CMainFrame 中处理鼠标点击

C++ - 优化一行

c++ - 具有模板化静态成员函数的模板化类与实现中的原型(prototype)不匹配

c# - 当在后台线程上创建的 Dispatcher 没有关闭时会发生什么?如何确保调度程序正确关闭?

c++ - 捕获自定义异常 C++

c++ - 指针和智能指针的区别

c++ - 如何初始化 C++ 结构中的内置数组

c++ - 分配 avpkt.size 时,avcodec_decode_video2 崩溃

c++ - int * array[60] 和 int * array = new int(60); 之间的区别