Как исправить заполнение структуры этими данными в c - PullRequest
0 голосов
/ 28 января 2019

У меня есть входной параметр структуры и массив с именем input_arr.Я хочу заполнить массив текстом, так как он дает неправильное значение для идентификатора, и он правильно работает с именем, и ничего не появляется в visible.

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

struct input_parameter {
    int id;
    char name[30];
    int position;
    char visible[5];
    char required[5];
    char parameter_type;
    char client_id[5];
    int min_length;
    int max_length;
    char confirm_required[5];
};

struct input_parameter input_arr[10];

char text[2*1024]="{\"success\": true,\"language\": 
     \"en\",\"action\": 
        \"GetServiceInputParameterList\",\"version\": 1,\"data\": { 
         \"input_parameter_list\": [{\"id\": 1489,\"service_id\": 
          12102,\"name\": \"Customer Number\",\"position\": 
          1,\"visible\": 
          true,\"required\": true,\"parameter_type\": 
           \"N\",\"client_id\": 
           true,\"min_length\": 11, \"max_length\": 
            11,\"confirm_required\": 
             false } ] }}";

Заполнить массив struct sс текстом:

int main() {
    int i = 0;
    int Wstart = 0;
    int Wend = 0;
    char name[19] = {0x20};
    char name1[19] = {0x20};
    int menunum = 0;
    int len = strlen(text);
    while (1)  // while ALL
    {
        if (i >= len) {
            break;
        }
        if (text[i] == 'i' && text[i + 1] == 'd') {
            while (1) {  // while id

                if (text[i] == ':') {
                    Wstart = i + 1;
                    Wend = 0;
                    i++;
                } else if (text[i] == ',' || text[i] == '}') {
                    Wend = i;

                    strncpy(name, text + Wstart, Wend - Wstart);
                    input_arr[menunum].id = atoi(name);
                    memset(name, 0, sizeof(name));
                    i++;
                    break;
                } else {
                    i = i + 1;
                }

            }  // while id
        } else if (text[i] == 'n' && text[i + 1] == 'a' && text[i + 2] == 'm' &&
                   text[i + 3] == 'e') {
            while (1) {  // while name

                if (text[i] == ':') {
                    Wstart = i + 3;
                    Wend = 0;
                    i++;
                } else if (text[i] == ',' || text[i] == '}') {
                    Wend = i - 1;

                    strncpy(name, text + Wstart, Wend - Wstart);
                    //   name[Wend-Wstart] = '\0';
                    //  memset(name1, 0, sizeof(name1));
                    if ((name[1] >= 'a' && name[1] <= 'z') ||
                        (name[1] >= 'A' && name[1] <= 'Z')) {
                        //  printf("%c is an alphabet.",c);
                        strcpy(name1, name);

                    } else {
                        int vc = 0;
                        int ia = strlen(name) - 1;
                        for (ia = strlen(name) - 1; ia >= 0; ia--) {
                            name1[vc] = name[ia];
                            vc++;
                        }
                    }

                    strcpy(input_arr[menunum].name, name1);

                    menunum++;
                    memset(name, 0, sizeof(name));
                    i++;
                    break;
                } else {
                    i = i + 1;
                }

            }  // while name
        } else if (text[i] == 'v' && text[i + 1] == 'i' && text[i + 2] == 's' &&
                   text[i + 3] == 'i' && text[i + 4] == 'b' &&
                   text[i + 5] == 'l' && text[i + 6] == 'e') {
            while (1) {  // while visible
                if (text[i] == ':') {
                    Wstart = i + 3;
                    Wend = 0;
                    i++;
                } else if (text[i] == ',' || text[i] == '}') {
                    Wend = i - 1;

                    strncpy(name, text + Wstart, Wend - Wstart);
                    //   name[Wend-Wstart] = '\0';
                    memset(name1, 0, sizeof(name1));
                    if ((name[1] >= 'a' && name[1] <= 'z') ||
                        (name[1] >= 'A' && name[1] <= 'Z')) {
                        //  printf("%c is an alphabet.",c);
                        strcpy(name1, name);

                    } else {
                        int vc = 0;
                        int ia = strlen(name) - 1;
                        for (ia = strlen(name) - 1; ia >= 0; ia--) {
                            name1[vc] = name[ia];
                            vc++;
                        }
                    }

                    strcpy(input_arr[menunum].visible, name1);

                    menunum++;
                    // memset(name, 0, sizeof(name));
                    i++;
                    break;
                } else {
                    i = i + 1;
                }

            }  // while visible
        } else {
            i++;
        }
    }

    printf("id:%d \n name: %s \n visible: %s 
            \n",&input_arr[0].id,&input_arr[0].name,&input_arr[0].visible);

    return 0;
}

1 Ответ

0 голосов
/ 28 января 2019

Ну, вы печатаете адрес id вместо его значения, используя спецификатор формата %d.

printf("id:%d\nname: %s\n visible: %d\n",&input_arr[0].id,&input_arr[0].name,&input_arr[0].visible);

должно быть

printf("id:%d \n name: %s \n visible: %d\n",input_arr[0].id,input_arr[0].name,input_arr[0].visible);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...