【发布时间】:2016-12-17 08:11:08
【问题描述】:
我有一个 char 数组 char *menu_strings[8];,我在可重用的 menu() 函数中动态填充了屏幕菜单的选项。我可以使用手动输入的字符串单独更改项目,例如menu_strings[0] = "New"; 等,但是如何获取从另一个函数返回的 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 个字符加上一个空指针。
【问题讨论】:
-
你用
char*为什么不用字符串arduino.cc/en/Reference/String -
I can change the items individually with hand-typed strings, e.g. menu_strings[0] = "New";这并不像您认为的那样,这就是问题所在。要么使用 strcpy(但首先你需要 malloc、free 等)或 std::string。 -
但是我如何获取从另一个函数返回的字符* -- 退出
char *业务并简单地使用std::string。鉴于您发布的内容,您也可能返回本地数组的地址。如果这样做,返回局部变量的地址是未定义的行为。 -
为什么不对数组的多维部分使用索引来访问值?
-
啊,我使用 strcpy() 错误,这让我很惊讶。这是一个比在 arduino 中使用 String 对象更好的解决方案,因为它为您的程序增加了大约 2k,这大约是具有标准引导加载程序的 Pro Micro 上可用固件空间的 7%!使用 * 完全不正确,因为您不应该修改这些字符串。所以感谢 Paul 和 @yardpenalty 让我朝着正确的方向前进。