Преобразование строки C в строку C++

Моя программа работает на ESP32. Я получаю некоторые данные из Bluetooth, и строка Bluetooth представляет собой строку C. Мне нужно сохранить эти данные в строке RTC_DATA_ATTR, которая является строкой C++.

Простое выполнение c++string = cstring.c_str(); не сработает, так как оно просто сохранит указатель на место в памяти строки C, и цель чтобы сохранить данные в памяти RTC, чтобы ESP32 мог перейти в режим глубокого сна без потери данных.

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

Как мне скопировать данные из строки C в строку C++?

Любая помощь будет оценена по достоинству. Немного дополнительной информации: вот как это настроено на данный момент:

RTC_DATA_ATTR String ssid;

BLECharacteristic *cSsid = NULL;

ssid = cSsid->getValue().c_str();

, 👍1

Обсуждение

ты перепутал. вы хотите строку C из String? .c_str() из String возвращает постоянный указатель на внутреннюю строку C (массив символов с нулевым завершением) String, которая находится в куче. но чтобы сохранить его в память RTC, что-то должно скопировать его в память RTC. нет необходимости копировать его в «С-строку» в памяти., @Juraj

да, мой вопрос: как мне скопировать строку c в мою память rtc, @Marius Wanscher

Я согласен с @Juraj. Я полагаю, что вы неправильно использовали термины cstring и c++ strings. Насколько я понимаю ваш вопрос, у вас есть класс RTC_DATA_ATTR, который выделяет память для своего содержимого (строкового типа) из RTC EEPROM. Теперь вы спрашиваете, как вы можете инициализировать этот класс содержимым из «cstring». (поскольку вы используете .c_str(), я полагаю, что это также строка C++) Поскольку я не знаю, из какой библиотеки RTC_DATA_ATTR, я не могу сказать, как копировать текст в строку этого типа. Вы должны хотя бы добавить название библиотеки к вопросу или дать нам некоторую информацию о том, на что похож этот тип., @Peter Paul Kiefer

Ваш код приведет к исключению нулевого указателя, которое будет молча пропущено., @Peter Paul Kiefer

я понятия не имею, из какой библиотеки состоит RTC, я не #include никакую библиотеку, в которой он находится, @Marius Wanscher

он не дает никаких ошибок, когда я его компилирую, но в последовательном мониторе он println (rtcstring) просто печатает четкую строку, как если бы строка rtc была = null, @Marius Wanscher

я бы предположил, что команды RTC и Deep_sleep исходят от установленной платы в ArduinoIDE, @Marius Wanscher

но все, что я ищу, - это способ скопировать значение строки из bluetooth в строку RTC, что в моей голове должно быть решением: =, @Marius Wanscher

RTC_DATA_ATTR char ssid[33]; strcpy(ssid, cSsid->getValue().c_str());, @Juraj

Нулевой указатель — это ошибка времени выполнения, которую вы не можете увидеть во время компиляции. В контексте Arduino вы не распознаете исключение нулевого указателя. Но я уверен, что вы получили его, когда инициализировали BLECharacteristic *cSsid = NULL;, а затем использовали нулевое значение между cSsid->getValue(). Или я что-то пропустил, а NULL — это объект option? Может ли C++ обрабатывать объекты опций в то же время? Но в любом случае, не зная библиотеки, я не смогу вам помочь. Если вы просто хотите сделать свою строку постоянной, вы, вероятно, могли бы записать ее во флэш-память. https://randomnerdtutorials.com/esp32-flash-память/, @Peter Paul Kiefer

решение найдено с помощью strcpy, спасибо, @Marius Wanscher

Извините, теперь я понимаю, что вы пытались. Да, это часть программного обеспечения ESP32. И вы, возможно, не захотите хранить дату в EEPROM, просто сделайте ее постоянной во время глубокого сна. (Думаю, мне пора идти спать ;-)) https://randomnerdtutorials.com/esp32-timer-wake-up-deep-sleep/ @Juraj дал вам решение. Но проблема с нулевым указателем все еще существует. Или это не весь код?, @Peter Paul Kiefer


1 ответ


Лучший ответ:

0

просто, используя strcpy и используя char заданной длины, работает

RTC_DATA_ATTR char ssid["выделенная длина"];

strcpy(ssid, cSsid->getValue().c_str(), "выделенная длина");

,