Преобразование int или String в массив char на Arduino

Я получаю значение int от одного из аналоговых выводов на моей Arduino. Как связать это с String, а затем преобразовать String в char[]?

Было предложено попробовать char msg[] = myString.getChars();, но я получаю сообщение о том, что getChars не существует.


person Chris    schedule 12.09.2011    source источник
comment
Вам действительно нужен модифицируемый массив? Если нет, вы можете использовать const char * msg = myString.c_str();. В отличие от toCharArray(), c_str() - это операция с нулевым копированием, а нулевая копия - это хорошо для устройств с ограниченным объемом памяти.   -  person Edgar Bonet    schedule 14.02.2015
comment
@EdgarBonet Это работает, но только для одной строки за раз. Последний c_str () перезаписывает более старый.   -  person mmv-ru    schedule 10.05.2019


Ответы (5)


  1. Чтобы преобразовать и добавить целое число, используйте operator + = (или функция-член concat):

     String stringOne = "A long integer: ";
     stringOne += 123456789;
    
  2. Чтобы получить строку типа char[], используйте toCharArray ():

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

В этом примере есть место только для 49 символов (предполагается, что он заканчивается нулем). Вы можете сделать размер динамическим.

### Накладные расходы

Стоимость доставки String (это не включается, если не используется где-либо в скетче), составляет примерно 1212 байт программной памяти (флеш-памяти) и 48 байт RAM.

Это было измерено с использованием Arduino IDE версии 1.8.10 (13.09.2019) для Arduino Леонардо эскиз.

person Peter Mortensen    schedule 12.09.2011
comment
Сэкономил мне много времени на возню. Спасибо! Чтобы сделать размер char [] динамическим, сделайте что-нибудь вроде char charBuf[stringOne.length()+1] - person loeschg; 23.03.2012
comment
Я делал это динамически так: char ssid[ssidString.length()]; ssidString.toCharArray(ssid, ssidString.length()); - person dumbledad; 14.12.2012
comment
@loeschg Спасибо, я сначала пробовал без +1, но ваше решение у меня сработало! - person Blundering Philosopher; 18.04.2014
comment
developercommunity.visualstudio. ru / idea / 365434 / - person Peter Mortensen; 04.12.2018
comment
Очень хороший ответ! Плюс один! - person Damián Rafael Lattenero; 19.07.2019
comment
БОЛЬШОЕ ПРЕДУПРЕЖДЕНИЕ! Я на собственном горьком опыте усвоил, что если вы намереваетесь получить частичную строку, скажем, первый символ только для использования в операторе switch / case, вам нужно выделить достаточно для всей строки, иначе функция вернется и оставит ваш буфер пуст - а вы почесываете затылок и попадаете на этот форум. - person Danny Holstein; 13.02.2020

В качестве справки, вот пример того, как преобразовать между String и char[] с динамической длиной -

// 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);

Да, это мучительно глупо для такой простой задачи, как преобразование типов, но, к сожалению, это самый простой способ.

person Community    schedule 27.05.2014

Вы можете преобразовать его в char *, если вам не нужна изменяемая строка, используя:

(char*) yourString.c_str();

Это было бы очень полезно, если вы хотите опубликовать строковую переменную через MQTT в arduino.

person Linh Le Vu    schedule 25.05.2019
comment
Спас мой день, спасибо! - person SachaDee; 23.04.2021

Ничего из этого не сработало. Вот гораздо более простой способ ... метка 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;
    }
}
person user6776703    schedule 31.08.2016
comment
str не указатель на массив, это объект String, реализующий оператор []. - person gre_gor; 12.02.2018

Учитывая все ответы здесь, я удивлен, что никто не упомянул об использовании уже встроенного 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);
person Pyro    schedule 05.07.2021