如何在Arduino中将字符串转换为char *?

3

我正在为Arduino做一个将整数转换为十六进制字符*的函数,但是我遇到了将String转换为char *无法实现的问题。也许有一种动态分配char *内存的方法,我就不需要使用String类了。

char *ToCharHEX(int x)
{
    String s;
    int y = 0;
    int z = 1;
    do
    {

        if (x > 16)
        {
            y = (x - (x % 16)) / 16;
            z = (x - (x % 16));
            x = x - (x - (x % 16));
        }
        else
        {
            y = x;
        }
        switch (y)
        {
        case 0:
            s += "0";
            continue;
        case 1:
            s += "1";
            continue;
        case 2:
            s += "2";
            continue;
        case 3:
            s += "3";
            continue;
        case 4:
            s += "4";
            continue;
        case 5:
            s += "5";
            continue;
        case 6:
            s += "6";
            continue;
        case 7:
            s += "7";
            continue;
        case 8:
            s += "8";
            continue;
        case 9:
            s += "9";
            continue;
        case 10:
            s += "A";
            continue;
        case 11:
            s += "B";
            continue;
        case 12:
            s += "C";
            continue;
        case 13:
            s += "D";
            continue;
        case 14:
            s += "E";
            continue;
        case 15:
            s += "F";
            continue;
        }
    }while (x > 16 || y * 16 == z);
    char *c;
    s.toCharArray(c, s.length());
    Serial.print(c);
    return c;
}

toCharArray() 函数并未将字符串转换为字符数组。Serial.print(c) 返回空白打印。我不知道该怎么办。


我的_string.c_str()在Arduino IDE中无法工作。 - Matheus Toniolli
1
提示:第一次执行“int y;int z;while(x> 16 || y * 16 == z)”时,“y,z”的值是多少? - chux - Reinstate Monica
my_string.data() 或 &my_string[0] 可以获取指向内部字符数组的指针。 - Joshua Waring
你确认过这个方法可以使用普通的硬编码字符串对象吗?(即,去掉while逻辑,尝试转换一个硬编码字符串) - Phillip Elm
字符串返回十六进制值完美运行,问题在于从字符串转换为char *。 - Matheus Toniolli
显示剩余4条评论
2个回答

6

更新:关于您的问题:String -> char* 转换:

String.toCharArray(char* buffer, int length) 方法需要一个字符数组缓冲区和缓冲区的大小。

具体来说,您面临的问题是:

  1. char * c 是一个未初始化的指针。
  2. length 应该是缓冲区的大小。而字符串本身知道它的长度。

因此,更好的方法是:

char c[20];
s.toCharArray(c, sizeof(c));

或者,您可以使用malloc来初始化c,但这样您将需要稍后free它。像这样使用堆栈可以节省时间并保持简单。

参考:https://www.arduino.cc/en/Reference/StringToCharArray


您的代码意图:

这基本上是一个重复的问题:https://dev59.com/S2025IYBdhLWcg3w9quQ#5703349

请参见Nathan链接的答案:

// using an int and a base (hexadecimal):
stringOne =  String(45, HEX);   
// prints "2d", which is the hexadecimal version of decimal 45:
Serial.println(stringOne);  

除非这段代码是用于学术目的,否则您应该使用标准库提供的机制,而不是重新发明轮子。

  • String(int, HEX) 返回您要转换的整数的十六进制值
  • Serial.print 接受 String 作为参数

1
我的天啊!我知道如何将int转换为十六进制,问题不在于此。我想要将一个字符串转换为char *。 - Matheus Toniolli

1
char* string2char(String command){
    if(command.length()!=0){
        char *p = const_cast<char*>(command.c_str());
        return p;
    }
}

请在您的回答中添加更多信息。提供一些解释。 - Muhammedogz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接