2016-07-17 17 views
-1

私は入力ファイルからトークンを作成しようとしています。ですから、私はfgetsを使って1行を取得し、それをchar *を取り込んでトークンのchar *を返すヘルパーメソッドに送ります。私はトークンがすべて ""で区切られているので、デリミタをstrtok()として利用しています。しかし、なぜコードが1行につき2トークンしか作成しないのか分かりませんし、トークン化が必要な行が増えたとしても、次の行に移動するだけです。ここでは、コードは次のようになります。ここではstrtok()から1行につき2トークンだけを取得する

char *TKGetNextToken(char * start) { 
    /* fill in your code here */ 
    printf("Entered TKGetNextToken \n"); 
    printf(&start[0]); 
    char* temp = &start[0]; 

    //Delimiters for the tokens 
    const char* delim = " "; 

    //store tempToken 
    char* tempTok = strtok(temp, delim); 

    //return the token 
    return tempTok; 
} 

は、私はmainメソッド内のトークンを格納しています方法です:

//call get next token and get the token and store into temptok 
    while (temp!= NULL) { 
     tempTok = TKGetNextToken(temp); 
     printf("tempTok: %s\n",tempTok); 
     token.charPtr[tempNum] = tempTok; 
     tempNum++; 
     printf("Temp: %s\n",tempTok); 
     temp = strtok(NULL, " \0\n"); 
    } 

だから、私はfile.txtをを持って言うことができます:

abcd ef ghij asf32 
fsadf ads adf 

作成されたトークンは "abcd"と "ef"になり、 "ghij"と "asf32"のトークンを作成せずに次の行に進みます。

+1

注:Cは_methods_をサポートしていない、だけ_functions_。 – Olaf

+1

そして、 'printf(&start [0]);'は明らかにno-goです! **決して**フォーマットされた文字列としてusafeデータを渡すことはありません!これがマルウェアの最も一般的なエントリーポイントの1つです(避けるのが最も簡単です)。 – Olaf

+4

関数と呼び出し元の両方で同じ文字列で 'strtok'を呼び出しています。そうですね。実際には、同じ文字列にNULLと非NULLの 'strtok'呼び出しが混在しています。どちらがさらに悪いですか?それはほとんどあなたが望むものではありません。何が起こっているかを詳しく知るには、デバッガを使うことをお勧めします。 – kaylum

答えて

2

は、あなたが上記のように行うならば、あなたはトークンが非常に簡単で取得することができますstrtok

 char *tempTok = strtok(line, " "); //initialize 
     while (tempTok != NULL) { 
      //do the work 
      tempTok = strtok(NULL, " \n"); //update 
     } 

のための適切な構文を使用します。あなたのコードに似ているこの例を見てください。ちょうどstrtokの使い方を覚えておいてください。 strtokとそれがループでどのように使用されているかを見て、char *を更新して消費します。

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

int main() { 
    FILE *fp = fopen("data.txt", "r"); 
    char line[256]; 
    while (fgets(line, sizeof(line), fp)) { 
     char *tempTok = strtok(line, " "); 
     while (tempTok != NULL) { 
      printf("token %s\n", tempTok); 
      tempTok = strtok(NULL, " \n"); 
     } 
    } 
    fclose(fp); 
    return 0; 
} 

ファイルdata.txtを

abcd ef ghij asf32 
fsadf ads adf 

出力

./a.out 
token abcd 
token ef 
token ghij 
token asf32 

token fsadf 
token ads 
token adf 
+0

デリミタリストから '\ 0'も削除します。 2つの理由から。 (1) 'strtok'は、文字列の最後であるため、常に' \ 0'で停止します。 (2)デリミタに '\ 0'を置くと、' \ 0'はデリミタリストを終了するので、それ以降は無視されます。だから、 'asf32'の後ろに空白行があります:区切り文字の' \ n'は無視されました。 – user3386109

関連する問題