所以在过去的几个小时里,我一直试图弄清楚为什么在使用strtok()打印新标记化的字符串时会出现seg错误最后我意识到我没有包括string.h。在添加这一行之后,我得到了预期的行为,不再有seg错误耶然而,我是c新手(虽然不是编程),如果有人能解释我正在经历的行为,并回答以下问题。。。
为什么在不包括strtok()的情况下调用strtok()时没有收到错误?
我最近读到,如果不包含string.h,将使用默认方法签名但是,我想使用strtok()的默认sig,所以为什么我仍然得到这种未定义的行为?

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

printf ("%s\n",p);

最后一条线路上的Seg故障

最佳答案

问题是implicit function declaration,您应该使用警告来防止这种情况。
分段错误是因为编译器认为strtok()返回的是一个整数,所以您将一个有符号整数赋给指针,然后尝试取消对指针的引用,这是未定义的行为,可能会导致分段错误。
也不要试图访问从strtok()返回的指针而不首先检查它是否NULL

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

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

因为它在找不到标记时返回NULL

关于c - 使用strtok而不包含string.h,请解释行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28183347/

10-16 11:30