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

C 从字符串中标记字符串时出错,c,getline,strtok,C,Getline,Strtok,我想从SIC汇编代码生成一个符号表。为此,我尝试将每个字符串从汇编代码中分离出来。 因此,在尝试第一步时,我尝试了以下代码 这里, 我尝试的是逐行读取文件中的汇编代码。然后将行中的字符串分隔为标记。 当我删除令牌分离部分(如代码中所述)时,我将按预期打印所有行。 但是如果我使用令牌分离,第一行将被读取,并且令牌将按照我的预期被分离。但是对于第二行,我得到的错误是分段错误。 我找不到哪里出错了 所以,我需要专家的解释 提前谢谢 我的档案: COPY START 1000 FIRST STL R

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

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

当我删除令牌分离部分(如代码中所述)时,我将按预期打印所有行。 但是如果我使用令牌分离,第一行将被读取,并且令牌将按照我的预期被分离。但是对于第二行,我得到的错误是分段错误。 我找不到哪里出错了

所以,我需要专家的解释

提前谢谢

我的档案:

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.

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

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

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

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

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

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

您希望此循环何时终止

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

您希望此循环何时终止

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

当(1)循环时,您从未中断
,因此它试图永远继续,但当
strtok
返回
NULL
时,会导致分段错误


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

当(1)
循环时,您永远不会跳出
,因此它试图永远继续,但当
strtok
返回
NULL
时会导致分段错误


您需要检查
strtok
是否返回
NULL
,并在该点中断循环。

您的
getline
函数是如何定义的?请注意,您似乎有内存泄漏,因为
getline
函数显然为字符串分配了内存,而字符串从未被取消分配。无限循环中的无限循环。。我们必须走得更远。我现在得到了答案。我只是在运行无限循环时出错了。非常感谢。您的
getline
函数是如何定义的?请注意,您似乎有内存泄漏,因为
getline
函数显然为字符串分配了内存,而字符串从未被取消分配。无限循环中的无限循环。。我们必须走得更远。我现在得到了答案。我只是在运行无限循环时出错了。非常感谢。你能解释一下为什么不把它打印出来吗。在我出错的斯特托克,我怎样才能纠正这个错误。你能解释一下为什么不把它打印出来吗。在斯特托克,我错了,我怎么能纠正呢。