对字符的写入权限* 重合问题:需要能够修改C++中的char *内容。

对字符的写入权限* 重合问题:需要能够修改C++中的char *内容。,c++,char,C++,Char,我有一个类似这样的函数:char*buffer=(char*)函数 现在我需要修改'buffer',例如,做类似于这个buffer[1]=“h” 我尝试过的方法包括: char*string=“Hello World”; 字符缓冲区[65]//我还需要知道确切的尺寸 strcpy(缓冲区、字符串); 缓冲区[1]=“r” 我也尝试过与马洛克。 不幸的是,编译器总是抱怨如下:“无法从const char[2]转换为char”。这在windows上发生。 我对g++编译器没有这样的问题 我已经看了下

我有一个类似这样的函数:char*buffer=(char*)函数

现在我需要修改'buffer',例如,做类似于这个buffer[1]=“h”

我尝试过的方法包括: char*string=“Hello World”; 字符缓冲区[65]//我还需要知道确切的尺寸 strcpy(缓冲区、字符串); 缓冲区[1]=“r”

我也尝试过与马洛克。 不幸的是,编译器总是抱怨如下:“无法从const char[2]转换为char”。这在windows上发生。 我对g++编译器没有这样的问题

我已经看了下面的链接,但我还是什么都做不了。


谢谢

您的问题在引号中,您必须使用
'
如果您想从编译器中获取字符,
'
是一个字符串,并且具有可选的null终止符(一个字符),然后您将错误字符[2](字符+null)转换为字符


尝试
*(缓冲区+x)='h'

x-是要更改的字符位置。

您不能更改*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

<> P>因为你的问题被标记为C++,所以我必须质疑你使用原始字符的意图,除非你很有信心,否则不推荐。 其次,char*或char[]完全可以修改。您遇到的问题是,您在“Hello World”中创建了一个const char*,然后试图使其中的一个字符等于一个字符串。字符不是字符串。“r”是一个字符串,它是一个常量字符*。所以你试图将常量字符*等同于字符,这是一个错误。你的意思是“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.
std::string mystring((char*)函数);//承担这一职能
//将释放它自己的内存。
if(索引
您必须了解以下两行之间存在差异:

char  myArray[] = "Hello Mars!";
char* myPointer = "Hello World!";
第一种方法创建一个可以操纵的字符数组。整个阵列将在堆栈上分配

第二个函数使用字符串文本初始化指向char的指针(C语言的特殊构造允许这样做)。这是一个常数。您将获得它的地址,但实际上它是一个常量字符数组。实施情况如下:

该字符串将按字面意思存储在内存中的可执行图像中(作为hdd上文件的相同副本),您将获得指向该字符串的指针。堆栈上将为指针
myPointer
留出空间。将字符串文字视为代码中的文字数(是的,我正在谈论的神奇数字)。编译器需要将这些字符存储在某个地方,但这不是您在程序中通常使用的内存类型。它不在堆上,也不在堆栈上。有关更多信息,请参见以下问题的答案:

编辑:关于指针和数组

使其不可变的不是
char*
,而是字符串文字。指针和数组是非常相关的。数组的行为通常类似于指针。考虑到上述准则,这是完全合法的:

myPointer = myArray;
myPointer
不是常量,您可以将其更改为指向
myArray
的地址,而不是字符串文本。它指向的地址是只读的。现在
myPointer
指向堆栈上存储
“Hello Mars!”
的地址。你现在可以写:

myPointer[3] = 'Z';
如果你想对此有一个全面的了解,请阅读一些类似的教程

关于常数的讨论

Const可能会混淆,尤其是指针

const char* const myPointer2 = myPointer;
第一个常量使字符常量,因此您不能使用
myPointer2
来更改它们,第二个常量使指针本身常量,因此您不能让它指向类似
myPointer2=myArray这样的其他对象


有关更多信息,请参阅。

必须将函数的输出强制转换为char*然后将其转换为array,这对我来说不是很有效吗?还有其他出路吗?不,没有办法改变:“char*streadonly=“只读数据”;“请查看@ufotds answer了解更多信息……没有强制转换。如果char字符串、指针、StrcPy和[]语法都在你的脑海中,那么考虑切换到STD::字符串,它将按照你可能期望字符串的方式运行。+ 1,找到一个真正读取错误消息的人总是很好的。+ 1,即使在技术上,<代码>“r”<代码>是<代码> const char(2)。
而不是
常量字符*
§2.13.4[lex.string]/1普通字符串文字具有“n常量字符数组”类型和静态存储持续时间谢谢大家。我还需要问你这个问题。我目前正在将一个文件映射到内存。映射文件的类型为char*。我现在需要修改char*。我要做的是将它复制到一个数组中,然后对该数组进行修改。但我会失去效率吗?将文件的一部分复制到数组中,然后进行操作不是更好吗。并不是char*使其保持不变。它是字符串文字“Hello World!”。我将在上面对此进行详细阐述。关于映射文件,我从未使用过映射文件,但我想知道它是否真的适合您正在尝试的操作。通常不需要映射文件。对我来说,这似乎只有在你想改变磁盘上的文件时才有意义。否则,只需使用普通的文件访问方法读取所需的部分,然后在没有额外副本的情况下更改它们。或者问一个关于它的新问题,包括你的代码。