复制字符串指针,指针
问题描述:
我使用这个例子:复制字符串指针,指针
char *myData[][2] =
{{"John", "[email protected]"},
{"Erik", "[email protected]"},
{"Peter","[email protected]"},
{"Rikard","[email protected]"},
{"Anders","[email protected]"}};
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与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];
答
myData[][]
中的指针,因为您已将它初始化为指向文字字符串。该内存无法写入。
您可以为新字符串分配新内存,并将指向新字符串的指针放入myData
。或者对于你似乎正在做的事情,只要将指针存储到argv []字符串(只要你不打算稍后修改字符串)。
此外,请确保您正在复制字符串的内存块足够大以容纳新字符串。
软件猴编辑:包括\ 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", "[email protected]");
/* Free memory when we have finished */
for(i = 0; i < TABLE_SIZE; i++)
tableFreeItem(i);
免责声明:我没有尝试过编译或运行这段代码,我只是从我的头顶撞它关闭。它可能会工作。
这不是问题,但你应该仔细看看strlen()和strncpy()是做什么的。两行: ok - > strncpy(xyz,argv [i],strlen(argv [i])); ok - > strcpy(xyz + strlen(argv [i]),“\ 0”); 没有比 strcpy(xyz,argv [i])更安全(效率也更低)。 – Dipstick 2008-12-19 21:23:05