gpt4 book ai didi

CSV 解析 - 第二个字段返回空值

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:24 24 4
gpt4 key购买 nike

我使用下面的代码来解析这个 CSV

me;val1;val2;val3;val4;val5;
me;val1;val2;val3;val4;val5;

void readcsv()
{
FILE* stream = fopen("input.csv", "r");

char line[1024];
while (fgets(line, 1024, stream))
{
char* tmp = strdup(line);
// printf("Field 1 would be %s\n", getcsvfield(tmp, 1));
printf("Field 1 would be %s\n", getcsvfield(tmp, 1));
printf("Field 2 would be %s\n", getcsvfield(tmp, 2));
// NOTE strtok clobbers tmp
free(tmp);
}
}
//Used for parsing CSV
const char* getcsvfield(char* line, int num)
{
const char* tok;
for (tok = strtok(line, ";");
tok && *tok;
tok = strtok(NULL, ";\n"))
{
if (!--num)
return tok;
}
return NULL;
}

但我一直在第二个字段中得到 NULL 值

Output:
Field 1 would be me
Field 2 would be (null)
Field 1 would be me
Field 2 would be (null)

我做错了什么?

最佳答案

strtok(line, ";");

strtok 修改传递给它的字符串(在本例中为 line)。所以你不应该在第二次调用 getcsvfield 时使用相同的 line(从第一次调用 getcsvfield 返回),因为在第一次调用之后getcsvfieldline 现在有不同的内容。

请注意,这不是 函数 getcsvfield 中的问题,因为当您第二次将 NULL 传递给 strtok 时,that 函数,它知道如何以正确的方式处理修改后的输入字符串。

来自 manual关于 strtok 参数:

Notice that this string is modified by being broken into smaller strings (tokens).

像这样的东西应该可以解决问题。这是最“基本”的方法,您也可以尝试其他方法。保留 getcsvfield 函数,就像您最初在代码中使用的那样,只是在调用方执行:

char line[1024];
char buffer[1024];
while (fgets(line, 1024, stream))
{
// char* tmp = strdup(line); not necessary in this case
strcpy(buffer, line);
printf("Field 1 would be %s\n", getcsvfield(buffer, 1));
strcpy(buffer, line);
printf("Field 2 would be %s\n", getcsvfield(buffer, 2));
// free(tmp);
}

如上所示,每次调用 getcsvfield,都会将指针返回到相同的内存地址 - buffer。对于 printing 它工作正常(因为在打印时它显示缓冲区中有什么),但是如果你想存储每次调用 getcsvfield 的结果供以后使用,您可能希望每次都将每次调用 getcsvfield 的结果复制到某个不同的内存位置。

关于CSV 解析 - 第二个字段返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35599549/

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