[英]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.