【问题标题】:How do I put a number of char* arrays into a two dimensional array?如何将多个 char* 数组放入二维数组?
【发布时间】: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 让我朝着正确的方向前进。

标签: c++ arrays string arduino


【解决方案1】:

非常感谢 PaulMcKenzie、yardpenalty 和 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多