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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.