Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在不包含string.h的情况下使用strtok,请解释其行为_C_Unix - Fatal编程技术网

C 在不包含string.h的情况下使用strtok,请解释其行为

C 在不包含string.h的情况下使用strtok,请解释其行为,c,unix,C,Unix,所以在过去的几个小时里,我一直在试图找出为什么在使用strtok()打印新标记的字符串时出现seg错误。最后我意识到我没有包括string.h。添加这条线后,我得到了预期的行为,没有更多的分段故障。。。耶!然而,如果有人能解释我所经历的行为并回答以下问题,我是c新手(虽然不是编程) 为什么调用strtok()时没有收到错误,而它没有包含在内 我最近读到,如果不包括string.h,将使用默认的方法签名。但是,我想使用strtok()的默认sig,那么为什么我仍然得到这种未定义的行为呢 char

所以在过去的几个小时里,我一直在试图找出为什么在使用strtok()打印新标记的字符串时出现seg错误。最后我意识到我没有包括string.h。添加这条线后,我得到了预期的行为,没有更多的分段故障。。。耶!然而,如果有人能解释我所经历的行为并回答以下问题,我是c新手(虽然不是编程)

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

    char    str[]= "ls -l";    
    char *  p    = strtok (str, " ");
    
    printf ("%s\n",p);
    
  • 最后一行的Seg故障问题是,您应该使用警告来防止出现这种情况

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

    另外,如果未首先检查返回的指针是否为空,则切勿尝试从
    strtok()
    访问该指针

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

    因为当找不到令牌时,它返回
    NULL

    你能添加编译的代码吗?我现在明白了,c是一种有趣的语言,感谢你澄清了这一点。一旦你习惯了像c程序员一样思考,你会发现其他编程语言是如此愚蠢,我不喜欢任何编程语言,因为我喜欢c。我主要是java,还有一点c#的应用程序开发。我希望我是从c开始的。我将在43秒后接受你的答案,当我能够:)你的编辑我知道:)刚刚给出了一个快速的代码示例