How to change the value of the string being pointed to by *str to now be newstr?
你不能因爲(1)你傳遞str
的功能char *s
和的方式(2),因爲你聲明newstr
爲一個局部變量replace
。 (也可能爲那些不是從您發佈的代碼有限的部分確定的其他原因一大堆)
當你傳遞一個指針的函數,該函數接收指針的副本它非常自己的和差別很大內存地址。換言之,當您在函數參數列表中聲明參數char *str
時,會創建一個新指針。 (它仍指向str
中的任何內容,但其可變地址與調用函數中的原始指針地址非常不同 - 因此,您對str
的地址所做的任何操作都不會在調用函數中反映出來)。如果你想給一個函數中的指針分配一個新地址,你必須通過從調用者傳遞原始地址。例如
void replace(char **str, char toReplace, char replaceWith)
,然後在調用程序與調用它:
replace (&origPtr, char toReplace, char replaceWith)
(作爲一種風格旁白:不要使用用C CamelCase
變量,camelcase
是正確的)
最後,由於當您退出功能replace
時,newstr
的地址將被銷燬,您將newstr
的地址指定爲*str
的唯一選項是(1)聲明newstr
作爲static
,或(2)動態分配newstr
(例如, char *newstr = malloc (sizeof *newstr * strLen + 1);
。然後,您可以將newstr
的值指定爲str
。例如:
void replace(char **str, char toReplace, char replaceWith) {
int strLen = strlen(*str);
int i;
char *newstr = malloc (sizeof *newstr * strLen + 1);
if (!newstr) {
fprintf (stderr, "error: virtual memory exhausted.\n");
exit (EXIT_FAILURE);
}
for (i = 0; i < strLen; i++) {
if ((*str)[i] == toReplace)
newstr[i] = replaceWith;
else
newstr[i] = (*str)[i];
}
newstr[strLen] = 0; /* nul-terminate (or use calloc to allocate) */
free (*str); /* MUST have been dynamically allocated in caller */
*str = newstr;
}
(注:str
一定不是靜態地調用函數聲明,你必須free
的內存它指向的塊或者你會被改寫的起始地址爲創建內存泄漏內存它原來指向塊 - 使其無法釋放原始塊)
所有這些原因的原因,最好是通過更改到位toReplace
和replaceWith
字符來解決這個問題(假設它str
是一個陣列,而不是一個字串文本),或使一個附加的陣列,以填補替換作爲參數(或作爲指針分配 - 或返回一個指針的存儲器包含新新分配的塊串)。
讓我知道你是否還有其他問題。
爲什麼不直接在字符串上工作?請注意字符串是如何創建的,如果您正在測試字符串文字,您將無法更改它,因爲它被放置在只讀內存部分。 – DMH
請顯示您的實際功能。 – paddy
它是一個字符串文字。 – Jeremiah