2017-05-07 48 views
0

對編程和C++非常新穎,所以對我來說是裸露的;陣列轉換指導

我被困在將數組內容(從用戶輸入)轉換爲預先聲明的簡寫的任務上。我希望它像strcpy(「和」,「+」)一樣簡單; 將字符串中的單詞'和'更改爲'+'符號。

不幸的是,無論我如何構造函數,我收到了一個不推薦的轉換警告(變體循環和直接應用程序嘗試)。

附註;這是基於賦值的,所以我的字符串快捷鍵受到嚴格限制,並且沒有指針(我已經看到使用它們清除故障的多個版本)。

我不是在找人做我的功課;只需指導如何在不創建dep的情況下應用strcpy。警告。也許我不應該使用strcpy?

再次,非常新的在這個。

謝謝。

+4

你能提供你的代碼到目前爲止嗎?並輸入數組的例子? – Mazaryk

+0

你描述_replace_,而不是複製。 'String x =「this and that」; x.replace( 「和」, 「+」); Serial.println(x);' – dandavis

+1

這純粹是一個編程問題,而不是Arduino問題。 VTC。 –

回答

2

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」。爲此,您認爲現在可以使用strcpymemcpy,但這是不可能的 - 字符串(源和目標)重疊,並且手冊頁都明確指出字符串不得重疊並使用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是字符串標記的結尾,所以實際的字符串「內容」僅在第一個\0l\0現在被忽略。

請注意,這隻適用於如果您更換較小的零件。如果你用更大的東西替換它,所以字符串的大小會增加,你將不得不使用memmove,它首先將內容複製到暫存器,並確保你的緩衝區有足夠的空間來存儲完成的字符串(this這種事情往往是「緩衝區超支」的一個重要來源,這是一個安全問題,也是導致系統被黑客攻擊的最大原因之一)。另外,你必須向後做整件事 - 先移動弦的後半部分以騰出空間,然後修改兩半之間的間隙。

+0

感謝您的指導,但其中一些仍然超出了賦值參數。我與所允許的一起工作......並且幫助我取得了很大進步。謝謝。 這是迄今爲止的轉換原型(用於「And」和「+」);它沒有給我一個輸出,我不確定下一步是什麼。我是否應該採取更新措施?如果是,我不確定它會是什麼樣子。 –

+0

什麼是賦值參數? – Majenko

+0

字符轉換() { \t char句子[SIZE]; char nsentence [SIZE]; int i; \t int senti = 0; \t int nsenti = 0; \t bool same = true; \t做 \t { \t \t如果(句子[senti] == 'A' |句子[senti] == 'A') \t \t \t同一=真; \t \t否則如果(句子[senti + 1] = 'N' |句子[senti + 1] = 'n' 個!)//在toupper \t \t \t相同= FALSE; \t \t else if(sentence [senti + 2]!='D'| sentence [senti + 2]!='d') \t \t \t same = false; \t \t \t如果(相同) \t \t \t { \t \t \t \t相同= 「+」; \t \t \t \t的for(int i = 0; I