Как я могу типизировать строку к структуре, в которой есть члены массива char разных размеров? - PullRequest
0 голосов
/ 03 апреля 2012

Как можно типизировать строку в структуру, которая имеет члены массива char разных размеров? например

typedef struct format{
    char test1[12];
    char test2[3];
    char test3[3];
    char test4[3];
    char test5[9];
    char test6[3];
    char test7[3];
    char test8[7];
    char test9[24];
    char test10[3];
    char test11[24];    
}format;

Теперь у меня будет одна строка, которая будет объединена с вышеуказанной информацией, и я просто хочу отобрать у них соответствующую информацию и заполнить ее соответствующими членами структуры.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Каково ваше обоснование? Вы можете сойти с рук:

если C :

// s is a null-terminated c string.
format* f = (format*)s;

это все, что нужно.

, если C ++ :

// std::string s; // assuming basic_string<char>
// do stuff with s
format* f = reinterpret_cast<format*>(s.c_str());

При условии, что строка остается в области видимости. Это может быть рискованно в зависимости от вашей реализации STL.

Как для C ++, так и для C : вы также рискуете прочесть за пределами каждой строки, если ваши строковые срезы не заканчиваются нулями и вы вызываете стандартные строковые функции в стиле c для членов вашей структуры формата .

Как указали undur_gongor и glglgl, это может не сработать, если выравнивание и заполнение массивов символов внутри структуры приводит к не плотно упакованной структуре (т. Е. В результате правил выравнивания имеется дополнительное заполнение).

Как указал Стив, на большинстве на всех архитектурах char равен 1 байту, что означает, что вы должны быть в безопасности.

0 голосов
/ 03 апреля 2012

В C ничто не мешает вам преобразовать эту структуру в char * и рассматривать ее как строку.

Сказав это, однако, вы должны быть осторожны, как вы относитесь к этой «струне». Рассмотрим следующий пример:

typedef struct format{
    char R[12];
    char M[15]; 
} format;

void main(){    
    format A;
    int i;

    strcpy(A.R,"AA");
    strcpy(A.M,"AABBCC");
    char *B=(char*)&A; //Note the typecasting
    printf("%s",B);     
    for (i=0;i<strlen(B);i++){
        printf("%d\n",*(B+i));
    }   
}

Приведенный выше пример не будет работать должным образом, то есть он не будет перебирать все символы в пределах A, потому что строки в C завершаются нулем (http://en.wikipedia.org/wiki/Null-terminated_string), и это то, как различные функции (strlen, strcpy и другие) ) знают, что они достигли конца потока символов. Таким образом, вышеприведенный код выведет «AA» и [65,65] (что является эквивалентом «ASCI»).

Чтобы приведенный выше фрагмент кода выполнял то, что от него ожидается, нам потребуется EITHER:

1) Удалите все символы «\ 0» (ноль) из A, КРОМЕ предыдущего, перед обработкой его как строки (и передачи его другим функциям, например, printf)

2) Или, если мы хотим сохранить все отдельные поля в виде строк и по-прежнему анализировать их, мы теперь должны будем использовать sizeof (format) (или sizeof (A)) вместо strlen (B) в «for» итерация выше.

Итак, да, вы можете типизировать структуру символов в (char *) и обращаться с ней как со строкой, но есть небольшая предварительная обработка, которую вы должны будете сделать, чтобы это работало, как ожидалось. Например, у вас может быть функция, которая реализует удаление "\ 0", как в (1) выше, называемая чем-то вроде structToString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...