Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 保存令牌错误:核心转储_C_String_Segmentation Fault_Token - Fatal编程技术网

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

我用C编写这段代码是为了保存一个字符串中的几个字段,以便我可以再次调用它们以获得格式化输出,但是在获取第一个字段后,代码可能会失败-分段错误(核心转储)。 我确保在使用后释放分配的内存,但它不工作

#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