将字符串复制到指针指针

时间:2008-12-19 00:09:51

标签: arrays string char

我正在使用这个例子:

char *myData[][2] =
{{"John", "j@usa.net"},
 {"Erik", "erik@usa.net"},
 {"Peter","peter@algonet.se"},
 {"Rikard","rikard@algonet.se"},
 {"Anders","anders@algonet.se"}};   

char **tableData[6];
tableData[0] = myData[0];
tableData[1] = myData[1];
tableData[2] = myData[2];
tableData[3] = myData[3];
tableData[4] = myData[4];
tableData[5] = NULL;//null terminated array

而是希望为姓名和电子邮件添加自己的字符串。 (尝试将字符串xyz放入myData,然后将tableData放入) strcpy with myData不会工作。我已经尝试了指针和引用的所有组合,但它似乎没有复制字符串。有什么建议吗?

             ok--> strncpy(xyz, argv[i], strlen(argv[i]));
             ok--> strcpy(xyz + strlen(argv[i]), "\0");
run time stops here--> strncpy(myData[i][0], xyz, strlen(xyz));  
                   tableData[i] = myData[i];

2 个答案:

答案 0 :(得分:3)

初始化时myData[][]中的指针指向文字字符串。那个记忆无法写入。

您可以为新字符串分配新内存,并将指向新字符串的指针放入myData。或者对于你似乎正在做的事情,只需将指针存储到argv []字符串(只要你不打算稍后修改字符串)。

另外,请确保您正在复制字符串的内存块足以容纳新字符串。

软件Monkey编辑:包括\ 0终止符;并确保在适当的时候释放记忆。

答案 1 :(得分:0)

创建您自己的数据本地副本并更改列表中的指针:

char **newentry = malloc(sizeof(char*) * 2);
newentry[0] = strdup(myNewName);
newentry[1] = strdup(myNewEmail);
tableData[i] = newentry;

这很容易。完成后,困难的部分是释放内存。如果这只是一个小小的一次性C程序,你可以在不释放内存的情况下离开,因为当应用程序退出时操作系统会自动释放它。

但是如果你想用大写'P'做正确的话,我会做一些小函数来复制和释放表项:

void tableFreeItem(int i)
{
    if(tableData[i] != 0)
    {
       free(tableData[i][0]);
       free(tableData[i][1]);
       free(tableData[i]);
    }
}

void tableSetItem(int i, char *name, char *email)
{
    tableFreeItem(i);

    tableData[i] = malloc(sizeof(char *) * 2);
    tableData[i][0] = strdup(name);
    tableData[i][1] = strdup(email);
}

现在我们可以随意替换列表中的项目,我们可以通过调用tableFreeItem()函数轻松释放内存。以下是如何使用这些功能的示例:

#define TABLE_SIZE 5

char **tableData[TABLE_SIZE + 1]; /* +1 to make room for NULL terminator */

/* Clear out the table. This also sets up the NULL terminator at the end. */
    memset(tableData, 0, sizeof(tableData));

/* Copy the original data into the table */
    for(i = 0; i < TABLE_SIZE; i++)
        tableSetItem(i, mydata[i][0], myData[i][1]);

/* Change a data item */
    tableSetItem(3, "Adam Pierce", "adam@doctort.org");

/* Free memory when we have finished */
    for(i = 0; i < TABLE_SIZE; i++)
        tableFreeItem(i);

免责声明:我没有尝试编译或运行此代码,我只是把它从头顶上扯下来。它可能会有效。