C语言中strtok函数出现错误

4
我正在使用一个简单的程序,使用strtok函数将字符串进行标记化。以下是代码 -
# include <stdio.h>
char str[] = "now # time for all # good men to # aid of their country";   //line a
char delims[] = "#";
char *result = NULL;
result = strtok( str, delims );
while( result != NULL ) {
    printf( "result is \"%s\"\n", result );
    result = strtok( NULL, delims );
}

程序运行成功。然而,如果将a行更改为

,则会出现错误。
char * str= "now # time for all # good men to # aid of their country";   //line a 

strtok函数会导致核心转储。我想了解一下为什么会这样?因为从strtok的声明中可以看出--char *strtok( char *str1, const char *str2 );第一个参数char *str应该有效。


数组不是指针,指针也不是数组。你可能会喜欢c-faq,特别是第6节。 - pmg
3个回答

6

char *str = "foo"会给你一个指向字符串常量的指针(实际上应该使用const char *,但是由于C语言允许非const的方式是为了保持向后兼容性)。

试图修改字符串常量是未定义行为。而strtok会修改它的输入。


5
您无法修改字符串常量。关于这个问题,C语言FAQ解释得最好。简而言之,如果您声明了一个字符串如下:
char *stuff = "Read-only stuff";

您无法修改它。

strtok接受char *的事实与您无法将数组传递给函数有关,您只能传递地址。这里的另一个C FAQ条目可能会有所帮助。


1
之前的回答已经给出了所需的答案,但是还有额外的信息:您可能想考虑使用strdup()来创建字符串的副本,然后可以在strtok()中使用它。只需保留对原始返回缓冲区的指针,因为在完成后需要使用free()释放它,因为它是malloced的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接