c++改变const char中的值
C++ change value in const char
我有一个const char
const char example[] = "x4Dx5AxE8x00x00x00x00x5Bx52x45x55x89xE5x81xC3";
和
DWORD* example2 = "xAAxBBxCCxDD";
,我想将example1的最后4个字节更改为example2的最后4个字节我能用c++做什么?
我试过memcpy
, strcpy
和strcpy_s
没有运气
你不应该修改常量数组!
修改固有常量对象/变量会导致未定义行为。
千万别这么做。创建它的副本并修改该副本,或者如果您想修改相同的数组,则不将其声明为const
。
- 不要修改常量字符串。
-
const char example[] = "x4Dx5AxE8x00x00x00x00x5Bx52x45x55x89xE5x81xC3";
在这里,你的字符串有几个NULL字符串终止符。这将不适用于<string.h>
中的函数(如strlen()和其他) - 使用
memcpy
,memset
函数只在知道二进制字符串的长度后才追加。 - 将结果存储在字符数组中,但不要假设它将作为常规字符串工作,因为您的数据。
你的example[]
字符数组被定义为const
,所以你不能修改它。
1)如果您以这种方式更改const char数组,您应该在编译中得到一个错误
example[2] ='R';
2)如果你通过memcpy
或strcpy
修改const char数组,你应该得到一个警告
改为
char example[] = "x4Dx5AxE8x00x00x00x00x5Bx52x45x55x89xE5x81xC3";
你不能使用strcpy
,因为你的字符数组在中间包含x00
,所以这将影响strcpy
函数。因为当strcpy
在char数组
x00
时,它会停止 example[]
char数组中间包含x00
,用strlen
查找example[]
的长度将无法正常工作。对于这种情况,我建议使用sizeof(example)
代替。
下面是如何制作副本:
char example[] = "x4Dx5AxE8x00x00x00x00x5Bx52x45x55x89xE5x81xC3";
DWORD* example2 = "xAAxBBxCCxDD";
if (sizeof(example)>=sizeof(example2))
memcpy(example+sizeof(example)-sizeof(example2), example2, sizeof(example2));
不能更改Const变量。这是设计好的。对于c类型的string对象,可以使用string类型const的内容,也可以使用指向string类型const的指针。
由于将其定义为const字符数组,因此指针隐式为const,而内容显式为const。
const char * const mystring = "hello"
在这种情况下,第一个"const"试图应用于左(没有),所以它应用于右(char类型)。所以字符串的内容可能不会改变。第二个const尝试向左应用,所以它使指针本身成为const。这意味着mystring指针必须始终指向内存中来自"hello"的"h"所在的位置。
那么之后如果我尝试:
mystring[0] = "y"
或
mystring = "gooodbye!"
他们不会工作。如果分别去掉第一个或第二个const,则可以使它们正常工作。
const的目的是允许你提前声明"这个变量不能被修改"。这意味着如果它被修改了,那么就有问题了。一般来说,对于实例化后不希望修改的变量,应该始终使用const。
永远不要修改包含常量数组的常量。如果您想更改上面的内容,请创建它的副本并更改副本。正如RasmusKaj所指出的,strcpy在这里没有帮助,因为源字符串包含零字符,所以可能使用memcpy来创建副本。