巧合的问题:需要能够在 C++ 中修改 char* 的内容。
我有一个有点像这样的函数: char* buffer = (char*)FUNCTION
现在我需要修改“缓冲区”,例如做这样的事情 buffer[1] = "h";
我尝试过的方法如下: char *string = "你好世界"; 字符缓冲区[65]; //我还需要知道确切的大小 strcpy(缓冲区,字符串); 缓冲区[1] =“r”;
我也尝试过使用malloc。 不幸的是,编译器总是抱怨以下内容:“无法从 const char[2] 转换为 char”。这种情况发生在 Windows 上。 我的 g++ 编译器没有这样的问题。
我已经查看了以下链接,但仍然无能为力。
谢谢
由于您的问题被标记为 C++,我必须质疑您使用原始 char* 的意图,除非您非常有信心,否则不建议这样做。
其次,修改 char* 或 char[] 是完全有效的。您遇到的问题是您在“Hello World”中创建了一个 const char*,然后尝试使其中的一个字符等于一个字符串。字符不是字符串。 “r”是一个字符串,它是一个const char*。所以你试图将 const char* 等同于 char,这是一个错误。你真正的意思是“r”,它是一个字符。
更好的代码是:
std::string mystring((char*)FUNCTION); // assume that FUNCTION
// will free it's own memory.
if (index < mystring.size())
mystring[index] = 'r';
// mystring now cleans up it's own memory in all cases.
您无法更改 *char string = "Hello World" 因为字符串是“只读”,但您可以使用 char string[] = .. 它将编译器排列成可修改的数组:
char * strReadOnly = "read-only-data";
//strReadOnly [3] = '0'; //access violation
char stReadWrite [] = "read-write-data";
stReadWrite [3] = '0'; // Ok, but just make sure that indexes are in range
要将字符串复制到另一个可以更改的缓冲区中,可以执行以下操作:
char * src = "read-only-data";
const int len = strlen(src);
char * dst = new char[len+1];
strcpy(dst, src);
dst[3] = '0'; // ok to change
delete [] dst; // don't forget to delete dst
你的问题在引号中,如果你想从编译器中得到
char,你必须使用
''
,""
是一个字符串并且有一个null终止(一个char)然后你会得到错误char[ 2] (char + null) 到字符。
尝试
*(buffer + x) = 'h';
x - 是要更改的字符位置。
你必须明白以下两行之间是有区别的:
char myArray[] = "Hello Mars!";
char* myPointer = "Hello World!";
第一个创建一个可以操作的字符数组。整个数组将在堆栈上分配。
第二个使用字符串文字初始化指向 char 的指针(C 语言的一种特殊构造允许这样做)。这被认为是一个常数。你会得到它的地址,但它实际上是一个 const 字符数组。实现如下:
该字符串将按字面意思存储在内存中的可执行映像中(作为硬盘上文件的相同副本),并且您将获得指向该字符串的指针。堆栈上将为指针
myPointer
留出空间。将字符串文字视为代码中的文字数字(是的,我正在谈论的幻数)。编译器需要将这些字符存储在某处,但这不是您通常在程序中使用的内存类型。它不在堆上,也不在堆栈上。有关更多信息,请参阅以下问题的答案:
编辑:关于指针和数组
使其不可变的不是
char*
,而是字符串文字。指针和数组非常相关。数组的行为通常类似于指针。考虑到上面的代码,这是完全合法的:
myPointer = myArray;
myPointer
不是 const,您可以将其更改为指向 myArray
的地址而不是字符串文字。它指向的地址是只读的。现在myPointer
指向堆栈上存储"Hello Mars!"
的地址。你现在可以写:
myPointer[3] = 'Z';
如果您想对此有透彻的了解,请阅读一些教程,例如this one。
关于常量
Const 可能会令人困惑,尤其是对于指针而言。
const char* const myPointer2 = myPointer;
第一个 const 使字符成为 const,因此您不能使用
myPointer2
来更改它们,第二个 const 使指针本身成为 const,因此您不能让它指向其他内容,例如 myPointer2 = myArray;
请参阅此说明了解更多信息。