2016-07-02 14 views
0

文字列でファイルを取得しているので、空白/改行になるたびに各文字列をトークン化します。区切り文字列にトークンを区切りますが、配列にコピーすることはできません。Cプログラミング配列の大きなレベル

int lexer(FILE* file){ 

char line[50]; 
char* delim; 
int i = 0; 
int* intptr = &i; 


while(fgets(line,sizeof(line),file)){ 
    printf("%s\n", line); 

    if(is_empty(line) == 1) 
     continue; 

    delim = strtok(line," "); 

    if(delim == NULL) 
     printf("%s\n", "ERROR"); 

    while(delim != NULL){ 

     if(delim[0] == '\n'){ 
     //rintf("%s\n", "olala"); 
      break; 
     } 
     tokenArray[*intptr] = delim; 
     printf("Token IN array: %s\n", tokenArray[*intptr]); 
     *intptr = *intptr + 1; 
     delim = strtok(NULL, " "); 

    } 

私はこれを実行する場合、私は出力を得る:

トークンに配列:012

トークン内の配列:23ddd

トークン内の配列:配列にvs32

トークン:、344

トークンIN配列:0sdf

私のテキストファイルに従って正しいですが、私は、同じ機能でかつ

*intptr = *intptr + 1; 
     delim = strtok(NULL, " "); 

    } 



} 
printf("%s\n", tokenArray[3]); 
fclose(file); 
return 0; 

から後で配列を再印刷しようとすると、私は出力を得るいけない

は、私は、すべての内容を書いてみました配列をtxtファイルに変換すると、私は気が散った。私は何をするべきかわからないplzヘルプ

答えて

1

まず、私の上のあなたのポインタは役に立たない。なぜ私は直接使用していないのですか? これからはそれを仮定します。

実際の問題点は、strtokがトークンを割り当てないためにstrtokが返す文字列を割り当ててコピーする必要があります。それはちょうど最後のものを指しています。参照はすべて同じであるので、あなたは、このような最後の空のトークン

何かが役立つだろう得る:(代わりにtokenArray[*intptr] = delim;の)

tokenArray[*intptr] = strdup(delim); 

は私がiでインデックスを置き換えていることに注意してください。後でi++にちょうど。

私は速いハックなどの目的でstrtokを使用することはお勧めしません。この関数はメモリを持っているので、プログラムのさまざまな部分でそれを使っていくつかの関数を呼び出すと、衝突する可能性があります(私はずっと前にそのミスを犯しました)。その場合strtok_rのマニュアルを確認(再入のためのR)この行に

0
tokenArray[*intptr] = delim; 

delimコンテンツが今までループするために変更された文字列へのポインタです。あなたの場合、delimが指し示す内容は、tokenArray[*intptr]の内容としてコピーする必要があります。

tokenArray[*intptr] = strdup(delim); 
関連する問題