2017-01-05 47 views
1

変数があります。この変数には、.txtファイルがあります。ファイルには、次のようになります。
C言語の文字列の最初の要素の最初の要素を取得します。

Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast 


今、私はしたいものをすべての「要素1」を取得し、それが特定の文字列と等しいかどうかを確認すること、です。
私は関数strtok()について多くを読んで、それを使ってみました。
これは私の関数である:(idは、この特別な文字列である、私は機能の間にそれを変換します。)

int PLUexists(int id) { 

    char idc[3]; 
    sprintf(idc, "%d", id); 
    printf("%s", idc); 

    /* My Main String */ 
    FILE *plu = fopen("kassa_plu.txt", "r"); 
    char pluc[2000]; 
    while(fgets(pluc, sizeof(pluc), plu) !=0); 

    /* My Token */ 
    char *token; 

    /* get first line */ 
    token = strtok(pluc, "#"); 

    while(token != NULL) { 
     printf(" %s \n", token); 

     // Without that block, I get all lines seperated... 
     char t[255]; 
     strcpy(t, token); 

     if (strcmp(strtok(t, "|"), idc) == 0) { 
      printf("Jep"); 
      return 1; 
     } 
     // End 'block' 

     token = strtok(NULL, "#"); 
    } 
    return 0; 
} 

今、私はちょうど最初のトークンをプリントアウト(およびそれを繰り返す)場合、私は私のすべての行を取得します私はまたprintf(" %s \n", token);token = strtok(NULL, "#");の間のコードを解析するときには動作しません。ブロックなし

それで
Element1|Element2|Element3|...|ElementLast 
Element1|Element2|Element3|...|ElementLast 
Element1|Element2|Element3|...|ElementLast 
Element1|Element2|Element3|...|ElementLast 

Element1|Element2|Element3|...|ElementLast 
Element2|Element3|...|ElementLast 
Element3|...|ElementLast 
...|ElementLast 
ElementLast 
+3

あなたは 'あなたが「ループstrtokは」入れ子になっていることを可能にするstrtok_r'を調べることができます。 – immibis

+2

'fgets(pluc、sizeof(pluc)、plu)!= 0);'は何もせずにそのセミコロンでEOFにすばやく到達します。それを削除した後、次のコードブロックには '{中括弧}'が必要ですか? –

+0

なぜstrtokを使うのですか?strstrはうまくいかないでしょうか? – Hogan

答えて

1

あなたの主な問題は、ループ内で、あなたはnull以外の最初の引数でstrtok()を呼び出すとき、あなたはそれによって言うことですこれは新しいトークン化を実行するために働いていた以前のトークン化(#区切り文字による)を放棄する機能です。 strtok_r()を代わりに使用すると、一度に複数トークン化の状態を維持できますが、各行にの最初のトークンと1番目のトークンが必要なので、内部ループにはstrtok[_r]()を使用しないことを検討します。

例えば、ここにstrchr()に基づいて同様のアプローチです:

while(token != NULL) { 
     printf(" %s \n", token); 

     char *delim = strchr(token, '|'); 
     if (delim) *delim = '\0'; 

     if (strcmp(token, idc) == 0) { 
      printf("Jep"); 
      return 1; 
     } 

     token = strtok(NULL, "#"); 
    } 
+0

うわー、ありがとう!それを得ました..それは動作します! :D – Fabian

関連する問題