2017-10-01 68 views
0

私は、一連の単語であるファイルを読み込み、文章をで分割し、トークンを配列に入れてstrtok()で区切ります。次に、内容が正しいかどうかを確認するためだけに配列を印刷します。
ただし、出力が正しく出力されません。
ここに私のコードです。C - ファイルを読み込んでstrtokで配列に分割する

出力となり
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
int main(int argc, char ** argv) 
{ 
    FILE *fp; 
    char *str=malloc(80*sizeof(char)); 
    int count=0; 
    char *tokenArray[100]; 
    int i=0; 
    int j=0; 
    char *token = strtok(str, "|"); 

    printf("Loading stock...\n"); 
    fp = fopen(argv[1], "r"); 
    while(fgets(str, sizeof(str),fp)!=NULL){   
     tokenArray[0]=strtok(str,"|"); 

     for(i=1; i<200; i++){ 
      if((tokenArray[i]=strtok(NULL,"|")) ==NULL) 
       break; 
     } 
     count=i; 

     for(i=0; i<count;i++){ 
      printf("%d: %s\n",i,tokenArray[i]); 
     } 
    } 
    return EXIT_SUCCESS; 
} 

Loading stock... 
0: I0001 
1: M 
0: eat Pie 
0: Yummy 
0: Beef in 
0: Gravy 
0: surroun 
0: ded by 
0: pastry 
0: 3.50 
1: 50 
0: 

0: I0002 
1: A 
0: pple Pi 
0: e 
1: Delic 
0: ious St 
0: ewed Ap 
0: ple in 
0: a Yummy 
0: Pastry 
0: envelo 
0: pe 
1: 3.00 
0: 20 

素晴らしいではありません。 しかし、私はそれを微調整場合ので、strが、それがうまくいくと、出力が

0: I0001 
1: Meat Pie 
2: Yummy Beef in Gravy surrounded by pastry 
3: 3.50 
4: 50 

あるしかし、私の割り当てのために、私はmalloc()を使用する必要がありますchar str[80];静的です。 何が問題になりますか?

+2

最初の 'のchar *トークン=はstrtok(STR 、 "|");は 'str'の前にデータがあります。 –

+1

配列インデックスが0から始まり、 'tokenArray'の最大有効インデックスが99であるため、 'for(i = 1; i <200; i ++)'も心配です。 –

+1

各行を読み上げると、前の行あなたが保存したポインタは、もはやあなたが想像するトークンを指していません。それぞれのトークンに対してメモリーを割り当ててコピーする必要があります。 –

答えて

1

コメントのインラインでコードの固定バージョンをご覧ください。あなたの主な問題は、sizeof(str)の間違った解釈でした(実際にはstrがポインタの代わりに文字の配列だったときになぜそれが働くのか説明しています)。また、トークンを必要とする複数の行がある場合は、strtok()が実際にどのように動作するのかを調査したい場合があります。古いトークンを保持したい場合は、複数の行で動作しないためです。私は、その課題が要求しているものなら、OPのための練習としてその問題のための適切な修正を残すでしょう。

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

#define BUF_SIZE 80 

int main(int argc, char ** argv) 
{ 
    FILE *fp; 
    char *str=malloc(BUF_SIZE*sizeof(char)); 
    int count=0; 
    char *tokenArray[100]; 
    int i=0; 
    int j=0; 
    // See comment by Weather Vane 
    //char *token = strtok(str, "|"); 
    char *token; 

    printf("Loading stock...\n"); 
    fp = fopen(argv[1], "r"); 
    // sizeof(str) == sizeof(char *) == 8 on x86_64, NOT 80 as you assumed 
    //while(fgets(str, sizeof(str),fp)!=NULL){ 
    while(fgets(str, BUF_SIZE, fp)!=NULL){ 

     tokenArray[0]=strtok(str,"|"); 

     // See comment by Martin James about array bounds 
     //for(i=1; i<200; i++){ 
     for(i=1; i < sizeof(tokenArray)/sizeof(tokenArray[0]); i++){ 
      if((tokenArray[i]=strtok(NULL,"|")) ==NULL) 
       break; 
     } 
     count=i; 

     for(i=0; i<count;i++){ 
      printf("%d: %s\n",i,tokenArray[i]); 
     } 
    } 
    return EXIT_SUCCESS; 
} 

test.txtが含まれている場合は罰金作品:

I0001|Meat Pie|Yummy Beef in Gravy surrounded by pastry|3.50|50 

をと呼ばれる:

$./tmp test.txt 

出力:

Loading stock... 
0: I0001 
1: Meat Pie 
2: Yummy Beef in Gravy surrounded by pastry 
3: 3.50 
4: 50 
関連する問題