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(), из такой функции.