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 作为第一个参数应该有效

4

3 回答 3

6

char *str = "foo"给你一个指向字符串文字的指针(你真的应该这样做,但是出于向后兼容性的原因const char *,C 允许 non- )。const

尝试修改字符串文字是未定义的行为。 strtok修改其输入。

于 2011-06-07T12:40:04.633 回答
5

您不能修改字符串文字。关于该主题的 c 常见问题解答对此进行了最好的解释。简而言之,如果您声明

char *stuff = "Read-only stuff";

你不能修改它。

strtok 接受 achar *的事实与您不能将数组传递给函数的事实有关,您只能传递地址。另一个 c 常见问题解答条目可能在这里有所帮助。

于 2011-06-07T12:39:30.610 回答
1

前面的答案给出了所需的答案,但附加信息:您可能需要考虑使用 strdup() 创建字符串的副本,然后可以在 strtok() 中使用。只需保留一个指向原始返回缓冲区的指针,因为当它被分配时,您需要 free() 完成它。

于 2011-06-07T12:44:52.423 回答