簡體   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