使用strtok而不包括string.h,请解释行为

时间:2015-01-28 01:54:29

标签: c unix

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

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

    char    str[]= "ls -l";    
    char *  p    = strtok (str, " ");
    
    printf ("%s\n",p);
    
  3. 最后一行的段错误

1 个答案:

答案 0 :(得分:2)

问题是implicit function declaration,您应该使用警告来阻止这种情况。

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

也绝不会尝试从strtok()访问返回的指针而不检查它是否NULL首先

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

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

因为没有找到令牌时会返回NULL