strcpy
將第二個字符串的內容複製到第一個字符串的內存中。既然你將字符串文字複製到字符串文字中,它不能這樣做(你不能寫入字符串文字),所以它會抱怨。
相反,您需要構建自己的搜索和替換系統。您可以使用strstr()
在字符串中搜索子字符串,並將內存中的指針返回到找到的字符串的開頭(如果找到)。
我們來看一下示例字符串Jack and Jill went up the hill
。
char *andloc = strstr(buffer, " and ");
這將在它(0x100 + 4
),這將是0x104
返回字符串(比如0x100
)加字的偏移「和」(包括空格)的起始地址。
然後,如果找到了,則可以用&
符號替換它。但是,您不能使用strcpy
,因爲它會終止字符串。相反,你可以手動設置的字節數,或者使用memcpy:
if (andloc != NULL) { // it's been found
andloc[1] = '&';
andloc[2] = ' ';
}
或:
if (andloc != NULL) { // it's been found
memcpy(andloc, " & ", 3);
}
這將導致Jack & d Jill went up the hill
。我們尚未完成。接下來,你必須將所有東西洗牌,以覆蓋舊的「和」的「d」。爲此,您認爲現在可以使用strcpy
或memcpy
,但這是不可能的 - 字符串(源和目標)重疊,並且手冊頁都明確指出字符串不得重疊並使用memmove
代替。
所以,你可以在「d」後,移動字符串的內容後,「&」而不是:
memmove(andloc + 3, andloc + 5, strlen(andloc + 5) + 1);
添加一個數字串像,增加了指針的地址。因此,我們正在考慮將字符串中的5個字符的數據進一步複製到舊的「和」位置,並將舊的「和」位置放入從3個字符開始的空間中。要複製的數量是從「and」位置開始的5個字符起加上一個字符串的長度,以便在字符串末尾複製NULL字符。
做這將是通過每個字符迭代,直到找到字符串結尾的另一種手動方式:
char *to = andloc + 3;
char *from = andloc + 5;
while (*from) { // Until the end of the string
*to = *from; // Copy one character
to++; // Move to the ...
from++; // ... next character pair
}
*to = 0; // Add the end of string marker.
所以現在無論哪種方式字符串內存包含:
Jack & Jill went up the hill\0l\0
的\0
是字符串標記的結尾,所以實際的字符串「內容」僅在第一個\0
和l\0
現在被忽略。
請注意,這隻適用於如果您更換較小的零件。如果你用更大的東西替換它,所以字符串的大小會增加,你將不得不使用memmove
,它首先將內容複製到暫存器,並確保你的緩衝區有足夠的空間來存儲完成的字符串(this這種事情往往是「緩衝區超支」的一個重要來源,這是一個安全問題,也是導致系統被黑客攻擊的最大原因之一)。另外,你必須向後做整件事 - 先移動弦的後半部分以騰出空間,然後修改兩半之間的間隙。
你能提供你的代碼到目前爲止嗎?並輸入數組的例子? – Mazaryk
你描述_replace_,而不是複製。 'String x =「this and that」; x.replace( 「和」, 「+」); Serial.println(x);' – dandavis
這純粹是一個編程問題,而不是Arduino問題。 VTC。 –