代码:
#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数组中,它可以完美地工作。但是,像这样我得到了一个段错误。
答案 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);
}