mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Integer-Zahl in String mit bestimmter Zeichenlänge


Autor: Peter H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle!


Und zwar hab ich folgendes Problem:

Ich will aus einer Integer-Zahl einen String mit der Länge 5 machen. 
Wenn die Integer-Zahl aus 5 Zeichen besteht, dann ist das kein Problem. 
Nur wenn sie jetzt z.B. aus nur 4 Zeichen besteht, will ich, dass dann 
im String zuerst eine Null und dann die Zahl steht.

Wie mache ich das am besten? Gibt es da eine Funktion, die das kann?

Ach ja, ich programmiere in C.

Vl kann mir ja jemand helfen.

Danke schonmal im Voraus.

lg Peter

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion itoa aus der stdlib.h kann das z.B., allerdings nicht die 
führenden Nullen. Die müsstest Du selber einbauen. Müsstest dann einfach 
abfragen, wo itoa die letzte Stelle hingeschrieben hat und entsprechend 
den Inhalt des Strings verschieben und die führenden Stellen mit Nullen 
belegen.

Autor: Peter H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Und wie frage ich ab, wo die letzte Stelle ist und wie verschiebe ich 
das ganze?
Ich hab es schon mit sprintf(messwertString,"%5d",messwert1) versucht, 
aber da stehen dann vorher auch nur Leerzeichen. Gibt es sonst vl eine 
Funktion, die die Länge der Integer-Zahl ermitteln kann?

lg Peter

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sprintf(messwertString,"%05d",messwert1)

Autor: Sab (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mystring='';
if (zahl<10000){ mystring=mystring+'0'; }
if (zahl<1000){ mystring=mystring+'0'; }
if (zahl<100){ mystring=mystring+'0'; }
if (zahl<10){ mystring=mystring+'0'; }

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und ohne sprintf...
  int i = 5;
  messwertString[i] = '\0';
  while(--i >= 0)
  {
     messwertString[i] = '0' + messwert1 % 10;
     messwert1 /= 10;
  }

... aber ungetestet...

Autor: Peter H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Werner B.

Super, haut hin, danke!!!

Autor: Peter H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, dass mit sprintf funktioniert auch!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also, dass mit sprintf funktioniert auch!
Das sollte es auch, allerdings ist sprintf sehr verschwenderisch, was 
Ressourcen angeht. Werners Lösung ist wahrscheinlich die 
speichersparendste.

Autor: Peter H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ johnny.m

Es kommt einmal im Programm vor, da geht das schon.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es kommt einmal im Programm vor, da geht das schon.

Ein Mal reicht, dann ist die Funktion/Bibliothek drin.
Die Anzahl der Aufrufe ändert da nicht viel dran.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es kommt einmal im Programm vor, da geht das schon.
Das hat damit nichts zu tun! Selbst wenn die Funktion nur einmal 
aufgerufen wird, wird sie dennoch komplett mit all ihrem Overhead 
eingebunden. Da ändert sich auch nichts dran, wenn Du sie im Programm 
100 mal aufrufst (dann ist es eher eine Sache der Verarbeitungszeit...). 
Aber wenn Du genug Speicher hast, dann kannst Du das natürlich gerne so 
machen.

Autor: Peter H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aso, danke, aber ich denke ich habe genug Speicher.

Autor: TechInfo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@WernerB

Kannst du vielleicht deinen Code von 16:37 Uhr kurz kommentieren?

Scheint nämlich auch die Lösung für mein Problem zu sein.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TechInfo wrote:
> @WernerB
>
> Kannst du vielleicht deinen Code von 16:37 Uhr kurz kommentieren?
>
> Scheint nämlich auch die Lösung für mein Problem zu sein.

Was ergibt  5238 % 10 ?   genau: 8 (also die letzte Stelle)
Was ergibt  5238 / 10 ?   genau: 523 (also die Zahl ohne die
                                      letzte Stelle)

im nächsten Schleifendurchlauf:

Was ergibt daher dann 523 % 10    genau: die 3
Und 523 / 10               das macht dann 52

und im nächsten Schleifendurchlauf
was ergibt 52 % 10             exakt: 2
und 52 / 10                    du sagts es: 5

womit wir beim nächsten Schleifendurchlauf sind:
was ergibt 5 % 10              die 5
und  5 / 10                    das macht 0

damit sind wir beim letzten Schleifendurchlauf von den 5-en
0 % 10                         macht eine 0
0 / 10                         ergibt wieder 0

Aus den % Rechnungen ist also rausgekommen:
8 3 2 5 und 0  (zur Erinnerung, die ursprüngliche Zahl war 5238)
der Rest in der Schleife ist also nur noch ein korrektes
hinkopieren der jeweiligen Stelle an die richtige Position
im String.
Ach ja: Aus der Zahl 8 den ASCII Character '8' machen geschieht
indem man eine '0' addiert. Glücklicherweise liegen die ASCII
Codes für Ziffern alle hintereinander, so dass es reicht zur
Ziffer einfach den Code für '0' zu addieren.

Autor: hotstylz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Werner B.

Du bist ja ein Fuchs, wa?

Echt dufte die Lösung. Danke !!!!!!!!!!!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.