2017-11-30 9 views
1

これは少し私を困惑させた質問です。私はデリミタ"+"" "でstrtokを使ってトークン化している多くの複素数を含むアスキーファイルを入力しています。ファイルは次の形式です:[[[0+0i 0+0i 0+0i 0+0i.......]]]。私は、最初のトークンが0であり、2番目のトークンが0iであると期待しています。私は実際に最初のトークンとして"0,0i"を取得しています。次のコードが使用されています:strtok()は予期しない結果を示しています

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

char data[]={0}; 
int line = 0; 
char *datap[231000]; 
int i,n; 

void main() 
{ 
    FILE * filei = fopen("signal_subband_16.ascii","r"); 
    FILE * fileo = fopen("Output_file_simple.txt","a"); 
    if(filei==NULL){ 
     printf("There was an error opening the input file"); 
     exit(1); 
    } 
    else if(fileo==NULL){ 
     printf("There was an error opening the output file"); 
     exit(1); 
    } 
    else{ 
     while(fgets(data,999999,filei)){ 
      line ++; 
      //  printf("Line: %d -> %s", line, data); 
     } 
    } 

    datap[0]=strtok(data,"[+"); 
    n = 1; 
    while(datap[n-1]!=NULL){ 
     datap[n] = strtok(NULL,"i+"); 
     n++; 
    } 

    //for(i=0;i<n;i+2){ 
    // printf("%s %s\n", datap[i], datap[i+1]); 
    //} 

    printf("%s\n, %s\n",datap[0], datap[1]); 

    fclose(filei); 
    fclose(fileo); 
} 

正しい答えにはどんなヘルプやプッシュがあれば幸いです。 おかげ

NEW CODE FUNCTIONAL

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




char data[999999]; 
int line = 0; 
char *datap[231000]; 
int i,n; 


void main() 
{ 
FILE * filei = fopen("signal_subband_16.ascii","r"); 
FILE * fileo = fopen("Output_file_simple.txt","a"); 
if(filei==NULL){ 
    printf("There was an error opening the input file"); 
    exit(1); 
} 
else if(fileo==NULL){ 
    printf("There was an error opening the output file"); 
    exit(1); 
} 
else{ 
    while(fgets(data,999999,filei)){ 
     datap[0]=strtok(data,"[ +"); 
     n = 1; 
     while(datap[n-1]!=NULL){ 
      datap[n] = strtok(NULL,"i +]"); 
      n++; 
      } 

    for(i=0;i<n;i+2){ 
    printf("%s %s\n", datap[i], datap[i+1]); 
} 
    memset(data,0,999999); 
    line ++; 

    } 

} 






fclose(filei); 
fclose(fileo); 

} 
+0

[最小限のテストケース](https://stackoverflow.com/help/mcve)を構築できますか? –

+0

こんにちはオリバー私は残念ながらそれは正常に実行されています。これは、最小限のテストケース の#include の#include の#include char配列[25] = "[[[0 + 0iの0 + 100I 45 + 234I]]]" です。 char * arrayp [25]; int n、i; n = 1; while(arrayp [n-1]!= NULL){ arrayp [n] = strtok(NULL、 "+ i"); n ++; } (i = 0; i

+1

最小のテストケースであれば、そのコードで質問を更新してください;) –

答えて

2

はあなたのコードの最大の問題は、あなたがdata配列の範囲外書いているということです。空のサイズの配列を宣言すると、イニシャライザリストに値を保持するのに十分な大きさになります。

:だから

char data[] = {0}; 

は、あなたはそれがあるべきよう、あなたはfgets()で読んでいる行を保持するのに十分な、これは大きなようにする必要があり

char data[1] = {0}; 

に相当ちょうど1要素を持つ配列を宣言します

char data[999999]; 

fgets()と入力するまで使用しないため、初期化する必要はありません。

strtok()の使用上の問題は、区切り文字リストにスペースを含めなかったことです。また、i文字をトークンの一部にする場合は、でなく、を区切り文字のリストに含める必要があります。そして最後のトークンに]]]を含めないように、区切り文字に]を含める必要があります。だから、ループは次のようになります。このループは表示された時点で、dataはファイルの最後の行だけが含まれていることも

datap[0]=strtok(data,"[+"); 
n = 1; 
while(datap[n-1]!=NULL){ 
    datap[n] = strtok(NULL," +]"); 
    n++; 
} 

注意。ファイル内の他の行を解析していません。これが意図されているかどうかは明らかではありません。ファイルのすべての行を解析する場合、このループは各行を読み取るループの内側にある必要があります。また、行を読むたびに上書きするため、のコピーを作成する必要があります。strtok()は、単にポインタを配列に返します。

+0

詳細な説明Barmarありがとうございます。すべてが適用され、完全に実行されます。私は、複素数の虚数部分が負の場合は区切り記号として、別の問題に遭遇しました。どのように解析する数値の中に負の値を保持することができますか?これも可能ですか? –

+0

@AmmarAhmad 'strtok()'は、複素数を解析するための適切なツールではありません。区切り文字として '' [] ''を使い、複素数を実数部と虚数部に分割して、標識を検出することができます。 – Barmar

関連する問題