繁体   English   中英

尝试从文件中读取数据并使用strtok()和fgets()在c中将其标记化

[英]Trying to read data from a file and tokenize it in c using strtok() and fgets()

我正在尝试使用fgets()从文本文件中读取数据,并使用“ |”标记它 定界符并将结果存储在名为“ menuresult []”的数组中。 到目前为止,它正在失败。 它给了我一个段错误,而valgrind似乎认为这是因为“ strdup”这一行。 我的想法已经用完了。 任何帮助,将不胜感激。 到目前为止,这是我的代码:

   FILE *menufile = fopen("menu.dat", "r");  
   char *menuresult[1024];

   while((fgets(line, sizeof(line), menufile)) != NULL) {   

       if (i == 0) {
          token = strtok(line, "|");
          menuresult[i] = strdup(token);
          }

       else {

          token = strtok(NULL, "|"); 
          menuresult[i] = strdup(token);
          }
          i++;      
       }

我认为您可能需要这些更改-

   FILE *menufile = fopen("menu.dat", "r");  
   char *menuresult[1024];

   while((fgets(line, sizeof(line), menufile)) != NULL) {   

          while((token = strtok(line, "|")) != NULL){

          menuresult[i] = strdup(token);

          i++;
          }              
       }

考虑一下:到达行尾时,您要将NULL传递给strdup ,这会导致未定义的行为。 您需要一个循环来解析文件的每一行,如下所示:

while((fgets(line, sizeof(line), menufile)) != NULL) {   
      token = strtok(line, "|");
      menuresult[i] = strdup(token);
      printf("%s\n", menuresult[i]);
      i++;
      while(token){
          token = strtok(NULL, "|");
          if(token)
          {
              menuresult[i] = strdup(token);
              printf("%s\n", menuresult[i]);
          }
          i++;
      }
}

您没有检查可返回null的strtok的返回值,而在while循环中加上替换行,strtok在内部跟踪字符串,这就是为什么您传递null的原因,您可能需要一个double while循环吗?

while read file
    while strtok != null

暂无
暂无

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

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