代码之家  ›  专栏  ›  技术社区  ›  Dr.PB

Arduino中的字符串到字符

  •  1
  • Dr.PB  · 技术社区  · 6 年前
    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);

    调用函数的正确方法是什么?要将字符串ssid更改为char ssid,以使其与ESP8266库兼容。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Sumsuddin Shojib    6 年前
    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.
    
        2
  •  1
  •   Remy Lebeau    6 年前

    您的代码有很多问题。

    您的函数声明为返回 单一的 char 不是一个 数组 属于 烧焦 它缺少一个实际的 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
  •  1
  •   kocica    6 年前

    您将从函数返回指向数组第一个字符的指针并将其分配给数组,这是不可能的。 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();