2008-12-19 127 views
1

我使用这个例子:复制字符串指针,指针

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]; 
+0

这不是问题,但你应该仔细看看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

回答

3

myData[][]中的指针,因为您已将它初始化为指向文字字符串。该内存无法写入。

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

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

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

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); 

免责声明:我没有尝试过编译或运行这段代码,我只是从我的头顶撞它关闭。它可能会工作。