修改单个结构成员

时间:2013-05-07 21:48:39

标签: c visual-studio-2010

如何编辑结构的单个成员?例如,我想将entity.name foo 更改为 foobar

部分代码:

void editing1(int cnt, int qq)
{
    Entity z;
    char tempc[255];
    int tempi = 0;
    cout << "Type in new name: ";
    cin >> tempc;
    qq--;
    Entity* ss = new Entity[cnt];
    while (fread(&z, sizeof z, 1, file)) {
        ss[tempi] = z;
        if (tempi == qq) {
            (*ss[tempi].name = *tempc);
        };
        tempi++;
    };

    purge();
    for (int ii = 0; ii < cnt; ii++) {
        fwrite(&ss[ii], sizeof(Entity), 1, file);
    };
    fclose(file);
    system("cls");
};

但我明白了:

snifty letters

它很好......破坏了整个文件。原文:

good little symbols

也有人可以解释为什么它会破坏整个文件而不是使用它的部分?

2 个答案:

答案 0 :(得分:1)

这一行是可疑的......

(*ss[tempi].name=*tempc);

请注意,ss是指向cnt Element数组的指针 - 因此,如果要访问tempi元素,请使用正确的方法不是(*ss[tempi])而是ss[tempi] - 如果您尝试访问name属性的第一个元素,那么*ss[tempi].name会这样做。

但是,tempc是一个char数组,没有数组索引,是数组中第一个元素的地址。 *tempc将是第一个字节中的单个字符。

问题在于我不知道ss[tempi].name是什么,以便告诉您分配它的正确方法。这将是我的解决方案如果 name是一个字符指针。

ss[tempi].name=tempc;

如果name是一个char数组,你可能会想要这样的东西......

strncpy( ss[tempi].name, tempc, sizeof( ss[tempi].name ) );

*ss[tempi].namename中的第一个字符 - 如您所述,该属性为char name[255] - 因此,name本身就是第一个字符的地址该数组中的字符*name是实际的第一个字符。 *tempc也是如此 - 所以,您要将tempc的第一个字节复制到name,这就是全部。

此外,您无法通过分配数组来复制数组......

char array1[255] = "hello world";
char array2[255];

array2 = array1;

合法C。您需要使用字符串副本来执行此操作,并且还需要防止缓冲区溢出,因此您将执行此操作...

char array1[255] = "hello world";
char array2[255];

strncpy( array2, array1, sizeof( array2 ) );

答案 1 :(得分:0)

*ss[tempi].name

应该是

ss[tempi].name