c_str()

c_str() возвращает const char* на внутренний буфер объекта String — удобно для передачи в функции вроде strcmp() или strcpy(), но указатель нельзя хранить после изменения строки.

Полная статья

Описание

Функция c_str() даёт доступ к содержимому объекта String в виде обычной C-строки — массива символов, завершённого нулевым байтом ('\0'). Это нужно, когда вы работаете с библиотеками или функциями, которые принимают const char*, а не объект String.

Важно понимать: c_str() не создаёт копию строки. Возвращаемый указатель ссылается прямо на внутренний буфер объекта String. Это означает две вещи:

  • Не изменяйте строку через этот указатель. Внутренняя память объекта String управляется автоматически, и прямая запись туда сломает структуру данных.
  • Не сохраняйте указатель надолго. Как только объект String изменяется (например, вы добавляете символы через +=) или уничтожается (выходит из области видимости), указатель становится недействительным. Обращение к нему после этого — неопределённое поведение.

Если вам нужна долгоживущая копия C-строки, скопируйте содержимое в отдельный буфер с помощью strcpy() сразу после вызова c_str().

Синтаксис

myString.c_str()

Параметры

myString: переменная типа String.

Возвращает

Указатель типа const char* на внутренний буфер объекта String. Строка завершена нулевым байтом, как того требует стандарт C.

Где применяется

  • Передача строки в функции стандартной библиотеки C, например strlen(), strcmp(), strcpy().
  • Работа со сторонними библиотеками, чьи функции принимают const char*.
  • Отладочный вывод через Serial.print() с явным приведением типа, если библиотека требует именно C-строку.
  • Запись строки в EEPROM или передача по протоколу, где нужен сырой массив байт.

Практические замечания

  • Указатель действителен только до следующего изменения объекта String. Если вы вызвали c_str(), а потом сделали myString += "!" — старый указатель уже нельзя использовать.
  • Не присваивайте результат c_str() в char* (без const). Правильный тип — const char*.
  • Если функция требует изменяемый char*, создайте локальный буфер: char buf[64]; strcpy(buf, myString.c_str());.
  • Пустой объект String тоже возвращает корректный указатель — на строку из одного нулевого байта, это не nullptr.
  • При работе с динамически создаваемыми строками внутри функций помните, что локальный объект String уничтожается при выходе из функции — не возвращайте указатель, полученный от c_str(), из такой функции.