我正在使用库的 strtok(...) ,它似乎工作正常,直到结束条件,它导致分段错误和程序崩溃。 API 声称,当找不到更多标记时,strtok(...) 将输出 NULL,这意味着,我认为,您必须捕获此 NULL 才能终止使用 strtok( 运行的任何循环) ...)。我需要做什么来捕获这个 NULL 以防止我的程序崩溃?我想象 NULL 可以用作终止条件。
我为您准备了 SSCCE 来观察这种行为。我需要 strtok(...) 来为我正在编写的更大的软件工作,并且我得到了完全相同的分段行为。命令行的输出显示在该代码小插图下方(是的,我知道您使用 <...> 来包含库,但我很难让这篇文章显示代码库)。我在 Windows 8 操作系统上使用 gcc 版本 4.5.3,下面显示了我想象的两种不同风格的尝试在循环中捕获 NULL 的方式。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
main(){
char* from = "12.34.56.78";
char * ch = ".";
char * token = strtok(from, ch);
printf("%s\n",token);
while(token != NULL){
token = strtok(NULL, ch);
printf("%s\n", token);
}
printf("Broke out of loop!");
while(strcmp(token, 0) != 0){
printf("%s\n",token);
token = strtok(NULL, ch);
}
}
############ OUTPUT: ############
$ ./test
12
34
56
78
Segmentation fault (core dumped)
strtok
修改其第一个参数。您从只读内存中向其传递一个字符串,并且在以下情况下发生段错误:strtok
试图改变它。尝试更改:
char* from = "12.34.56.78";
to
char from[] = "12.34.56.78";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)