使用不包含 string.h 的 strtok,请解释行为

Using strtok without including string.h, please explain behaviour

所以在过去的几个小时里,我一直在试图弄清楚为什么在使用 strtok() 打印新标记化的字符串时出现段错误。最后我意识到我没有包括 string.h。添加此行后,我得到了预期的行为并且没有更多的段错误......耶!但是,如果有人可以解释我遇到的行为并回答以下问题,我是 c 的新手(虽然不是编程)...

  1. 为什么调用 strtok() 时没有收到错误消息?
  2. 我最近读到,如果不包含 string.h,将使用默认方法签名。但是,我想使用 strtok() 的默认 sig,为什么我仍然会遇到这种未定义的行为?

    char    str[]= "ls -l";    
    char *  p    = strtok (str, " ");
    
    printf ("%s\n",p);
    

最后一行出现段错误

问题是 implicit function declaration,您应该使用警告来防止它。

分段错误是因为编译器认为 strtok() 正在返回一个整数,所以您将一个有符号整数分配给一个指针,然后尝试取消引用该指针,这是未定义的行为,可能会导致在分段错误中。

也永远不要尝试访问从 strtok() 返回的指针而不先检查它是否是 NULL

char  str[] = "ls -l";    
char *p     = strtok (str, " ");

if (p != NULL)
    printf ("%s\n", p);

因为它 returns NULL 没有找到令牌。