从字符串中标记字符串时出错

时间:2011-07-12 12:08:06

标签: c getline strtok

我想从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.

3 个答案:

答案 0 :(得分:3)

您希望何时终止此循环?

  while(1)
  {
       wordReader = strtok(NULL," \n");
       printf("%s\n",wordReader);
  }

答案 1 :(得分:1)

呃,你使用strtok()错了。当找不到更多令牌时,它将返回NULL,您不应该尝试打印它。此外,你的循环永无止境,这将是一个问题。

循环应该看起来像这样,因为现在,你在每次迭代时都将相同的参数传递给strtok(),这当然永远不会成功:

for(wordReader = strtok(lineReader, " \n");
    wordReader != NULL;
    wordReader = strtok(NULL, " \n"))
{
   printf("found token: '%s'\n", wordReader);
}

答案 2 :(得分:0)

您永远不会脱离while(1)循环,因此会尝试永远继续,但在strtok返回NULL时会导致细分错误。

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