C 从字符串中标记字符串时出错
我想从SIC汇编代码生成一个符号表。为此,我尝试将每个字符串从汇编代码中分离出来。 因此,在尝试第一步时,我尝试了以下代码 这里, 我尝试的是逐行读取文件中的汇编代码。然后将行中的字符串分隔为标记。 当我删除令牌分离部分(如代码中所述)时,我将按预期打印所有行。 但是如果我使用令牌分离,第一行将被读取,并且令牌将按照我的预期被分离。但是对于第二行,我得到的错误是分段错误。 我找不到哪里出错了 所以,我需要专家的解释 提前谢谢 我的档案:C 从字符串中标记字符串时出错,c,getline,strtok,C,Getline,Strtok,我想从SIC汇编代码生成一个符号表。为此,我尝试将每个字符串从汇编代码中分离出来。 因此,在尝试第一步时,我尝试了以下代码 这里, 我尝试的是逐行读取文件中的汇编代码。然后将行中的字符串分隔为标记。 当我删除令牌分离部分(如代码中所述)时,我将按预期打印所有行。 但是如果我使用令牌分离,第一行将被读取,并且令牌将按照我的预期被分离。但是对于第二行,我得到的错误是分段错误。 我找不到哪里出错了 所以,我需要专家的解释 提前谢谢 我的档案: COPY START 1000 FIRST STL R
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
函数显然为字符串分配了内存,而字符串从未被取消分配。无限循环中的无限循环。。我们必须走得更远。我现在得到了答案。我只是在运行无限循环时出错了。非常感谢。你能解释一下为什么不把它打印出来吗。在我出错的斯特托克,我怎样才能纠正这个错误。你能解释一下为什么不把它打印出来吗。在斯特托克,我错了,我怎么能纠正呢。