2016-12-17 205 views
0

我有一個字符數組char *menu_strings[8];,我用可重複使用的菜單()函數動態地填充屏幕菜單的選項。我可以使用手工字符串單獨更改項目,例如menu_strings[0] = "New";等,但如何從另一個函數返回一個char *並將其插入到數組的「字符串」之一?如果我使用函數像這樣通過陣列嘗試循環:如何將一些char *數組放入二維數組中?

for (i=0; i<8; i++) 
{ 
    char returnedOption[32]; 
    if (getOption(i, returnedOption)) 
    menu_strings[i] = returnedOption; 
} 

bool getOption(byte entryNum, char* option) { //code and stuff } 

...所有8個menu_strings都充滿了第八個/最後一個選項返回(I = 7),而不是每個單獨條目的字符串。 ..

for (i=0; i<8; i++) 
    Serial.println(menu_strings[i]); 

輸出:

option eight 
option eight 
option eight 
option eight 
option eight 
option eight 
option eight 
option eight 

我使用Arduino的IDE,但感覺相當自信地說我會搞砸了任何C/++ /#這裏指針的使用。此外,返回的char *不會超過31個字符加空指針。

+0

你使用'char *'爲什麼不是字符串 https://www.arduino.cc/en/Reference/String –

+1

'我可以用手型字符串單獨更改項目,例如menu_strings [0] =「New」;'這不符合你的想法,這就是問題所在。要麼使用strcpy(但首先你需要malloc,free等)或者std :: string。 – deviantfan

+2

*但是如何從另一個函數返回一個char *?從'char *'事務中退出並簡單地使用'std :: string'。根據您發佈的內容,您也可能會返回本地數組的地址。如果你這樣做,返回一個局部變量的地址是未定義的行爲。 – PaulMcKenzie

回答

1

非常感謝PaulMcKenzie,yardpenalty和deviantfan誰領導我的回答:

走出char *業務,並簡單地使用std::string。你也是 可能會返回一個本地數組的地址,給你發佈的內容。 如果你這樣做,返回一個局部變量的地址是 未定義的行爲。

這使我,而不是使用char*https://www.arduino.cc/en/Reference/StringObject Arduino的String對象,並使用toCharArray()任何庫調用,堅持一個字符指針。這有效,但增加了約2K(或我的可用程序內存的7%!)。

最後,我放棄了*指針,因爲這是不正確的,並正確使用strcpy,正如deviantfan和yardpenalty所建議的,以遠離String庫。它的責任進一步在這裏發揮:https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/

相關問題