在Arduino上将int或String转换为char数组

87

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

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


8
你是否真的需要一个可修改的数组?如果不需要,你可以使用 const char * msg = myString.c_str();。与 toCharArray() 不同的是,c_str() 是一种零拷贝操作,而零拷贝在内存受限设备上很有优势。 - Edgar Bonet
@EdgarBonet 它可以工作,但一次只能处理一个字符串。最后的c_str()会覆盖旧的。 - mmv-ru
5个回答

139
  1. 要将整数转换并追加,使用 += 运算符(或成员函数concat):

 String stringOne = "A long integer: ";
 stringOne += 123456789;
要将字符串转换为 char[] 类型,请使用 toCharArray() 方法:
 char charBuf[50];
 stringOne.toCharArray(charBuf, 50)

在这个示例中,只有49个字符的空间(假设它以null结尾)。您可能希望使其大小动态。

开销

引入 String 的成本(如果在草图中未使用,则不会包含在内)大约是1212字节的程序存储器(flash)和48字节RAM。

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

风险

必须有足够的可用RAM。否则,结果可能是应用程序的锁定/冻结或其他奇怪行为 (UB)。


13
感谢您!这样做省去了我大量尝试的时间。为了使char[]大小动态化,可以采取以下方式:char charBuf[stringOne.length()+1] - loeschg
9
我这样动态地实现它: char ssid[ssidString.length()]; ssidString.toCharArray(ssid, ssidString.length()); - dumbledad
1
@loeschg 谢谢,我一开始尝试了没有 +1 的方法,但你的解决方案对我很有效! - Blundering Philosopher
https://developercommunity.visualstudio.com/idea/365434/edit-comments-on-tickets-discussion.html?childToView=397510#comment-397510 - Peter Mortensen
重要警告!我曾经吃过亏,如果你的目的是获取部分字符串,比如仅获取第一个字符以在switch/case语句中使用,你需要为整个字符串分配足够的空间,否则函数将返回并使你的缓冲区为空 - 你会摸不着头脑,最终来到这个论坛。 - Danny Holstein
虽然48字节的RAM非常接近缓冲区大小,但这需要调查。即将展开调查。 - Peter Mortensen

60

以下是一个示例,演示如何在动态长度下在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);
 

是的,对于像类型转换这样简单的东西来说,这似乎非常难懂,但不知何故这是最简单的方法。


24

如果您不需要可修改的字符串,则可以通过以下方式将其转换为char*:

(char*) yourString.c_str();

当您想通过 Arduino 在 MQTT 上发布一个字符串变量时,这将非常有用。


非常有用。我通过将参数传递到以下函数使其正常工作:NTPClient(UDP& udp, const char* poolServerName);我曾经苦于将字符串转换为char*。 - Daryll David Dagondon

1

所有那些东西都没用。这里有一个更简单的方法... 标签 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;
    }
}

1
str 不是指向数组的指针,而是实现了 [] 运算符的 String 对象。 - gre_gor

1

在这里提供的所有答案中,我很惊讶没有人提到已经内置的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);

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