0

SIC アセンブリ コードからシンボル テーブルを生成したいと考えています。そのために、すべての文字列をアセンブリ コードから分離しようとしました。したがって、そのための最初のステップを試みているときに、このコードを試しました。

ここで、私が試みたのは、アセンブリ コードをファイルから 1 行ずつ読み取ることです。次に、行内の文字列をトークンに分離します。

(コードに記載されているように) トークン分離セクションを削除すると、すべての行が期待どおりに印刷されます。しかし、トークンの分離と一緒に実行すると、最初の行が読み取られ、トークンが期待どおりに分離されます。しかし、2行目では、セグメンテーション違反としてエラーが発生しています。どこで間違ったのか追跡できませんでした。

だから、専門家からの説明が必要です。

前もって感謝します。

 FILE* sourceCode =  fopen("/home/muthu/LangFiles/SIC/PASS1/PROGRAM.txt","r");
  if(checkForFileOpeningErrors() == ERROR)  //Iam using separate function
      return EXIT_FAILURE;  //Terminate the program.
  int maxLineLength = 50;
  while(1)
  {
           char* lineReader = NULL;  // since getline will reallocate.
       if( getline(&lineReader,(size_t*)&maxLineLength,sourceCode) == -1 )
           break;
       printf("%s",lineReader);

// TOKEN SEPARATION STARTS HERE....   If I comment this section out iam getting all lines printed 
            char* wordReader;
      wordReader = strtok(lineReader," \n");
      printf("%s\n",wordReader);
      while(1)
      {
           wordReader = strtok(NULL," \n");
           printf("%s\n",wordReader);
      }
// TOKEN SEPARATION ENDS HERE....
  }

私のファイル:

COPY START 1000  
FIRST STL RETADR 
CLOOP JSUB RDREC  
LDA LENGTH
COMP ZERO
JEQ ENDFIL
JSUB WRREC 
J CLOOP
.
.
.
END

私のサンプル出力:

muthu@muthu-G31M-ES2L:~/LangFiles/PASS1$ ./a.out
All Files successfully opened!! Operation has begun...
COPY START 1000 

COPY
START
1000
segmentation Fault.
4

3 に答える 3

3

このループはいつ終了しますか?

  while(1)
  {
       wordReader = strtok(NULL," \n");
       printf("%s\n",wordReader);
  }
于 2011-07-12T12:13:50.747 に答える
1

あれ、使い方strtok()間違ってる。NULLトークンが見つからなくなると返されます。それを印刷しようとしないでください。また、あなたのループは終わりがなく、これが問題になります。

ループはおそらく次のようになるはずです。現在の状態では、strtok()すべての反復で同じ引数を に渡しますが、もちろん成功することはありません。

for(wordReader = strtok(lineReader, " \n");
    wordReader != NULL;
    wordReader = strtok(NULL, " \n"))
{
   printf("found token: '%s'\n", wordReader);
}
于 2011-07-12T12:13:45.910 に答える
0

ループから抜け出すことは決してないwhile(1)ので、ループは永遠に続けようとしますが、 がstrtok返されるときにセグメンテーション違反が発生しますNULL

return かどうかを確認し、その時点でループから抜け出す必要がありstrtokます。NULL

于 2011-07-12T12:14:55.780 に答える