Как вы?.
Я пытаюсь распечатать некоторые данные, которые я получил как string
, и для этого я использую следующую функцию (определение FechaProg после функции)
uint8_t Extrae_Data(string trama, FechaProg* destino ,char sep) {
uint8_t contador = 0;
string lectura;
stringstream cadena_leida(trama);
Serial.print("La trama es: ");
Serial.println(trama.c_str());
Serial.print("El stringstream es: ");
Serial.println(cadena_leida.str().c_str());
while(getline(cadena_leida, lectura, sep))
{
if (sep == '-')
{
switch(contador)
{
case 1:
{
destino->mes = lectura.c_str();
}
break;
case 2:
{
destino->dia = lectura.c_str();
}
break;
case 3:
{
destino->ano = lectura.c_str();
}
}
}
else if (sep == ':')
{
switch(contador)
{
case 1:
{
destino->hora = lectura.c_str();
}
break;
case 2:
{
destino->minuto = lectura.c_str();
}
break;
}
}
contador++;
Serial.println(contador);
if (contador == 3)
{
//Serial.print("Lectura: ");
Serial.print("La cadena es: ");
Serial.println(destino->mes);
Serial.println(destino->dia);
Serial.println(destino->ano);
}
if (contador == 2)
{
//Serial.print("Lectura: ");
Serial.print("La cadena es: ");
Serial.println(destino->hora);
Serial.println(destino->minuto);
}
}
return contador;
}
Тип Fechaprog, который я использую в качестве указателя, представляет собой структуру, которая выглядит следующим образом:
struct FechaProg {
const char* dia;
const char* mes;
const char* ano;
const char* hora;
const char* minuto;
const char* segundo;
};
Конечно, я создаю объект типа FechaProg следующим образом.
FechaProg tiempo = {"0"};
и функция вызывается следующим образом
Extrae_Data(jsonObj["fecha"], &tiempo, '-')
где jsonObj["fecha"]
— полученные данные.
Если trama
и cadena_leida.str().c_str()
печатаются перед сохранением информации в указателе, оба печатаются хорошо, но если я попытаюсь напечатать значения, хранящиеся в указателях, с помощью Serial.println(destino->minuto)
, тогда будет напечатана нечитаемая информация.
В настоящее время я не мог решить эту проблему.
ОБНОВЛЕНИЕ 04.01.2023: Моими входными аргументами для функции Extrae_Data являются строка, указатель на структуру и разделитель.
внутри функции у меня есть счетчик, который служит мне для хранения каждого токена в определенном члене структуры после того, как каждый токен основан; например, микро получает дату 2023:01:01
, где разделителем является «:», тогда я хочу, чтобы токены хранились следующим образом:
destino->ano = 2023;
destino->mes = 01;
destino->dia = 01;
это нужно сделать после того, как функция getline
извлечет токен из строки, это для выполнения другой операции вне функции, но, по-видимому, это присвоение полученного токена указателю члена структуры, что я делаю неправильно.
Повторяю, я не рассматриваю строку как структуру, но я хочу сохранить токен, извлеченный из строки, в членах структуры.
Итак, как я могу распечатать это?
Заранее спасибо за помощь.
Я знаю, что получаю строку, а не структуру, см. мое обновление к сообщению.
Это не полный ответ на вашу проблему, так как на ваш вопрос можно ответить лишь частично. Функция Extrae_Data()
не имеет особого смысла и нуждается в дополнительных пояснениях или добавлении контекста того, как она используется в вашем коде.
Это единственный ответ, как разобрать строку в структуру на основе вашего обновленного комментария от 04.01.2023.
Если у вас есть часть данных в виде строки 2023:01:01
, и вы хотите проанализировать ее и присвоить различным элементам структуры, вы можете использовать старую добрую функцию strtok() для достижения этой цели:
struct FechaProg {
const char* dia;
const char* mes;
const char* ano;
const char* hora;
const char* minuto;
const char* segundo;
};
// please noted this is not your original function signature
void Extrae_Data(char* trama, FechaProg* destino ,const char* sep) {
destino->ano = strtok(trama, sep);
destino->mes = strtok(NULL, sep);
destino->dia = strtok(NULL, sep);
}
void setup() {
Serial.begin(115200);
char str[] = "2023:01:01";
const char* separator = ":";
FechaProg myStruct{};
Extrae_Data(str, &myStruct, separator);
//since you are using esp32, printf is available
Serial.printf("%s %s %s\n", myStruct.ano, myStruct.mes, myStruct.dia);
}
Извините за задержку @hcheung, дайте мне попробовать, и я свяжусь с вами
1) Существует фундаментальное непонимание того, как должна быть инициализирована структура, вы не инициализируете ее строкой «0», вы должны инициализировать ее с помощью
FechaProg tiempo = {}
, она будет инициализировать каждый указатель в структуре наnullptr
(т.е. указывать в никуда ). 2) То, что вы получили отstringstream
, является строкой, а не структурой, и поэтому ваш код, пытающийся рассматривать ее как структуру, точно не будет работать. Как (и почему) структура упаковывается и отправляется в виде строки, нам непонятно? и поэтому не подлежит ответу.