【问题标题】:Error in strtok function in CC中的strtok函数错误
【发布时间】:2011-09-10 01:11:51
【问题描述】:

我正在使用一个简单的程序来使用 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 作为第一个参数应该可以工作

【问题讨论】:

  • 数组不是指针,指针也不是数组。你可能会喜欢the c-faq,尤其是第 6 节。

标签: c strtok string


【解决方案1】:

您不能修改字符串文字。 The c faq on the subject 解释得最好。简而言之,如果您声明

char *stuff = "Read-only stuff";

你不能修改它。

strtok 接受char * 的事实与您不能将数组传递给函数,您只能传递地址这一事实有关。 Another c faq entry 在这里可能会有所帮助。

【讨论】:

    【解决方案2】:

    char *str = "foo" 为您提供一个指向字符串文字的指针(您确实应该使用const char *,但出于向后兼容的原因,C 允许非const)。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多