Удаление нежелательных символов из типа char
Я работаю над модулем ESP8266 , который должен извлекать данные о дате из worldtimeapi, все работает нормально, но проблема в том, как я удаляю поле времени из ответа datetime JSON без цикла.
Примечание: Библиотека Arduino JSON использовалась для десериализации данных ответа, и, похоже, библиотека поддерживает только тип данных char.
void loop ()
{
// Инициализировать объект запроса
HTTPClient request;
// Make a http request
request.begin(dateTime);
delay(2000);
// Проверьте код состояния запроса.
int responseCode = request.GET(); //Get the api host response code.
Serial.print("Response code is: ");
Serial.println(responseCode);
if (responseCode == 200); // Если сервер вернул OK
{
String responseData = request.getString();
Serial.println("Response from the server is:");
Serial.println(responseData);
// Deserialize the JSON response data
StaticJsonDocument<715> result; // Declare data storage to stack
//Check for error during data deserialization
DeserializationError error = deserializeJson(result, responseData);
if (error)
{
Serial.print(F("Response deserialization failed with reason: "));
Serial.println(error.f_str());
return;
}
else
{
char abbreviation = result["abbreviation"]; //Возвращает текущую аббревиатуру часового пояса
char timezone = result["timezone"]; // Возвращает текущий часовой пояс
char datetime = result["datetime"]; // "2021-03-12T17:04:0
char date = datetime.remove(9,22); // Эта строка выдает ошибку : запрос на член 'remove' в 'datetime', который имеет неклассный тип 'char'
Serial.print("Current time is ");
Serial.print(datetime);
Serial.print(" ");
Serial.print(abbreviation);
Serial.print(" ");
Serial.println(timezone);
delay(2000);
}
}
}
@Ruby, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы можете использовать strtok
, чтобы разделить строку на символ T:
char *datepart = strtok(datetime, "T");
char *timepart = strtok(NULL, "T");
Serial.print("The current date is: ");
Serial.println(datepart);
Serial.print("The current time is: ");
Serial.println(timepart);
Альтернативой является просто найти T
и превратить его в нулевой завершающий символ:
char *T = strchr(datetime, 'T');
*T = 0;
Если вам нужно сначала скопировать строковые данные во временную строку, вы можете сделать:
char temp[strlen(datetime)+1];
strcpy(temp, datetime);
Затем действуйте на temp
вместо datetime
.
Мне нужно избавиться от **T17:04:0**., @Ruby
Тогда просто используйте datepart
., @Majenko
Как мне это сделать в C++, я думаю, что " datepart` - это синтаксис SQL., @Ruby
Я показал вам, как это делается., @Majenko
Последовал за ALT, но, похоже, в библиотеке Arduino Json есть какое-то определение " const. Новое сообщение об ошибке:
path/to/arduino/libraries/ArduinoJson/src/ArduinoJson/Variant/VariantAs.hpp:94:27: error: invalid conversion from 'ArduinoJson6172_91::enable_if<true, const char*>::type {aka const char*}' to 'char*' [-fpermissive]
return variantAs<T>(data);`, @Ruby
Возможно, вам придется сначала скопировать содержимое строки во временную рабочую строку., @Majenko
Кажется, это работает, но библиотека Arduino Json этого не допустит, и я буду использовать NTP Client lib для получения данных о дате. Спасибо Тебе, Маенко., @Ruby
То, что предложил @Majenko, работает просто отлично. Определите символьный массив соответствующего размера (с дополнительным нулевым терминатором) и просто добавьте к нему `strncpy ()'., @romkey
@Ruby, esp8266 имеет встроенный NTP, @Juraj
- Преобразование строки в IP-адрес
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Какова цель F() и FPSTR() в ESP8266WebServer -> FSBrowser?
- Проанализировать большой ответ json с помощью ESP8266
- Публиковать данные json в mqtt
почему " без петли`?, @jsotola