gpt4 book ai didi

c - 如何在 C 中将 malloc + strcpy 转换为 strdup?

转载 作者:行者123 更新时间:2023-11-30 20:40:44 26 4
gpt4 key购买 nike

我正在尝试将 csv 数据保存在数组中以供其他函数使用。我知道 strdup 对此有好处,但我不确定如何让它适合我的情况。如有任何帮助,我们将不胜感激!

数据存储在结构中:

typedef struct current{
char **data;
}CurrentData;

函数调用:

int main(void){
int totalProducts = 0;
CurrentData *AllCurrentData = { '\0' };
FILE *current = fopen("C:\\User\\myfile.csv", "r");

if (current == NULL){
puts("current file data not found");
}
else{
totalProducts = getCurrentData(current, &AllCurrentData);
}
fclose(current);
return 0;
}

我如何分配内存;

 int getCurrentData(FILE *current, CurrentData **AllCurrentData){

*AllCurrentData = malloc(totalProducts * sizeof(CurrentData));

/*allocate struct data memory*/
while ((next = fgetc(current)) != EOF){
if (next == '\n'){
(*AllCurrentData)[newLineCount].data = malloc(colCount * sizeof(char*));
newLineCount++;
}
}
newLineCount = 0;
rewind(current);

while ((next = fgetc(current)) != EOF && newLineCount <= totalProducts){

if (ch != '\0'){
buffer[i] = ch;
i++;
characterCount++;
}

if (ch == ',' && next != ' ' || ch == '\n' && ch != EOF){
if (i > 0){
buffer[i - 1] = '\0';
}
length = strlen(buffer);
/*(*AllCurrentData)[newLineCount].data[tabCount] = malloc(length + 1); /* originally was using strcpy */
strcpy((*AllCurrentData)[newLineCount].data[tabCount], buffer);
*/
(*AllCurrentData)[newLineCount].data[tabCount] = strdup(buffer); /* something like this? */

i = 0;
tabCount++;

for (j = 0; j < BUFFER_SIZE; j++){
buffer[j] = '\0';
}
}

最佳答案

您定义了一个 ptr AllCurrentData 但您应该将其设置为 NULL。

CurrentData* AllCurrentData = NULL;

getCurrentData中,您使用totalProducts,这看起来有点奇怪,因为它是 main() 中的局部变量,要么你有另一个全局变量同名或者有错误。

结构内的 **data 看起来很奇怪,也许你想要解析 csv 行并为它们创建适当的成员。你已有一个 CurrentData 数组,所以有另一个数组似乎很奇怪在结构内部——我只是猜测,因为你还没有解释那部分。

由于 csv 文件是基于行的,因此使用 fgets() 读取一行从文件中,然后使用例如解析字符串strtok 或只是通过检查分隔符后的缓冲区。这里strdup可以发挥作用,当你取出一个 token 时,对其进行 strdup 并将其存储在你的结构。

char line[255];
if ( fgets(line,sizeof(line),current) != NULL )
{
char* token = strdup(strtok( line, "," ));
...
}

不要分配可能足够(或不够)的大缓冲区,而是使用当您从文件中读取数据时,realloc 会增加缓冲区。

也就是说,有更快的方法可以从 csv 文件中提取数据,例如您可以使用 fread 读取整个文件,然后查找分隔符并将它们设置为\0 并在缓冲区中创建一个字符指针数组。

关于c - 如何在 C 中将 malloc + strcpy 转换为 strdup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com