Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么strtok在给定*字符串时会出错,而在给定字符串[]时不会出错?_C_Strtok - Fatal编程技术网

C 为什么strtok在给定*字符串时会出错,而在给定字符串[]时不会出错?

C 为什么strtok在给定*字符串时会出错,而在给定字符串[]时不会出错?,c,strtok,C,Strtok,考虑以下程序 #include <stdio.h> #include <string.h> int main() { char *str = "This is a test."; char *token; token = strtok(str," "); } #包括 #包括 int main(){ char*str=“这是一个测试。”; 字符*令牌; 标记=strtok(str,“”); } 这将是一个错误。但是如果我把*str改成,比如说

考虑以下程序

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

int main() {
    char *str = "This is a test.";
    char *token;

    token = strtok(str," ");
}
#包括
#包括
int main(){
char*str=“这是一个测试。”;
字符*令牌;
标记=strtok(str,“”);
}
这将是一个错误。但是如果我把*str改成,比如说,str[80],它就不会。为什么会这样


谢谢

问题是类型不对

char *str = "This is a test.";
它可能会说
char*
,但右边的东西实际上是
char const*
(C在允许类型双关方面非常宽松(这个词正确吗))。任何修改常量的尝试都是未定义的行为

函数
strtok()
实际上修改了基础字符串(通过插入'\0'),因此这是未定义的行为

通过做来修正

char str[] = "This is a test.";

问题是类型不对

char *str = "This is a test.";
它可能会说
char*
,但右边的东西实际上是
char const*
(C在允许类型双关方面非常宽松(这个词正确吗))。任何修改常量的尝试都是未定义的行为

函数
strtok()
实际上修改了基础字符串(通过插入'\0'),因此这是未定义的行为

通过做来修正

char str[] = "This is a test.";

你知道数组和指针的区别吗?知道。你是说*str失败是因为它是指针,而str[]是数组?表示“由于数组会立即衰减为指针,因此数组永远不会真正传递给函数。”。这让我相信,在这两种情况下,我都在传递一个指向strtok的指针。但是,在工作情况下,您传递的是指向数组的指针,而在非工作情况下,您传递的是指向字符串文字的指针。您知道数组和指针之间的区别吗?是的。你是说*str失败是因为它是指针,而str[]是数组?表示“由于数组会立即衰减为指针,因此数组永远不会真正传递给函数。”。这让我相信,在这两种情况下,我都在传递一个指向strtok的指针。但是,在工作情况下,您传递的是指向数组的指针,而在非工作情况下,您传递的是指向字符串文字的指针。