2010-06-24 118 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