bijaynayak Ответов: 2

Вложенная структура в массив char


Привет, я пытаюсь преобразовать вложенную структуру в массив символов с помощью функции sprintf в программировании на языке Си.
struct date_of_birth{
	int dd,mm,yy;
};

struct student{
	char name[30];
	int rollNumber;
	date_of_birth dob;
};
int main()
{
// to make a single char aray using sprintf()
char arr[100];
  
}


Что я уже пробовал:

не могли бы вы сообщить мне, какой цикл будет продолжен первым либо студентом, либо dob, чтобы сформировать массив char?

[no name]

Хотите ли вы иметь возможность обратить процесс вспять - превратить массив char обратно в struct?

2 Ответов

Рейтинг:
1

CPallini

Если вам нужно сериализовать[^] этот struct затем функции memcpy[^] это путь, чтобы пойти

student s;
char a[100];
memcpy(a, &s, sizeof(s));


[обновление]Исправлена ошибка, благодаря K5054[/обновление].


k5054

Так и должно быть memcpy(a, &s, sizeof s)

Обратите внимание, что sizeof нуждается в скобках только в том случае, если его операнд является типом, а не переменной.

Следует также отметить, что в этом случае содержимое a[] не читается человеком.

CPallini

Спасибо, что указал на ошибку.
Я знаю про размер. Это может быть просто вопрос стиля, во всяком случае, я предпочитаю использовать ненужные скобки.
Сериализованные данные могут быть (и на самом деле часто являются) не читаемыми человеком.

bijaynayak

привет, спасибо за предложение, но в соответствии с моим требованием ,
1:мне нужно передать данные стойки на несколько серверов (или мы можем сказать, что узлы diff
) & этот сервер понимает только char.
2: memcpy не внушаем, потому что он работает с адресом, с приемного конца, как получить те же структурные данные

CPallini

"memcpy не внушаем, потому что он работает с адресом, с приемного конца, как получить те же структурные данные"
Это и есть сама цель сериализации/десериализации. Вы проверили страницу Википедии, на которую я ссылался?

[no name]

Может быть:

student s;
char a[sizeof s];
memcpy(a, &s, sizeof s)

Рейтинг:
0

Rick York

В одну сторону :

void GetStudentDataString( student * ps )
{
   const int bufferSize = 127;
   char buffer[bufferSize+1] = {0};

   snprintf( buffer, bufferSize, "%s, %d, %02d:%02d:%02d",
             ps->name, ps->rollNumber, ps->yy, ps->mm, ps->dd );
}


k5054

Пара заметок

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

вы забыли указать члена dob при печати даты рождения. Таким образом, мы получаем следующее:

snprintf(buffer, sizeof buffer, "%s, %d, %02d:%02d:%02d",       ps->name, ps->rollNumber, ps->dob.yy, ps->dob.mm, ps->dob.dd); 

[no name]

ОП не уточнил, хотят ли они десериализоваться, и в этом случае это не сработает.

bijaynayak

привет pwasser, да нужно десериализовать char [], чтобы снова структурировать.

[no name]

Хорошо, тогда почему бы не использовать use memcpy () для копирования структуры в массив и memcpy () для копирования из массива обратно в структуру?

Rick York

ОП попросил команду, чтобы быть использованы.

[no name]

Хорошо, но как вы десериализуетесь обратно в структуру?

bijaynayak

Привет pwasser,
я сохраню все члены структуры в значении: separated после этого я буду
разделите это с помощью strtok (), который разделит вышеупомянутый буфер.

пример кода ниже:
студент структура studt2;

snprintf(buffer,bufferSize,"%s:%d:%d:%d:%d",studt.name,studt.rollNumber,studt.dob.dd,studt.dob.mm,studt.dob.yy);
ptr = strtok (буфер,":");

while (ptr != NULL)
{
// studt2.name= strtok(буфер);
strcpy(studt2.name,strtok(буфер));
studt2.rollNumber=Атой(ПТР);
ptr=strtok(NULL,":");
}
но как снова сохранить значения соответствующих членов ?
проблема в основном заключается в том, что studt2.name...

[no name]

Зачем идти этим путем? Это не очень хорошее решение. memcpy() решает все это аккуратно.

Rick York

Я писал циклы синтаксического анализа strtok так много раз, что сбился со счета. Вот типичный пример одного из них :

const size_t MaxTokens = 64; / / максимальное ожидаемое количество токенов
char * токены[MaxTokens] = {0};
const char * delimiters = " \t,;:.";
char * tokenString = buffer; / / текстовая строка для синтаксического анализа токенов
size_t count = 0;
в то время как( что strtok( tokenString, &усилителя;маркеры[счетчик] ) и усилитель; & ( графа &ЛТ; maxTokens ) )
{
tokenString = nullptr;
++считать;
}

// изучите токены здесь