-2

如何编辑结构的单个成员?例如,我想entity.namefoo更改为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");
};

但我明白了:

漂亮的字母

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

好的小符号

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

4

2 回答 2

1

这里的这条线很可疑......

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

请注意,这ss是一个指向数组的指针cnt Element——所以,如果你想访问该tempi元素,正确的方法不是——如果(*ss[tempi])ss[tempi]试图访问name属性的第一个元素,那么*ss[tempi].name就会这样做。

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

问题是我不知道什么ss[tempi].name是为了告诉你分配它的正确方法。如果 name是 char 指针,这将是我的解决方案。

ss[tempi].name=tempc;

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

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

*ss[tempi].name是中的第一个字符name- 正如您所说,该属性是char name[255]- 因此,name它本身就是该数组中第一个字符的地址,并且*name是实际的第一个字符。也是如此*tempc——因此,您将第一个字节从tempcto复制,仅此而已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 ) );
于 2013-05-07T21:52:12.040 回答
0
*ss[tempi].name

应该

ss[tempi].name
于 2013-05-07T21:51:19.000 回答