sprintf > Formatstring an Funktion übergeben

Gast #301930
Lesenswert?

Hallo zusammen
Hab aktuell das Problem, dass ich für eine Datenausgabe an einen
Drucker eine formatierte Ausgabe benötige.

Hab mir folgendes ausgedacht:

void print(char *format_string, ...)
{
  char string[50];
  unsigned char string_laenge;

  sprintf(string,format_string);
  string_laenge=strlen(string);
  usw...
  print_data(string);   // Ausgabe auf Drucker
}

ein Aufruf würde dann zBsp. so aussehen:

a=7;
print"!Testausdruck!\n";
print("%03d",a);

anscheinend wird der Funktion nur der String "&03d" übergeben
der Wert der Variable(n) verscheindet dabei.

Weiss jemand Rat, wie ich den gesamten Formatstring inkl. Parameter
an eine Funktion übergeben kann.

Hab mir das ganze mit va_list argp bla,bla,bla angeschaut hab aber
dabei nicht den Durckblick.

Das folgende Beispiel scheint zu funktionieren, finde ich aber nicht
sonderlich elegant:

sprintf(string,"%03d",a); print_data(string);

Für eine rasche Antwort bin ich euch sehr dankbar!

Gruss Andy
Gast #301932
Lesenswert?

Hi Stefan

Herzlichen Dank für die rasche Antwort und den informativen Link.
Scheint doch keine "einfache" Lösung zu geben.
Werd mal schauen, ob ich die Zeit finde das auszuprobieren.
Persönliche Seite #301933
Lesenswert?

Kennt die Library des von Dir verwendeten Compilers kein vsprintf bzw.
vsnprintf?

Das sind Varianten für den Gebrauch mit eben jenen variablen
Argumentenlisten, so daß man mit denen eigene printf-Varianten
schreiben kann.

Das sähe dann so aus:

  void mein_printf(char* format, ...)
  {
    va_list argptr;
    char buffer[BUFFERSIZE];

    va_start(argptr, format);

    _vsnprintf(buffer, BUFFERSIZE - 1, format, argptr);

    // irgendwas mit "buffer" anstellen
  }
Gast #301934
Lesenswert?

Hi Rufus

Hab mal für eine formatierte Ausgabe auf ein LCD (serielle
Schnittstelle geht natürlich bei entsprechender Anpassung
der putchar Routine auch) sowas geschrieben:

//--------------------------------------------------

void putchar_lcd (unsigned char c)
{
 write_LCD(c);
}

// ---------------

static void put_one_char(char c, void *dummy)
  {
    dummy=0;
  putchar_lcd (c);
  }

// ----------------

short dprintf_XY (unsigned char x,unsigned char y,const char *format,
...)
  {
    va_list ap;
    int nr_of_chars;

    goto_XY(x,y);
    va_start (ap, format);  /* Variable argument begin */
    nr_of_chars = _formatted_write (format, put_one_char, (void *) 0,
ap);
    va_end (ap);    /* Variable argument end */
    return (nr_of_chars);  /* According to ANSI */
  }

//-------------------------------------------------

meinst Du man könnte das ganz soweit umschreiben, das nicht
nur einzelne Zeichen, sondern ganze Strings ausgegeben werden
könnten.
Für meine Druckerausgabe per IRDA- Schnittstelle muss
ich die ganzen Datenpackete nämlich noch in ein einfaches Protokoll
verpacken. (STX, Laenge, Daten Checksumme usw.)

Gruss Andy

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren