2015-08-10 6 views
3

Я имею структуру:Преобразование структуры на символ * указатель на C

struct K 
{ 
    char a[10]; 
    char b[10]; 
}; 

Я хочу, чтобы преобразовать эту структуру в полукокса * указатель и напечатать значение на UART. Uart принимает указатель char * в качестве входных данных.

Моя главная функция выглядит следующим образом:

void main() 
{ 
    struct K x= { "Hello","Pollo"}; 
    struct K *revert; 
    char *buffer; 
    buffer = (char *)&x; 
    revert = (struct K *) buffer; 
    printf("%s %s", revert->a,revert->b); 
} 

Примечание: Е() не будет работать, я использую UART.

Я хочу напечатать значение буфера на UART, когда это делается с преобразованием указателя структуры на char * указатель. Можно ли это сделать?

+2

Пожалуйста, не используйте 'недействительным main'. Возьмите одну из точек входа, определенных в стандарте. – nvoigt

+1

@nvoigt Вы утверждаете, что это противоречиво. Стандарт определяет, что точка входа может быть реализована. – this

+0

@this Вы понимаете, что «реализация определена» - это плохо, не так ли? – nvoigt

ответ

0

Другой подход к расщеплению и рекомбинации элементов структуры в цепочку символов * содержит строковые функции sprintf, а затем strncpy. Есть много и много способов сделать это. Простой арифметический указатель будет делать, и т.д .. Но этот подход является достаточно чистым и простым:

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

struct K 
{ 
char a[10]; 
char b[10]; 
}; 

int main (void) 
{ 
    char tmp[21] = {0}; 
    char *buf = tmp; 
    struct K x = { "Hello","Pollo"}; 
    struct K rev = {{0},{0}}; 

    /* combine x.a & x.b into single string in buf */ 
    sprintf (buf, "%s%s", x.a, x.b); 

    /* print the combined results */ 
    printf ("\n combined strings: %s\n\n", buf); 

    /* get original lenght of x.a & x.b */ 
    size_t alen = strlen(x.a); 
    size_t blen = strlen(x.b); 

    /* copy from buf into rev.a & rev.b as required */ 
    strncpy (rev.a, buf, alen); 
    strncpy (rev.b, buf+alen, blen); 

    printf (" recombined: rev.a: %s rev.b: %s\n\n", rev.a, rev.b); 

    return 0; 
} 

Выход

$ ./bin/struct2str 

combined strings: HelloPollo 

recombined: rev.a: Hello rev.b: Pollo 
+0

sprintf() делает чудо. Благодарю. –

3

Я хотел бы сделать, как следующее:

void serialize(struct K x, char * dest) 
{ 
    memcpy(dest,x.a,10); 
    memcpy(&dest[10],x.b,10); 
} 

и

void deserialize(const char * src, struct K *x) 
{ 
    memcpy(x->a,src,10); 
    memcpy(x->b,&src[10],10); 
} 

Поскольку внутри вашей структуры у вас есть ASCII строки. Если бы у вас был другой тип данных, я бы, вероятно, использовал unsigned char * как тип для буфера назначения для сериализации.