c++ - 数组的值随机变化

标签 c++ arrays struct

所以我有一个包含篮球运动员信息的文本文件,它看起来像这样:

8
9 5 7 -5 13 -4 11
7 5 -3 12 -5 17 -3
25 7 12 -3 5 -5 7 -5 3
14 5 12 -3 10 -7 8
5 1 -40
33 5 15 -5 9 -3 8
11 5 -12 8 -5 12 -3
13 5 3 -4 25 -5 3

第一行的第一个整数表示有多少玩家。在每隔一行中,第一个整数是玩家的编号,第二个整数表示该行中还有多少个整数,接下来的每个整数表示玩家是在玩游戏(如果整数是正数)还是坐在长凳(如果数字为负)。

我想将信息读入一个结构数组,如下所示:

struct player
{
    int nr;
    int k;
    int bus[];
};

我已经编写了一个函数来执行此操作:

void skaitymas(int &n, player mas[])
{
    ifstream duom("U1.txt");
    duom >> n;
    for (int i=0; i < n; i++) {
        duom >> mas[i].nr >> mas[i].k;
        for (int f=0; f < mas[i].k; f++) {
            duom >> mas[i].bus[f];
        }
    }
}

当我运行它时,程序似乎可以运行,但是结构数组保存了意想不到的值。在随机位置添加一些 cout 命令后,我发现它第一次将正确的值保存到数组中,首先是 for loop 循环,但经过一些迭代后,它更改了先前数组的值。例如,当 for 循环中的 i 等于 1 时, mas[1].bus[0] 被保存为 - 3,因为它应该是,但是在 i 更改为 2 之后,mas[1].bus[0] 更改为25

如果你能帮我弄清楚为什么数组中的数字会变成文本文件中的其他随机数,即使我没有对它们做任何事情,我将不胜感激。

最佳答案

您的代码有几个问题。最明显的是 int bus[] 声明了一个不完整类型的变量, 在 C++ 中声明一个成员变量是非法的 不完整的类型。除非你的编译器严重损坏,否则这个 不应该编译;最迟,你应该得到一个错误 当你写 mas[i] 时,因为没有可能的方法 指向不完整类型的指针的指针算术。道路 声明你的类(class)是:

struct Player
{
    int nr;
    std::vector<int> bus;
};

一旦你这样做了,你应该能够编译。尽管如此,它还是 非常糟糕的 C++ 无法读取以下元素的计数。这 这样做的正确方法是删除计数 文件:行数为玩家数, 行中第一个之后的整数个数是数字 行中第一个整数之后的整数。如果你这样做, 你最终会得到类似的东西:

std::vector<Player> skaitymas()
{
    std::ifsteram duom( "U1.txt" );
    if ( !duom.is_open() ) {
        //  Some sort of error handling, maybe an exception.
    }
    std::vector<Player> results;
    std::string line;
    while ( std::getline( duom, line ) ) {
        std::istringstream s( line );
        int nr;
        s >> nr;
        if ( !s ) {
            //  Format error...
        }
        results.push_back(Player{ nr });
        while ( s >> nr ) {
            results.back().bus.push_back( nr );
        }
    }
    return results;
}

一切都是动态完成的(这在 C++ 中非常简单)。

关于c++ - 数组的值随机变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121046/

相关文章:

c++ - C++ 中是否可以有一个 "generic"模板参数,它可以是非类型模板参数,也可以是类型?

javascript - 使用字符串访问数组中的对象

c++ - 关于C++中数组的一些问题

带有 golang 属性的 xml 文档

matlab - 一次分配多个字段的巧妙方法?

c++ - "could not convert template argument"为其自己的类型

c++ - 构造函数谁 spect void*

c++ - 在多线程 C++11 程序中未处理异常时会发生什么?

java - 有没有办法将泛型参数限制为数组?

c - Wolfcryp RSA 解析 key 分段失败