0

我想从 SIC 汇编代码生成符号表。为此,我尝试将每个字符串从汇编代码中分离出来。因此,在尝试第一步时,我尝试了这段代码。

在这里,我尝试的是逐行读取文件中的汇编代码。然后将行中的字符串分隔为标记。

当我删除令牌分离部分(如代码中所述)时,我将按预期打印所有行。但是,如果我与令牌分离一起运行,则第一行将被读取,并且令牌按我预期的那样分离。但是对于第二行,我收到错误作为分段错误。我无法追踪我哪里出错了。

所以,我需要专家的解释。

提前致谢。

 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

您需要检查是否strtok返回NULL,并在此时跳出循环。

于 2011-07-12T12:14:55.780 回答