所以在过去的几个小时里,我一直试图弄清楚为什么我在使用strtok()打印一个新标记化的字符串时遇到了一个seg错误。最后我意识到我不包括string.h。添加此行后,我得到了预期的行为,没有更多的seg错误......耶!但是,如果有人可以解释我遇到的行为并回答以下问题,我是c(虽然没有编程)的新手...
我最近读到,如果你不包含string.h,将使用默认的方法签名。但是,我想使用strtok()的默认sig,为什么我仍然会得到这种未定义的行为?
char str[]= "ls -l";
char * p = strtok (str, " ");
printf ("%s\n",p);
最后一行的段错误
答案 0 :(得分:2)
问题是implicit function declaration,您应该使用警告来阻止这种情况。
分段错误是因为编译器认为strtok()
正在返回一个整数,所以你将一个有符号整数分配给一个指针,然后尝试取消引用指针,这是未定义的行为并且可能导致分段错误。
也绝不会尝试从strtok()
访问返回的指针而不检查它是否NULL
首先
char str[] = "ls -l";
char *p = strtok (str, " ");
if (p != NULL)
printf ("%s\n", p);
因为没有找到令牌时会返回NULL
。