R0 CREW

Символьный массив показывает только первую строку

Добрый день, посоветуйте пожалуйста как получить все строку printf("%s \n", reply); Проблема в том, что печатает только первое слово. А остальные сериализованные данные не показывает.

#include <string.h>

typedef struct __attribute__((__packed__)) arch_sm
{
    char* response;
    char* command;
    char* data;
} request_struct_sm;
size_t serialize(const request_struct_sm* arch_sm, char* buf)
{
    size_t bytes = 0;
    memcpy(buf + bytes, arch_sm->response, strlen(arch_sm->response) + 1);
    bytes += strlen(arch_sm->response) + 1;

    memcpy(buf + bytes, arch_sm->command, strlen(arch_sm->command) + 1);
    bytes += strlen(arch_sm->command) + 1;


    memcpy(buf + bytes, arch_sm->data, strlen(arch_sm->data) + 1);
    bytes += strlen(arch_sm->data) + 1;

    return bytes;
}

void deserialize_server(const char* buf, request_struct_sm* arch_sm)
{
    size_t offset = 0;

    arch_sm->response = strdup(buf + offset);
    offset += strlen(buf + offset) + 1;

    arch_sm->command = strdup(buf + offset);
    offset += strlen(buf + offset) + 1;

    arch_sm->data = strdup(buf + offset);
}


int main(){
    request_struct_sm server_message;
    request_struct_sm client_message;
    server_message.response =  strdup("RESPONSE");
    server_message.command = strdup("COMMAND");
    server_message.data = strdup("DATA");
    char reply[1024] = {0};
    char temp[1024];
    size_t bufLen = serialize(&server_message, reply);
    printf("%d \n", bufLen);
    printf("%s \n", reply); // ЗДЕСЬ

    deserialize_server(reply, &client_message);
    printf("client_message.response = %s\n"
            "client_message.command = %s\n"
            "client_message.data = %s\n",
            client_message.response, client_message.command, client_message.data);
    return 0;

}

Сишные строки заканчиваются нулём. Эти нули присутствуют и в сериализованном буфере, поэтому при выводе с начала буфера и печатается только первая строка.
Лучшим вариантом будет вывод их из структуры, т.е.

printf("server_message.response = %s\nserver_message.command = %s\nserver_message.data = %s\n",
       server_message.response, server_message.command, server_message.data);

Если из буфера, можно и так:

char *p = reply;    printf("server_message.response = %s\n", p);
p += strlen(p) + 1; printf("server_message.command = %s\n", p);
p += strlen(p) + 1; printf("server_message.data = %s\n", p);

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

Собственно вопрос, стоит ли использовать такое решение?
Если да то как можно reply целиком добавить в один из RRR учитывая проблему с нулями, и будет ли он потом десериализоваться обратно в струтуру. char a[]=“0=RRR&1=RRR&2=RRR&3=RRR”;
Если нет то может есть вариант сделать reply содержащий уже массив структур вида:
server_message[n].response = strdup(“RESPONSE”);
Или лучше динамически создаваемый массив из reply, потом отправлять клиенту и в цикле обходить и каждый элемент скармливать deserialize_server?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char* getTagValue(char* a_tag_list, char* a_tag)
{
    /* 'strtok' modifies the string. */
    char* tag_list_copy = malloc(strlen(a_tag_list) + 1);
    char* result        = 0;
    char* s;

    strcpy(tag_list_copy, a_tag_list);

    s = strtok(tag_list_copy, "&");
    while (s)
    {
        char* equals_sign = strchr(s, '=');
        if (equals_sign)
        {
            *equals_sign = 0;
            if (0 == strcmp(s, a_tag))
            {
                equals_sign++;
                result = malloc(strlen(equals_sign) + 1);
                strcpy(result, equals_sign);
            }
        }
        s = strtok(0, "&");
    }
    free(tag_list_copy);

    return result;
}
int main()
{
    char a[]="0=RRR&1=AAA&2=111&3=SSS"; // RRR один из сериализованных структур
   // В цикле обойти, полученное скормить deserialize_server()
    char* buf    = getTagValue(a, "0");
 

    return 0;
}

Лучше всего не изобретать велосипед. Для передачи по сети структурированных данных хорошо подходят json, xml.
Сам не использовал, но всё это есть в Boost. Да и под Android на Яве тоже есть уже готовый инструментарий.

Да согласен насчет велосипедов, однако есть несколько ограничений. Язык С, нужен малый вес, проверил парочку библиотек, очень тяжелые, Ява в качестве транспорта не рассматривается. Поэтому приходится колесо изобретать. Хотел спросить одну вещь,
есть pointer array

char* a[1024];
a[0]  = "One"; 
a[1]  = "Two"; 
a[2]  = "N";

При отправке по сокетам приходит строка и при попытке доступа к a[0] ругается нехорошими словами. Полагаю, что проблема именно в указателе. Как его сериализовать в строку потом, чтобы обратно на стороне клиента можно было получить a[0] = “One”?

Язык С, нужен малый вес, проверил парочку библиотек, очень тяжелые

libxml2, libjson ?

Решил последовать совету Neomant, нашел одно решение , вроде решает проблему.

Всем спасибо! Очень помогли!