Удаление нежелательных символов из типа 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);
      }
      
  }


}

, 👍0

Обсуждение

почему " без петли`?, @jsotola


1 ответ


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

2

Вы можете использовать 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