2010-06-24 111 views
3

重点问题:需要能够在C++中修改char *的内容。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?

感谢

回答

3

您的问题是在引号,则必须使用'',如果你想焦炭从编译器,""是一个字符串,并有anditional 终止(一个char)那么你得到错误char [2]char + null)至char


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

X - 为您的字符的位置来改变。

+1

+1找到真正读*错误信息的人总是很好。 – 2010-06-24 11:20:17

4

你不能改变*字符字符串=“Hello World”的作为字符串为“只读”,但你可以使用字符字符串[] = ..这将编译安排到修改数组:

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 
+0

对于我来说,将我的函数的输出转换为char *并将其转换为数组效率不高?有没有另一种出路 – user375103 2010-06-24 10:36:48

+0

不,没有办法改变:“char * strReadOnly =”只读数据“;” 请看@ufotds回答获取更多信息... – sinek 2010-06-24 10:53:05

+1

没有演员。如果char *字符串,指针,strcpy和[]语法都在吹嘘你的想法,那么考虑切换到std :: string,这将表现出你可能期望字符串行为的方式。 – 2010-06-24 11:08:10

5

由于您的问题被标记C++,我必须质疑你的意图为U唱原始字符*,除非你非常自信,否则不推荐。其次,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. 
+0

+1,即使技术上''r“'的类型是'const char [2]'而不是'const char *'§2.13.4[lex.string]/1 *一个普通的字符串常量的类型是”array n const char“和静态存储持续时间* – 2010-06-24 11:22:47

+0

对于C++风格的+1 – sinek 2010-06-24 11:25:25

2

你必须明白,有以下两行之间的差:

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

第一个创建字符数组,其可以是操纵。整个数组将被分配在堆栈上。

第二个初始化字符的指针字符串文字(来自C语言的特殊结构允许这样做)。这被认为是一个常数。你会得到它的地址,但它确实是一个常量字符数组。实现如下:

该字符串将被存储在您的可执行映像文件中(作为hdd文件的完全相同副本),您将获得指向该字符串的指针。空间将在指针myPointer的栈上进行。考虑一下字符串文字,就像代码中的文字数字(是的,我正在谈论的神奇数字)。编译器需要将这些字符存储在某个地方,但它不是您通常在您的程序中使用的那种内存。它不在堆上,也不在堆上。一看便知以下问题的更多信息:

Global memory management in C++ in stack or heap?

编辑:关于指针和数组

这不是char*,使得它不可改变的,但字符串文字。指针和数组非常相关。数组通常表现得像一个指针。考虑到上述这个代码是完全合法的:

myPointer = myArray; 

myPointer不是常量,你可以改变它指向的myArray而不是字符串文字的地址。它指向的地址是只读的。现在myPointer指向存储"Hello Mars!"的堆栈上的地址。您现在可以这样写:

myPointer[3] = 'Z'; 

如果你想获得的这个torough理解,阅读一些教程就像this one

上常量性

CONST可以尤其是与指针来混淆。

const char* const myPointer2 = myPointer; 

第一个常量,使字符常量,所以你不能使用myPointer2改变他们,而第二常量使指针本身是常量,所以你不能让它指向别的东西像myPointer2 = myArray;

this explanation欲了解更多信息。

+0

谢谢大家。我仍然需要问你这个。我目前正在将一个文件映射到内存。映射文件的类型为char *。我现在需要修改char *。我所做的是将其复制到一个数组,然后对该数组进行修改。但是我会失去效率吗?将文件的一部分复制到数组然后进行操作是否更好? – user375103 2010-06-25 05:59:11

+0

好的,也许你还是完全不明白。它不是使得它不变的char *。它是字符串文字“Hello World!”。我会详细阐述一下上面的内容。关于映射的文件,我从来没有使用映射文件,但我想知道它是否确实适合您正在尝试做的事情。一个不经常需要映射文件。对我来说,只有当你想要更改磁盘上的文件时,这似乎才有意义。否则,只需使用普通文件访问方法阅读所需的部分,然后在没有额外副本的情况下更改它们。或者用你的代码问一个关于它的新问题。 – nus 2010-06-25 08:48:46