C++ 将常量char*分配给char* #包括 字符*str0; 常量字符*str1=“abc”; //将str1分配给str0 strcpy(str0,str1);//语法正确,但运行时错误 str0=str1;//语法错误,无法将常量字符*转换为字符* 字符串n_str=str1; str0=n_str;//语法错误,无法转换。。。 cout
C++ 将常量char*分配给char* #包括 字符*str0; 常量字符*str1=“abc”; //将str1分配给str0 strcpy(str0,str1);//语法正确,但运行时错误 str0=str1;//语法错误,无法将常量字符*转换为字符* 字符串n_str=str1; str0=n_str;//语法错误,无法转换。。。 cout,c++,string,pointers,C++,String,Pointers,const是类型的一部分,因此,您可以将其“丢弃”。这被认为是不好的做法,但您应该将const看作是原始程序员的强烈建议,而不是修改它 #include <cstring> char* str0; const char* str1 = "abc"; // assign str1 to str0 strcpy(str0, str1); // syntax correct, but run time error str0 = str1; // syntax
const
是类型的一部分,因此,您可以将其“丢弃”。这被认为是不好的做法,但您应该将const
看作是原始程序员的强烈建议,而不是修改它
#include <cstring>
char* str0;
const char* str1 = "abc";
// assign str1 to str0
strcpy(str0, str1); // syntax correct, but run time error
str0 = str1; // syntax error, cannot convert const char* to char*
string n_str = str1;
str0 = n_str; // syntax error, cannot convert ...
cout << str0 << endl; // expected output: abc
const
是该类型的一部分,因此,您可以将其“丢弃”。这被认为是不好的做法,但您应该将const
看作是原始程序员的强烈建议,而不是修改它
#include <cstring>
char* str0;
const char* str1 = "abc";
// assign str1 to str0
strcpy(str0, str1); // syntax correct, but run time error
str0 = str1; // syntax error, cannot convert const char* to char*
string n_str = str1;
str0 = n_str; // syntax error, cannot convert ...
cout << str0 << endl; // expected output: abc
如果您坚持使用糟糕的C++:
char* str0;
const char* str1 = "abc";
str0 = malloc(strlen(str1) + 1);
// if you use a c++ compiler you need instead:
// str0 = (char*) malloc(strlen(str1) + 1);
strcpy(str0, str1);
// and free after use
// if you use C++ this will not help much
// as pretty much any exception above will cause your code to get out of `free`,
// causing a memory leak
free(str0);
请阅读有关RAII的内容,了解为什么所有手动内存管理解决方案都不好:
如果您坚持使用糟糕的C++:
char* str0;
const char* str1 = "abc";
str0 = malloc(strlen(str1) + 1);
// if you use a c++ compiler you need instead:
// str0 = (char*) malloc(strlen(str1) + 1);
strcpy(str0, str1);
// and free after use
// if you use C++ this will not help much
// as pretty much any exception above will cause your code to get out of `free`,
// causing a memory leak
free(str0);
请阅读有关RAII的内容,了解为什么所有手动内存管理的解决方案都不好:,复制
字符串是一项昂贵的操作。但是将字符串
从一个地方移动到另一个地方是有效的
丢弃常量
str0=(char*)str1;
或者使用std::string
类模板库来管理字符串std::string
拥有存储字符串值的字符缓冲区。字符是字符串
对象的一部分contchar*
存储这样一个字符缓冲区的地址,但不拥有它
c_str
返回指向以null结尾的字符串的const char*
。当您想要传递内容时,它很有用
std::string str1=“abc”;
字符*str0;
strcpy(str0,str1.c_str());
printf(str0);
复制字符串
是一项昂贵的操作。但是将字符串
从一个地方移动到另一个地方是有效的
丢弃常量
str0=(char*)str1;
或者使用std::string
类模板库来管理字符串std::string
拥有存储字符串值的字符缓冲区。字符是字符串
对象的一部分contchar*
存储这样一个字符缓冲区的地址,但不拥有它
c_str
返回指向以null结尾的字符串的const char*
。当您想要传递内容时,它很有用
std::string str1=“abc”;
字符*str0;
strcpy(str0,str1.c_str());
printf(str0);
让我们一次看一个问题
strcpy(str0,str1);
将str1指向的字符复制到str0指向的内存中。str1指向“abc”,但str0不指向任何东西,因此出现运行时错误。我建议在任何地方都使用std::string,这样您就不必自己管理内存了
str0=str1;
str0是char*类型,str1是const char*类型。const限定符指示编译器不允许对该特定变量进行数据修改(与const的简化角色相比,要获得更深入的解释,请使用您喜爱的搜索引擎,您应该能够找到一系列解释const的文章)。如果您能够将同一个指针分配给str0,您将破坏const契约;str0可以修改
string n_str=str1;
这是有效的,因为std::string重载赋值运算符,并接受const char指针作为右侧值
str0=n_str;
n_str的类型是std::string,str0的类型是char*,没有重载运算符允许这样做。如果您确实想从std::string中提取原始点,那么可以使用c_str()方法,它将返回一个const char*——我强烈建议不要这样做,除非您必须将它传递给一个只接受const char*的函数。让我们一次看一个问题
strcpy(str0,str1);
将str1指向的字符复制到str0指向的内存中。str1指向“abc”,但str0不指向任何东西,因此出现运行时错误。我建议在任何地方都使用std::string,这样您就不必自己管理内存了
str0=str1;
str0是char*类型,str1是const char*类型。const限定符指示编译器不允许对该特定变量进行数据修改(与const的简化角色相比,要获得更深入的解释,请使用您喜爱的搜索引擎,您应该能够找到一系列解释const的文章)。如果您能够将同一个指针分配给str0,您将破坏const契约;str0可以修改
string n_str=str1;
这是有效的,因为std::string重载赋值运算符,并接受const char指针作为右侧值
str0=n_str;
n_str的类型是std::string,str0的类型是char*,没有重载运算符允许这样做。如果您确实想从std::string中提取原始点,那么可以使用c_str()方法,它将返回一个const char*——我强烈建议不要这样做,除非您必须将它传递给一个只接受const char*的函数,那么strcpy
应该在哪里复制字符串?哪儿也去不了?您应该首先为要指向的str0
分配一些内存。或者strdup
或者首先分配内存。赋值不起作用,因为它是常量,不能通过赋值来删除它。文本字符串(如“abc”
)实际上是常量字符数组。为什么需要指向这样一个数组的非常量char
指针?你需要解决的真正问题是什么?现在这太复杂了。@Someprogrammerdude最初的问题是,有一个类的成员数据类型为char*,还有一个构造函数。构造函数有一个const char*类型的参数,cons
char* str0;
const char* str1 = "abc";
str0 = new char[strlen(str1) + 1];
strcpy(str0, str1);
// and delete after use
// this will not help much
// as pretty much any exception above will cause your code to get out of `delete`,
// causing a memory leak
delete(str0);