Polsterung mit sprintf

Lesezeit: 2 Minuten

Benutzeravatar von Abruzzo Forte e Gentile
Abruzzen Forte e Gentile

Ich habe eine Dummy-Frage. Ich möchte eine Ganzzahl in einen Puffer drucken, der mit 0 aufgefüllt wird, aber ich kann es nicht aussortieren sprintfFormat. Ich versuche folgendes

char buf[31];
int my_val = 324;
sprintf( buf, "%d030", my_val );

in der Hoffnung, die folgende Zeichenfolge zu haben

"000000000000000000000000000324"

Was mache ich falsch? Es bedeutet nicht Pad mit 0 für eine maximale Breite von 30 Zeichen?

"%030d" ist der gesuchte Droide

  • “Die Droiden, nach denen Sie suchen, stehen im Handbuch. Sie heißen Breite und Präzision.” 🙂

    – Jens

    16. Mai 2012 um 13:27 Uhr

Sie haben die Syntax etwas falsch verstanden; Der folgende Code erzeugt die gewünschte Ausgabe:

char buf[31];
int my_val = 324;
sprintf( buf, "%030d", (int)my_val );

Aus Wikipedia-Artikel über Printf:

[...] printf("%2d", 3) results in " 3", while printf("%02d", 3) results in "03".

  • Warum musst du werfen my_val zu int wenn es schon eine ist int?

    – Kevinji

    25. Mai 2011 um 2:17 Uhr


Die Polsterung und Breite kommen Vor der Typbezeichner:

sprintf( buf, "%030d", my_val );

Versuchen:

sprintf( buf, "%030d", my_val );

Ihre Genauigkeits- und Breitenparameter müssen zwischen „%“ und dem Konvertierungsbezeichner „d“ liegen, nicht danach. Tatsächlich tun das alle Flags. Wenn Sie also ein vorangestelltes ‘+’ für positive Zahlen wünschen, verwenden Sie ‘%+d’.

Benutzeravatar von John
John

Es ist %030dmit Typenbuchstaben am Ende.

Benutzeravatar von Lundin
Lundin

Eine ziemlich effektive Version, die keine langsamen Bibliotheksaufrufe benötigt:

#include <stdio.h>

void uint_tostr (unsigned int n, size_t buf_size, char dst[buf_size])
{
  const size_t str_size = buf_size-1;

  for(size_t i=0; i<str_size; i++)
  {
    size_t index = str_size - i - 1;
    dst[index] = n%10 + '0';
    n/=10;
  }
  dst[str_size] = '\0';
}


int main (void)
{
  unsigned int n = 1234;
  char str[6+1];
  uint_tostr(n, 6+1, str);
  puts(str);
}

Dies kann weiter optimiert werden, obwohl es wahrscheinlich immer noch einige hundert Mal schneller ist als sprintf wie es ist.

1407540cookie-checkPolsterung mit sprintf

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy