【问题标题】:Converting an int or String to a char array on Arduino在 Arduino 上将 int 或 String 转换为 char 数组
【发布时间】:2011-11-15 01:33:18
【问题描述】:

我从我的 Arduino 上的一个模拟引脚获得一个 int 值。如何将其连接到 String,然后将 String 转换为 char[]

有人建议我尝试char msg[] = myString.getChars();,但我收到一条消息说getChars 不存在。

【问题讨论】:

  • 你真的需要一个可修改的数组吗?如果没有,您可以使用const char * msg = myString.c_str();。与toCharArray()不同,c_str()是零拷贝操作,零拷贝在内存受限的设备上是件好事。
  • @EdgarBonet 它有效,但一次只能用于一个字符串。最后 c_str() 覆盖旧的。

标签: string char arduino


【解决方案1】:
  1. 要转换和追加整数,请使用operator +=(或成员函数concat):

     String stringOne = "A long integer: ";
     stringOne += 123456789;
    
  2. 要获取char[] 类型的字符串,请使用toCharArray()

     char charBuf[50];
     stringOne.toCharArray(charBuf, 50)
    

在示例中,只有 49 个字符的空格(假设它以 null 结尾)。您可能希望使尺寸动态化。

###开销

引入String(如果未在草图中的任何地方使用,则不包括在内)的成本约为 1212 字节的程序存储器(闪存)和 48 字节的 RAM。

这是使用 Arduino IDE 版本 1.8.10 (2019-09-13) 为 Arduino Leonardo 草图测量的。

【讨论】:

  • 为我节省了大量修补时间。谢谢!为了使 char[] 大小动态,请执行 char charBuf[stringOne.length()+1] 之类的操作
  • 我是这样动态完成的:char ssid[ssidString.length()];ssidString.toCharArray(ssid, ssidString.length());
  • @loeschg 谢谢,我一开始尝试不使用+1,但您的解决方案对我有用!
  • 非常好的答案!加一!
【解决方案2】:

作为参考,下面是一个如何在 Stringchar[] 之间进行动态转换的示例 -

// Define 
String str = "This is my string"; 

// Length (with one extra character for the null terminator)
int str_len = str.length() + 1; 

// Prepare the character array (the buffer) 
char char_array[str_len];

// Copy it over 
str.toCharArray(char_array, str_len);
 

是的,这对于像类型转换这样简单的事情来说是非常迟钝的,但不知何故这是最简单的方法。

【讨论】:

    【解决方案3】:

    如果您不需要可修改的字符串,可以使用以下方法将其转换为 char*:

    (char*) yourString.c_str();
    

    当您想在 arduino 中通过 MQTT 发布字符串变量时,这将非常有用。

    【讨论】:

    • 非常有用。我让我的工作将参数传递给: NTPClient(UDP& udp, const char* poolServerName);正在努力将 String 转换为 char*。
    【解决方案4】:

    这些东西都不起作用。这是一个更简单的方法..标签 str 是指向什么是数组的指针...

    String str = String(yourNumber, DEC); // Obviously .. get your int or byte into the string
    
    str = str + '\r' + '\n'; // Add the required carriage return, optional line feed
    
    byte str_len = str.length();
    
    // Get the length of the whole lot .. C will kindly
    // place a null at the end of the string which makes
    // it by default an array[].
    // The [0] element is the highest digit... so we
    // have a separate place counter for the array...
    
    byte arrayPointer = 0;
    
    while (str_len)
    {
        // I was outputting the digits to the TX buffer
    
        if ((UCSR0A & (1<<UDRE0))) // Is the TX buffer empty?
        {
            UDR0 = str[arrayPointer];
            --str_len;
            ++arrayPointer;
        }
    }
    

    【讨论】:

    • str 不是指向数组的指针,它是实现[] 运算符的String 对象。
    【解决方案5】:

    有了这里所有的答案,我很惊讶没有人提出使用已经内置的 itoa。

    它将整数的字符串表示形式插入给定的指针中。

    int a = 4625;
    char cStr[5];       // number of digits + 1 for null terminator
    itoa(a, cStr, 10);  // int value, pointer to string, base number
    

    或者如果你不确定字符串的长度:

    int b = 80085;
    int len = String(b).length();
    char cStr[len + 1];  // String.length() does not include the null terminator
    itoa(b, cStr, 10);   // or you could use String(b).toCharArray(cStr, len);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2014-11-05
      • 1970-01-01
      • 2011-01-26
      • 2011-06-08
      相关资源
      最近更新 更多