C 保存令牌错误:核心转储
我用C编写这段代码是为了保存一个字符串中的几个字段,以便我可以再次调用它们以获得格式化输出,但是在获取第一个字段后,代码可能会失败-分段错误(核心转储)。 我确保在使用后释放分配的内存,但它不工作C 保存令牌错误:核心转储,c,string,segmentation-fault,token,C,String,Segmentation Fault,Token,我用C编写这段代码是为了保存一个字符串中的几个字段,以便我可以再次调用它们以获得格式化输出,但是在获取第一个字段后,代码可能会失败-分段错误(核心转储)。 我确保在使用后释放分配的内存,但它不工作 #include <stdio.h> #include <stdlib.h> #include <string.h> const char* getfield(char* line, int num) { const char* tok; for
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char* getfield(char* line, int num)
{
const char* tok;
for (tok = strtok(line, ";");
tok && *tok;
tok = strtok(NULL, ";\n"))
{
if (!--num)
return tok;
}
return NULL;
}
int main(int argc, char **argv)
{
FILE* stream = fopen(argv[1], "r");
char line[1024];
while (fgets(line, 1024, stream))
{
char* tmp = strdup(line);
char* save1 = malloc(sizeof(char)*51);
strcpy(save1, getfield(tmp, 1));
printf("Save1 = %s\n", save1);
strcpy(save1, getfield(tmp, 2));
printf("Save2 = %s\n", save2);
free(save2);
char* save2 = malloc(sizeof(char)*51);
strcpy(save2, getfield(tmp, 2));
printf("Save2 = %s\n", save2);
free(save2);
char* save3 = malloc(sizeof(char)*51);
strcpy(save3, getfield(tmp, 3));
printf("Save3 = %s\n", save3);
free(save3);
char* save4 = malloc(sizeof(char)*51);
strcpy(save4, getfield(tmp, 4));
printf("Save4 = %s\n", save4);
free(save4);
char* save5 = malloc(sizeof(char)*51);
strcpy(save5, getfield(tmp, 5));
printf("Save5 = %s\n", save5);
free(save5);
free(tmp);
}
}
我的输出如下所示
Save1 = 0
Segmentation fault (core dumped)
但是如果我修改代码,只使用save1,那么输出是这样的
Save1 = 0
Save1 = 1
Save1 = 2
Save1 = 3
Save1 = 4
Save1 = 5
不要将双标记C代码作为C和C++。你的代码不能是C++;<代码> MalCube()/Cudio>调用缺少C++所必需的CAST和C.中不需要的代码,并将4行添加到代码中——三代码>包含“< /代码>行”和“一行空行”来完成代码。信息应该在问题中,而不是注释中。不要忘记
strtok()
会破坏字符串。它把它切碎了。你不能用你想要的方式有效地使用它。很可能是strcpy(save1,getfield(tmp,2))
导致核心转储,因为getfield()
返回一个空指针,该指针strcpy()
然后尝试使用。@Jonathan Leffler,谢谢你通知我。这是我在这个网站上发布的第一个问题,我不确定该标记什么。getfield
将不会像您预期的那样工作。您的方法需要strdup
每次调用它。例如tmp=strdup(行)。。。strcpy(saveN,getfield(tmp,N));免费(tmp)代码>不要将双标签C代码作为C和C++。你的代码不能是C++;<代码> MalCube()/Cudio>调用缺少C++所必需的CAST和C.中不需要的代码,并将4行添加到代码中——三代码>包含“< /代码>行”和“一行空行”来完成代码。信息应该在问题中,而不是注释中。不要忘记strtok()
会破坏字符串。它把它切碎了。你不能用你想要的方式有效地使用它。很可能是strcpy(save1,getfield(tmp,2))
导致核心转储,因为getfield()
返回一个空指针,该指针strcpy()
然后尝试使用。@Jonathan Leffler,谢谢你通知我。这是我在这个网站上发布的第一个问题,我不确定该标记什么。getfield
将不会像您预期的那样工作。您的方法需要strdup
每次调用它。例如tmp=strdup(行)。。。strcpy(saveN,getfield(tmp,N));免费(tmp)代码>
Save1 = 0
Save1 = 1
Save1 = 2
Save1 = 3
Save1 = 4
Save1 = 5