代码:

#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数组中,那么它工作得很好。然而,像这样我得到一个segfault。

最佳答案

函数basename似乎只是返回字符串文本“this/is/a/path.geo.bin”中的指针,甚至试图更改它。
但是字符串文字不能更改。任何更改字符串文本的尝试都会导致未定义的行为。函数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);
}

关于c - 为什么在字符串标记器函数上出现段错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26935073/

10-16 11:46
查看更多