# Sprintf () wird nicht ausgegeben

**URL:** <https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486>\
**Category:** Deutsch\
**Created:** [May 18, 2023, 6:14pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486 "2023-05-18T18:14:11Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![flets45](https://avatars.discourse-cdn.com/v4/letter/f/c89c15/32.png) [@flets45](https://forum.arduino.cc/u/flets45)\
**Post date:** [May 18, 2023, 6:14pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/1 "2023-05-18T18:14:11Z")

</div>

Hallo zusammen.  
Ich habe folgendes Problem: ich möchte auf einem Arduino Uno via Serial bzw. LCD-Display testweise einen Wert anzeigen lassen.

Ist der Wert kleiner als 10, soll vor der Ziffer eine 0 erscheinen, dass immer 2 Ziffern dastehen.

Das habe ich mittels sprintf(%02d...) realisiert.

Jedoch scheint das Programm hier rumzuzicken, denn wenn ich den Code ausführe, erscheint garnichts auf dem seriellen Monitor bzw dem Display.  
Hier der relevante Code:

```arduino
char zeit1[5];
byte stunde1 = 0;

void setup() {

Serial.begin(9600);

 sprintf(zeit1, "%02d:00", stunde1);
 Serial.println(zeit1);

}

void loop() {

}

```

Wenn ich beim gleichen Code jedoch vor dem Befehl Serial.print(zeit1) zusätzlich noch Serial.println(stunde1) anführe, funktioniert der Code wie gewollt und Ich erhalte als Ausgabe 0 und 00:00

Woran liegt das denn?

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [May 18, 2023, 6:27pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/2 "2023-05-18T18:27:13Z")

</div>

> [@flets45](#):
>
> `zeit1[5]`

"12:44" benötigt Platz für 6 Symbole.

---

<div class="post-metadata">

**Author:** ![J-M-L](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/j-m-l/32/766245_2.png) [@J-M-L](https://forum.arduino.cc/u/J-M-L)\
**Post date:** [May 18, 2023, 6:41pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/3 "2023-05-18T18:41:59Z")

</div>

sprintf() ist speicherintensiv.  
Sie könnten in kleinen Schritten tun, was Sie wollen

```arduino
void setup() {
  Serial.begin(115200);
  for (byte stunde = 0; stunde < 24; stunde++) {
    if (stunde < 10) Serial.write('0');
    Serial.print(stunde);
    Serial.println(F(":00"));
  }
}

void loop() {}

```

---

<div class="post-metadata">

**Author:** ![noiasca](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/noiasca/32/1126910_2.png) [@noiasca](https://forum.arduino.cc/u/noiasca)\
**Post date:** [May 18, 2023, 6:42pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/4 "2023-05-18T18:42:42Z")

</div>

alternativ könnte man auch einfach auf Buffer und Zwischenvariablen verzichten und die 0 ausgeben wenn notwendig.

```arduino
if (stunde1 < 10) Serial.print('0');
```

---

<div class="post-metadata">

**Author:** ![my\_xy\_projekt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/my_xy_projekt/32/810062_2.png) [@my\_xy\_projekt](https://forum.arduino.cc/u/my_xy_projekt)\
**Post date:** [May 18, 2023, 7:08pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/5 "2023-05-18T19:08:24Z")

</div>

> [@flets45](#):
>
> Wenn ich beim gleichen Code

Nein, es ist nicht der gleiche Code 🙂 Damit verschieben sich Adressen auf die zugegriffen wird, wenn es zu einer Bereichsüberschreitung kommt.

Das lässt sich aber verhindern, wenn an Stelle von `sprintf()` `snprintf()` genutzt wird.  
Der Funktion wird übergeben, wie groß der Buffer ist, in den das Ergebins passen soll. Ist das Ergebnis größer, wird abgeschnitten:

```arduino
char zeit1[5];
byte stunde1 = 5;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  snprintf(zeit1, 5, "%02d:00", stunde1);
  Serial.println(zeit1);
}

void loop()
{
}
```

liefert:

```arduino
20:54:16.490 -> Start...
20:54:16.490 -> 05:0
```

Um sicher zu gehen, das nicht durch magische Zahlen doch eine Bereichüberschreitung eintritt, kann die - immer richtige - Größe errechnet werden:

```arduino
const byte charLength = sizeof(zeit1)/sizeof(zeit1[0]);
```

Das geht natürlich auch "on the fly"

```arduino
  snprintf(zeit1, sizeof(zeit1)/sizeof(zeit1[0]), "%02d:00", stunde1);
```

birgt aber den nachteil, das bei exzessiver Anwendung mehr Rechenleistung aufgebracht werden muss. Daher mit einer Konstanten arbeiten.

Die Berechnung erfolgt in diesem Fall anhand der Länge des Buffers geteilt durch die Größe des ersten Elementes, was zur Folge hat, das Du die Anzahl der Elemente bekommst, egal welche Größe ein Element hat.

Bei einer byte-var ist 1 Element 1 byte groß.  
Bei einer (u)int16\_t wären es schon 2 byte und ein einfaches sizeof(wert) würde Dir ein verfälschtes Ergebnis liefern.

Ansonsten: Es ist ja bereits geschrieben worden, das es zu aufwändig ist, in dieser Form 1 (EINE) Vornull ausgeben zu lassen.

Ich geb die Zahl an eine Funktion:

```arduino
void vornull(const byte zahl)
{
  if (zahl<10) Serial.print(0);
  Serial.print(zahl);
}
```

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [May 19, 2023, 4:56am UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/6 "2023-05-19T04:56:49Z")

</div>

> [@my\_xy\_projekt](#):
>
> birgt aber den nachteil, das bei exzessiver Anwendung mehr Rechenleistung aufgebracht werden muss. Daher mit einer Konstanten arbeiten.

Was?

> [@my\_xy\_projekt](#):
>
> `sizeof(zeit1)/sizeof(zeit1[0])`

Wird zur Kompilezeit ausgewertet!  
Ist also kostenlos!  
Und doch Unsinn!

```arduino

constexpr size_t buffSize {6};

char zeit1[buffSize];

snprintf(zeit1, buffSize, "%02d:00", stunde1);

```

So!

> [@J-M-L](#):
>
> sprintf() ist speicherintensiv.

für ungebrauchten Speicher gibts kein Geld zurück!

---

<div class="post-metadata">

**Author:** ![J-M-L](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/j-m-l/32/766245_2.png) [@J-M-L](https://forum.arduino.cc/u/J-M-L)\
**Post date:** [May 19, 2023, 6:34am UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/7 "2023-05-19T06:34:52Z")

</div>

> [@combie](#):
>
> für ungebrauchten Speicher gibts kein Geld zurück!

sehr richtig.  
Ich habe dies nur für den Fall erwähnt, dass der verfügbare Flash-Speicher im realen Projekt mit dem Display knapp wird.

---

<div class="post-metadata">

**Author:** ![michael\_x](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/michael_x/32/628623_2.png) [@michael\_x](https://forum.arduino.cc/u/michael_x)\
**Post date:** [May 19, 2023, 9:15am UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/8 "2023-05-19T09:15:30Z")

</div>

> [@J-M-L](#):
>
> sprintf() ist speicherintensiv

```arduino
char zeit[] = "xx:00";
void setup() {
   Serial.begin(115200);
   for (byte h=0;h<24;h++) {
      zeit[0] = '0' + h / 10;
      zeit[1] = '0' + h % 10;
      Serial.println(zeit);
   }
}
void loop () {}

```

---

<div class="post-metadata">

**Author:** ![J-M-L](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/j-m-l/32/766245_2.png) [@J-M-L](https://forum.arduino.cc/u/J-M-L)\
**Post date:** [May 19, 2023, 1:23pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/9 "2023-05-19T13:23:30Z")

</div>

Das funktioniert auch – Modulo und Division sind allerdings kostspielig.

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [May 19, 2023, 1:47pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/10 "2023-05-19T13:47:45Z")

</div>

> [@J-M-L](#):
>
> Das funktioniert auch – Modulo und Division sind allerdings kostspielig.

Und du glaubst, dass deine variante Sparsamer ist?

> [@J-M-L](#):
>
> `Serial.print(stunde);`

Welch ein Irrtum!

stunde ist ein Byte!  
Also ein unsigned char.

Es wird aufgerufen:  
size\_t Print::print(unsigned char b, int base)  
Die Daten werden aufgeweitet zu: unsigned long

Dann dieses aufgrufen:  
size\_t Print::print(unsigned long n, int base)

Welches dann zu guter Letzt dieses aufruft:

```arduino
size_t Print::printNumber(unsigned long n, uint8_t base)
{
  char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
  char *str = &buf[sizeof(buf) - 1];

  *str = '\0';

  // prevent crash if called with base == 1
  if (base < 2) base = 10;

  do {
    char c = n % base;
    n /= base;

    *--str = c < 10 ? c + '0' : c + 'A' - 10;
  } while(n);

  return write(str);
}

```

Und was sehe ich da?  
% und /

Von einer Ersparnis ist da nicht viel zu sehen!

---

<div class="post-metadata">

**Author:** ![J-M-L](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/j-m-l/32/766245_2.png) [@J-M-L](https://forum.arduino.cc/u/J-M-L)\
**Post date:** [May 19, 2023, 2:17pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/11 "2023-05-19T14:17:33Z")

</div>

gutes Argument

---

<div class="post-metadata">

**Author:** ![michael\_x](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/michael_x/32/628623_2.png) [@michael\_x](https://forum.arduino.cc/u/michael_x)\
**Post date:** [May 19, 2023, 2:49pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/12 "2023-05-19T14:49:04Z")

</div>

> [@J-M-L](#):
>
> Modulo und Division sind allerdings kostspielig.

Daher werden z.B. in RTC IC die Daten BCD-codiert gespeichert.Dann kann jede Ziffer durch shift- und masken- Operationen "verarbeitet" werden

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [November 15, 2023, 2:49pm UTC](https://forum.arduino.cc/t/sprintf-wird-nicht-ausgegeben/1128486/13 "2023-11-15T14:49:21Z")

</div>

Closed on November 15, 2023, 2:49pm UTC

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.
