2016-08-30 66 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);