首页 文章

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

提问于
浏览
0

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

Here, What I have tried is to read the assembly code form a file line by line. And then to separate the strings in the line to tokens.

当我删除令牌分离部分(如代码中所述)时,我按预期打印所有行 . 但如果我与令牌分离一起运行,第一行就会被读取,并且令牌按照我的预期分开 . 但对于第二行,我得到错误作为分段错误 . 我无法追查我哪里出错了 .

所以,我需要专家解释 .

提前致谢 .

FILE * sourceCode = fopen(“/ home / muthu / LangFiles / SIC / PASS1 / PROGRAM.txt”,“r”);
if(checkForFileOpeningErrors()== ERROR)//我使用单独的函数
返回EXIT_FAILURE; //终止程序
int maxLineLength = 50;
而(1)
{
char * lineReader = NULL; //因为getline将重新分配 .
if(getline(&lineReader,(size_t *)&maxLineLength,sourceCode)== -1)
打破;
的printf( “%S”,lineReader);

// TOKEN SEPARATION在这里开始....如果我评论这一部分,我将打印所有行
char * wordReader;
wordReader = strtok(lineReader,“\ n”);
的printf( “%S \ n” 个,wordReader);
而(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 回答

  • 3

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

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

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

    你什么时候期望这个循环终止?

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

    你永远不会突破 while(1) 循环,所以它试图永远继续,但是当 strtok 返回 NULL 时会导致分段错误 .

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

相关问题