Closed Thread
Results 1 to 8 of 8

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

  1. #1

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

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

    Code: C/C++
    #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;

    }
    Last edited by REU; 29-09-2015 at 10:32. Reason: Используй теги для форматирования кода

  2. #2
    Neomant's Avatar

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

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

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

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

    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);
    Last edited by Neomant; 29-09-2015 at 13:03.

  3. #3

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

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

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


    Code:
    #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;
    }
    Last edited by 0x1de; 29-09-2015 at 19:48.

  4. #4
    Neomant's Avatar

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

    Лучше всего не изобретать велосипед. Для передачи по сети структурированных данных хорошо подходят json, xml.
    Сам не использовал, но всё это есть в Boost. Да и под Android на Яве тоже есть уже готовый инструментарий.
    Last edited by Neomant; 29-09-2015 at 21:12.

  5. #5

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

    Да согласен насчет велосипедов, однако есть несколько ограничений. Язык С, нужен малый вес, проверил парочку библиотек, очень тяжелые, Ява в качестве транспорта не рассматривается. Поэтому приходится колесо изобретать. Хотел спросить одну вещь,
    есть pointer array
    Code:
    char* a[1024];
    a[0]  = "One"; 
    a[1]  = "Two"; 
    a[2]  = "N";
    При отправке по сокетам приходит строка и при попытке доступа к a[0] ругается нехорошими словами. Полагаю, что проблема именно в указателе. Как его сериализовать в строку потом, чтобы обратно на стороне клиента можно было получить a[0] = "One"?

  6. #6
    ARCHANGEL's Avatar

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

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

    libxml2, libjson ?
    Добрым быть просто - достаточно обратить свой гнев на негодяев...

  7. #7

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

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

  8. #8

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

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

Closed Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:24
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org