【问题标题】:strtok_s crashes program when string is of char *当字符串为 char * 时 strtok_s 使程序崩溃
【发布时间】:2016-10-14 02:54:29
【问题描述】:

我正在尝试从由空格(“”)分隔的字符串中获取标记。但是当字符串是 char * 类型时,下面的代码会使应用程序崩溃。

#include <stdio.h>
#include <string.h>

int main(){

char *str1 = "Hello World!"; //char str1[] works
char *token;
char *savePtr;

token = strtok_s(str1, " ", &savePtr);

printf("%s", token);

return 0;
}

我还收到以下警告:

C:\Users\Haris\Desktop\C files>gcc firstProgram.c -o firstprogram.exe
firstProgram.c: In function 'main':
firstProgram.c:10:9: warning: implicit declaration of function 'strtok_s' [-Wimplicit-function-declaration]
 token = strtok_s(str1, " ", &savePtr);
         ^
firstProgram.c:10:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
 token = strtok_s(str1, " ", &savePtr);

【问题讨论】:

    标签: c arrays string pointers strtok


    【解决方案1】:

    strtok_s 函数修改指针指向的东西,将分隔符变为零。所以它不能接受一个指向常量的指针。但是你将它传递给str1,它是一个指向字符串常量的指针。当它试图修改该字符串以将分隔符变为零时,它会尝试修改一个常量。那当然是非法的。

    【讨论】:

    • 谢谢。但是,我怎样才能使用 strtok_s 来修改字符串呢?字符串应该是什么类型?
    • *修改字符串并获取令牌。例如,我正在使用的字符串是“echo par par”。如何使用此功能获得“回声”?
    • 只是不要将指针传递给常量。你可以这样做char str1[]="hello world"; 或像这样char *ptr=strdup("hello world");char buf[80]; strcpy(buf, "hello world");——随便。只是不要将指针传递给常量。
    • 谢谢。现在说得通了。
    • 只是好奇,为什么 strdup 中的字符串重复指针可以修改,但原始指针不能修改?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多