为什么我在字符串标记化器功能上遇到段错误?

时间:2014-11-14 16:55:56

标签: c string strtok

代码:

#include <string.h>
#include <libgen.h>
#include <stdio.h>

int main()
{
    char *token = strtok(basename("this/is/a/path.geo.bin"), ".");
    if (token != NULL){
        printf( " %s\n", token );
    }
    return(0);
}

如果我提取文件路径并将其放入char数组中,它可以完美地工作。但是,像这样我得到了一个段错误。

2 个答案:

答案 0 :(得分:2)

来自basename()的文档:

  

char *basename(char *path);

     

dirname()basename() 都可以修改path 的内容,因此在调用其中一个函数时可能需要传递副本。< / p>      

这些函数可能返回指向静态分配内存的指针,这些内存可能会被后续调用覆盖。或者,它们可能返回指向路径某些部分的指针,因此在不再需要函数返回的指针之前,不应修改或释放path引用的字符串。

此外,已知strtok()修改传递给它的字符串:

  

使用这些功能时要小心。如果您确实使用它们,请注意:

     
      
  • 这些函数修改了他们的第一个参数。

  •   
  • 这些函数不能用于常量字符串。

  •   

这可能是您的问题的根源,因为不能修改字符串文字:

  

如果程序试图修改这样的数组,则行为是未定义的。

你应该解决这个问题。

供参考:

答案 1 :(得分:2)

似乎函数basename只返回字符串文字中的指针&#34;这/是/ a / path.geo.bin&#34;甚至试图改变它。

但是可能不会更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。函数strtok将传递给它的字符串更改为参数。

根据C标准(6.4.5字符串文字)

  

7未指明这些阵列是否与它们不同   元素具有适当的值。 如果程序尝试   修改这样的数组,行为是未定义的。

因此程序看起来像

int main()
{
    char name[] = "this/is/a/path.geo.bin";
    char *token = strtok(basename( name ), ".");
    if (token != NULL){
        printf( " %s\n", token );
    }
    return(0);
}