关于c ++:char *的写权限

Write permission for char*

一致问题:需要能够修改C++中的char内容。

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

现在我需要修改"buffer",例如,执行类似于此buffer[1]="h"的操作;

我所尝试的是:char*string="你好,世界";char buffer[65];//我仍然需要知道确切的大小strcpy(缓冲区,字符串);buffer[1]="R";

我也试过和Malloc合作。不幸的是,编译器总是抱怨:"无法从const char[2]转换为char"。这发生在Windows上。我对G++编译器没有这样的问题。

我看了下面的链接,但还是做不到任何事情。http://www.developerweb.net/forum/archive/index.php/t-3517.html网站关于C中的字符指针是否可以在C中修改一个字符字符串?

谢谢


因为你的问题是C++的标记,所以我必须质疑你使用原始char的意图,除非你很有信心,否则它是不推荐的。

其次,char*或char[]非常适合修改。问题是,您在"hello world"中创建了一个const char*,然后试图使其中的一个字符等于一个字符串。字符不是字符串。"r"是一个字符串,它是一个常量char*。所以您试图将常量char*等同于char,这是一个错误。你的意思是"r",这是个字符。

更好的代码是:

1
2
3
4
5
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[]=…它将编译器排列成可修改的数组:

1
2
3
4
    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

要将字符串复制到另一个可以更改的缓冲区中,可以执行以下操作:

1
2
3
4
5
6
7
 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,""是一个字符串,并且有一个特殊的空终止符(一个char),那么你会得到错误char〔2〕(char+null)到char。

试试*(buffer + x) = 'h';

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


您必须理解以下两行之间存在差异:

1
2
char  myArray[] ="Hello Mars!";
char* myPointer ="Hello World!";

第一个创建了一个可以操作的字符数组。整个数组将在堆栈上分配。

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

字符串将按字面顺序存储在内存中的可执行映像中(作为HDD上文件的相同副本),您将获得指向该字符串的指针。将在堆栈上为指针myPointer留出空间。在您的代码中,将字符串文字看作一个文字数字(是的,我所说的神奇数字)。编译器需要将这些字符存储在某个地方,但它不是您通常在程序中使用的那种内存。它不在堆栈上,也不在堆栈上。有关详细信息,请参阅以下问题的答案:

在堆栈或堆中C++的全局内存管理?

编辑:关于指针和数组

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

1
myPointer = myArray;

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

1
myPointer[3] = 'Z';

如果你想对这一点有一个全面的了解,请阅读一些像这样的教程。

论永恒

常量可能会混淆,尤其是指针。

1
const char* const myPointer2 = myPointer;

第一个常量使字符成为常量,因此不能使用myPointer2来更改它们,第二个常量使指针本身为常量,因此不能让它指向其他类似myPointer2 = myArray;的内容。

有关详细信息,请参阅此说明。