2016-08-30 86 views
-1

我在用C读CSV文件,并想将strtok()中的标记存储在数组中。不知何故,当CSV文件有多行时,我没有得到正确的令牌输出。 CSV文件看起来像这样(只是两行的这个例子,真正的文件将有超过100行):strtok()没有打印正确的值

abc,def,ghi 

jkl,mno 

我的代码是:

void main() { 



    FILE *fp; 
    fp = fopen("simple.csv", "r"); 
    const char s[2] = ","; 
    char *token; 
    char *out[5]; 
    int i = 0; 
    if (fp != NULL) 
    { 
     char line[50]; 
     while (fgets(line, sizeof line, fp) != NULL) 
     { 
      token = strtok(line, s); 

      //for (token; token != NULL; token = strtok(NULL, ",")) 
      while (token != NULL) 
      { 
       out[i++] = token; 
       //printf("%s", token); 
       token = strtok(NULL, s); 

      } 

      printf("%s\n", out[0]); 

     } 

     //for (i = 0; i < 5; i++) 


     fclose(fp); 
    } 
    else { 
     printf("error opening file"); 
    } 
} 

我希望每个逗号分隔字符串通过循环存储在一个数组中。 当我打印出数组(out[0])的第1个要素,输出为:

abc 

jkl 

,而我希望它只是令牌:

ABC

任何人都可以请让我知道问题是什么?

+2

您使用的是相同的* *'line'为*每*'fgets'缓冲区。所以当然结果会覆盖每一行输入。 – kaylum

+0

我是新手。你能告诉我如何解决这个问题吗? –

+0

是的,他们是第一列。我想将CSV文件中的每个字符串存储到一个数组中。 –

回答

1

问题是strtok返回的指针指向几个地方line,其内容一直在变化。

因此,您需要复制令牌的内容,而不仅仅是分配指针。

例如,定义out是:

char out[5][10]; // max of 5 words, each of 10 chars max (including \0) 

和内环路:

strcpy(&out[i++][0], token);