我正在使用库的 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);
}
}
############ 输出: ############ $ ./测试 12 34 56 78 分段错误(核心转储)