Arrays 将字符串复制到指针到指针
我用这个例子:Arrays 将字符串复制到指针到指针,arrays,string,char,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[
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)
带myData的strcpy不起作用。我尝试了指针和引用的所有组合,但它似乎没有复制字符串。有什么建议吗
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", "adam@doctort.org");
/* Free memory when we have finished */
for(i = 0; i < TABLE_SIZE; i++)
tableFreeItem(i);
#定义表格大小5
字符**表格数据[表格大小+1];/*+1为空终止符腾出空间*/
/*把桌子收拾干净。这也会在末尾设置空终止符*/
memset(tableData,0,sizeof(tableData));
/*将原始数据复制到表中*/
对于(i=0;i
免责声明:我没有试着编译或运行这段代码,我只是从头顶上猛击它。它可能会起作用。这不是问题所在,但您应该更仔细地了解strlen()和strncpy()的作用。这两行:ok-->strncpy(xyz,argv[i],strlen(argv[i]);正常-->strcpy(xyz+strlen(argv[i]),“\0”);没有比strcpy(xyz,argv[i])更安全(而且效率更低);