Преобразование структуры в указатель char* в C

У меня есть структура:

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

Я хочу преобразовать эту структуру в указатель char* и напечатать значение в 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);
}

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

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


person Pradeep Ch    schedule 10.08.2015    source источник
comment
Пожалуйста, не используйте void main. Возьмите одну из точек входа, определенных в стандарте.   -  person nvoigt    schedule 10.08.2015
comment
@nvoigt Ваше заявление противоречиво. Стандарт определяет, что точка входа может быть определена реализацией.   -  person this    schedule 10.08.2015
comment
@this Вы понимаете, что определенная реализация - это плохо, верно?   -  person nvoigt    schedule 10.08.2015
comment
@nvoigt Вы должны позвонить в Microsoft (и во многие, многие компании по производству микроконтроллеров, которые используют void main в своих компиляторах) и сказать им об этом. Может быть, они возьмут вас на работу. С другой стороны, они, скорее всего, проигнорируют ваши нелепые заявления. msdn.microsoft.com/ en-us/library/windows/desktop/ duckduckgo.com/ #DontBeIgnorant   -  person this    schedule 10.08.2015
comment
Мои нелепые утверждения приводят к работающим программам, которые являются кроссплатформенными. Вы можете игнорировать их, но вы не получите кросс-платформенный, совместимый со стандартами код. Это ваш выбор, если вы хотите стремиться к меньшему.   -  person nvoigt    schedule 10.08.2015
comment
@nvoigt Кажется, ты живешь в навязанном себе пузыре. Ваши аргументы представляют собой черно-белое мышление, что делает их не аргументами. Мы живем в очень разнообразном мире вычислений, где, например, явно процветает программное обеспечение, ориентированное на платформу.   -  person this    schedule 10.08.2015
comment
@это нормально. Пусть они процветают. Я не против (на самом деле, я часть этого). Но я не буду учить новичков нестандартному поведению. Как только они станут экспертами, они смогут решить это сами.   -  person nvoigt    schedule 10.08.2015
comment
@nvoigt И мы прошли полный круг. Учение о том, что void main не определяется C, неверно. Он может быть нестандартным, каким бы ни было ваше определение стандарта, но он определенно неявно определен стандартом C. У меня был соблазн позвать вас на стандартное разрешение раньше, я обязательно сделаю это в следующий раз.   -  person this    schedule 10.08.2015
comment
@this Это бесплатный сайт, не стесняйтесь делать все, что вам заблагорассудится.   -  person nvoigt    schedule 10.08.2015


Ответы (1)


Другой подход к разделению и рекомбинации элементов структуры в строку char* заключается в использовании строковых функций 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
person David C. Rankin    schedule 10.08.2015
comment
sprintf() творит чудо. Спасибо. - person Pradeep Ch; 10.08.2015