我有一个char数组ecx
,我在可重复使用的menu()函数中动态填充了屏幕菜单的选项。我可以用手工打字的字符串单独更改项目,例如char *menu_strings[8];
等但是如何从另一个函数返回一个char *并将其插入到一个数组的“字符串”中?如果我尝试使用这样的函数循环遍历数组:
menu_strings[0] = "New";
...所有8个menu_strings都填充了返回的第八个/最后一个选项(i = 7),而不是每个单独条目的字符串......
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 }
输出:
for (i=0; i<8; i++)
Serial.println(menu_strings[i]);
我正在使用arduino IDE,但我非常自信地认为我会在任何C / ++ /#中使用指针。此外,返回的char *永远不会超过31个字符加上空指针。
答案 0 :(得分:1)
非常感谢PaulMcKenzie,那个引导我回答问题的邋pen和deviantfan:
退出
char *
业务,只需使用std::string
即可。你也是 鉴于您发布的内容,可能会返回本地数组的地址。 如果你这样做,返回局部变量的地址是 未定义的行为。
这导致我使用Arduino String对象而不是char*
https://www.arduino.cc/en/Reference/StringObject
并使用toCharArray()
进行任何坚持char指针的库调用。这有效,但增加了大约2k(或我可用程序内存的7%!)。
最后,我抛弃了*指针,因为这是不正确的,并按照deviantfan和yardpenalty的建议正确使用strcpy
以远离String
库。它的责任在这里得到进一步发挥:https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/