【问题标题】:String to char in ArduinoArduino中的字符串到字符
【发布时间】:2018-07-26 04:30:20
【问题描述】:
char string2char(String ipString){
  char opChar[ipString.length() + 1];
  memset(opChar, 0, ipString.length() + 1);

  for (int i = 0; i < ipString.length(); i++)
    opChar[i] = ipString.charAt(i);
}

称为char charssId[AP_NameString.length()+1] = string2char(AP_NameString);

调用函数的正确方法是什么?想要将 String ssid 更改为 char ssid,使其与 esp8266 库兼容。

【问题讨论】:

  • 你能描述一下这个函数应该做什么吗?看起来像是从 String 对象中逐一剥离字符并将它们放入字符数组中。但是,函数声明显示它返回一个字符,但没有返回语句。您的示例使用表明您希望它返回一个字符数组。您能否重新思考或更好地描述您的问题是什么?
  • 当你覆盖除最后一个字节之外的每个字节时,执行memset 似乎是相当多余的。但是,就您的函数现在而言,它什么也不做,因为它不返回函数的结果。
  • @joH1,不,是 c++

标签: c++ string arduino char


【解决方案1】:
char charssId[AP_NameString.length()+1] = string2char(AP_NameString);

这条线是行不通的。因为char charssId[AP_NameString.length()+1] 这意味着您要声明一个特定大小的数组,同时用方法返回的数组替换它。

你可以这样做,

char* string2char(String ipString){ // make it to return pointer not a single char
  char* opChar = new char[ipString.length() + 1]; // local array should not be returned as it will be destroyed outside of the scope of this function. So create it with new operator.
  memset(opChar, 0, ipString.length() + 1);

  for (int i = 0; i < ipString.length(); i++)
    opChar[i] = ipString.charAt(i);
  return opChar; //Add this return statement.
}

// Now call this as below,
char* charssId = string2char(AP_NameString); // make the variable as pointer so that it can hold an array address.
// use it as a char array.
delete[] charssId; // Remember to delete it after finished using it.

【讨论】:

  • 用完别忘了给delete[] charssId打电话
  • 谢谢!我应该提到它。
【解决方案2】:

您的代码有很多问题。

您的函数被声明为返回单个 char,而不是chars 的数组。它缺少一个实际的return 语句。但即使不是这样,当函数退出时,您将返回一个超出范围的本地数组,从而使调用者带有指向无效数据的悬空指针。

您正在以一种称为“可变长度数组”的非标准方式声明 opChar 数组。 VLA 是特定于编译器的扩展,因此不可移植。您需要使用 new[] 来动态分配数组。

试试这个:

char* string2char(const String &ipString){
    char *opChar = new char[ipString.length() + 1];
    /*
    for (int i = 0; i < ipString.length(); i++)
        opChar[i] = ipString.charAt(i);
    */
    ipString.toCharArray(opChar, ipString.length());
    opChar[ipString.length()] = '\0';
    return opChar;
}

char *charssId = string2char(AP_NameString);
// use charssId as needed...
delete[] charssId;

更安全的选择是改用std::string

std::string string2char(const String &ipString){
    std::string opChar;
    opChar.resize(ipString.length());
    /*
    for (int i = 0; i < ipString.length(); i++)
        opChar[i] = ipString.charAt(i);
    */
    ipString.toCharArray(opChar, ipString.length());
    return opChar;

    // alternatively:
    // return std::string(ipString.c_str(), ipString.length());
}

std::string charssId = string2char(AP_NameString);
// use charssId.c_str() as needed...

但实际上根本不需要转换:

const char *charssId = AP_NameString.c_str();
// use charssId as needed...

【讨论】:

    【解决方案3】:

    您正在从函数返回指向数组第一个字符的指针并将其分配给数组,这是不可能的。 Learn more here.

    要使其工作,您必须将从函数返回的指针分配给指针变量——如下所示:

    char* charssId = string2char(AP_NameString);
    // Do stuff
    delete [] charssId;
    

    然后像普通数组一样访问它:

    charssId[index]
    

    上面的答案已经解释过了,所以有几种方法可以更容易地处理这个任务。

    首先是字符串类的toCharArray()方法

    char opChar[ipString.length() + 1];
    ipString.toCharArray(opChar, ipString.length());
    // Do stuff
    delete [] opChar;
    

    第二个是c_str()类字符串的方法(返回的字符串是const

    const char *unmodificable = ipString.c_str();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2013-01-04
      • 1970-01-01
      相关资源
      最近更新 更多