Coincise问题:需要能够在c ++中修改char *的内容。
我有一个类似这样的函数:char * buffer =(char *)FUNCTION
现在我需要修改'缓冲',例如做类似这样的缓冲[1] =“h”;
我尝试过的是以下内容: char * string =“Hello World”; char buffer [65]; //我仍然需要知道确切的大小 strcpy(buffer,string); buffer [1] =“r”;
我也尝试过malloc。 不幸的是,编译器总是抱怨以下内容:“无法从const char [2]转换为char”。这发生在Windows上。 我对g ++编译器没有这个问题。
我查看了以下链接,但仍然无法做任何事情。 http://www.developerweb.net/forum/archive/index.php/t-3517.html About character pointers in C Is it possible to modify a string of char in C?
由于
答案 0 :(得分:5)
由于您的问题被标记为C ++,我必须质疑您使用原始字母*的意图,除非您非常自信,否则不建议使用。
其次,char *或char []完全有效修改。您遇到的问题是您在“Hello World”中创建了一个const char *,然后尝试使其中的一个字符等于一个字符串。字符不是字符串。 “r”是一个字符串,它是一个const char *。所以你试图将const char *等同于char,这是一个错误。你的意思是'r',这是一个char。
更好的代码是:
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.
答案 1 :(得分:4)
您无法更改* 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
答案 2 :(得分:3)
您的问题在引号中,如果您希望编译器中的 char ,则必须使用''
,""
是一个字符串并且具有anditional < em> null 终止(一个 char )然后你得到错误 char [2] ( char + null )到炭
尝试 *(buffer + x) = 'h';
x - 是你要改变的char的位置。
答案 3 :(得分:2)
您必须了解以下两行之间存在差异:
char myArray[] = "Hello Mars!";
char* myPointer = "Hello World!";
第一个创建一个可以操作的字符数组。整个数组将在堆栈中分配。
第二个使用字符串文字初始化指向char的指针(C语言中的特殊构造允许这样做)。这被认为是一个常数。你会得到它的地址,但它确实是一个const chars数组。实施如下:
字符串将字面存储在内存中的可执行映像中(作为hdd上文件的相同副本),您将获得指向该字符串的指针。将在堆栈上为指针myPointer
创建空格。将字符串文字视为代码中的文字数字(是的,我正在谈论的神奇数字)。编译器需要在某处存储这些字符,但它不是您通常在程序中使用的那种内存。它不在堆上,也不在堆栈上。有关详细信息,请参阅以下问题的答案:
Global memory management in C++ in stack or heap?
编辑:关于指针和数组
不是char*
使它成为不可变的,而是字符串文字。指针和数组非常相关。数组通常表现得像指针一样。考虑到上面的代码,这是完全合法的:
myPointer = myArray;
myPointer
不是const,您可以将其更改为指向myArray
的地址而不是字符串文字。它指出的地址是只读的。现在myPointer
指向存储"Hello Mars!"
的堆栈上的地址。你现在可以写:
myPointer[3] = 'Z';
如果您想了解这一点,请阅读this one等教程。
on constness
Const可能会让指针特别困惑。
const char* const myPointer2 = myPointer;
第一个const使字符成为const,所以你不能使用myPointer2
来改变它们,第二个const使得指针本身就是const,所以你不能让它指向像myPointer2 = myArray;
< / p>
有关详细信息,请参阅this explanation。