繁体   English   中英

令牌化缓冲区分段错误

[英]Tokenizing buffer segmentation fault

因此,我想我在这里缺少了一些相当简单的东西,但是我试图逐行读取文件,并随即标记化缓冲区。 我已经粘贴了我要使用代码进行操作的基础知识。 我从未遇到过strtok的问题,所以我猜想它与我正在使用的缓冲区有关。 有没有朝着正确的方向发展? 我读到strtok并不是一个很好的选择,但这是我唯一熟悉的东西(我想我可以编写自己的函数),它每次都会读取第一个令牌。 直到我尝试使用“ strtok(NULL,“”);“查找第二个标记时,它才出现故障。

我不知道为什么这个被否决为重复。 是的,那里有答案可以告诉我我要做什么的基本知识,但我想理解问题,而不仅仅是剪切和粘贴。”我更想知道为什么存在段错误以及为什么我的错误代码照常运行,当我问其他帖子中未直接指出的特定问题时,无需投票。

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;
}        

while循环检查token是否不为NULL,但在使用token之前先在循环的第一行对其进行修改。 strtok()的第二次调用应在循环的结尾:

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

        token = strtok(NULL, " ");
    }

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

你也有一个内存泄漏

char *data = strdup(buffer);

strdup使用malloc为dup字符串分配内存,这是您的责任free 但是,您没有这样做,并且在每个循环中您都用另一个指针覆盖了先前分配的指针,从而导致内存泄漏

这不是真正的答案,我重新编辑了一个错误的答案,以使您喜欢。

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

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)之后,世界一切都很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM