标记缓冲区分段错误

时间:2015-07-06 18:23:36

标签: c segmentation-fault buffer tokenize strtok

所以我猜测我在这里错过了一些相当简单的东西,但我试图逐行读取文件,在我去的时候对缓冲区进行标记。我已经粘贴了我尝试用我的代码做的基础知识。我从来没有遇到strtok的问题,所以我猜测它与我使用的缓冲区有关。在正确的方向上任何推动?我读到strtok不是一个很好的选择,但它是我熟悉的唯一东西(我想我可以编写自己的函数) 它会读取第一个令牌,因为它每次都应该这样做。在我尝试使用" strtok(NULL,"");""

找到第二个令牌之前,它不会出错。

我不知道为什么这个被重复投票。是的,那里有答案可以说明我尝试做什么的基础知识,但我想了解问题,而不仅仅是剪切和粘贴。"我更喜欢知道为什么存在seg错误以及为什么我的代码表现得像它一样。当我在其他帖子中直接提出未直接指出的具体问题时,无需进行投票。

const char *file = "path/to/file/file.txt";
void tokenize();

//Eventually file will be command line opt
FILE *open_file(const char *file);

int main(int argc, char *argv[])
{
    tokenize();
}

void tokenize()
{
    FILE *fp;
    fp = open_file(file);
    char buffer[BUFSIZ];

    while(fgets(buffer,BUFSIZ,fp) != NULL)
    {
        //puts("========================================");
        //puts(buffer);
        //puts("========================================");

        char *data = strdup(buffer);
        char *token;
        token = strtok(data, " ");
        //puts(token);
        while(token != NULL)
        {
            token = strtok(NULL, " ");

            puts("++++++++++++++++++++++++++++++++++++++++++++++");
            puts(token);
            puts("++++++++++++++++++++++++++++++++++++++++++++++");
        }
    }
fclose(fp)
}

FILE *open_file(const char *file)
{
    FILE *fp;
    fp = fopen(file, "r");

    if(fp == NULL)
    {
        perror("Error opening file");
    }
    return fp;
}        

3 个答案:

答案 0 :(得分:3)

您的while循环检查token是否为NULL,但在使用之前在循环的第一行修改它。对strtok()的第二次调用应该在循环结束时:

    while(token != NULL)
    {
        puts("++++++++++++++++++++++++++++++++++++++++++++++");
        puts(token);
        puts("++++++++++++++++++++++++++++++++++++++++++++++");

        token = strtok(NULL, " ");
    }

另外,请不要忘记外部free(data)循环底部的while。否则,您有内存泄漏。

答案 1 :(得分:0)

您还有内存泄漏

char *data = strdup(buffer);

strdup使用malloc为dup字符串分配内存,由free负责。但是,你不会,并且在每个循环中用另一个循环覆盖先前分配的指针,导致内存泄漏

不是一个真正的答案,我重新编辑了一个错误的答案,以便你喜欢这样做。

答案 2 :(得分:0)

谢谢大家!这是我的解决方案

while(fgets(buffer,BUFSIZ,fp) != NULL)
{
    char *token;
    token = strtok(buffer, " ");
    while(token != NULL)
    {
        token = strtok(NULL, " ");
        **if(token != NULL)**
        {
            printf("%s\n", token);
        }
    }

}

fclose(fp);

正如其他答案中所指出的那样,问题不是为了对NULL值进行标记,而是在尝试打印NULL值。我在while循环中添加了检查if(token!= NULL)后,一切顺利。