www.mikrocontroller.net

Forum: Compiler & IDEs String formatieren, Frage zum Code


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Zahlenwerte als Stringvorliegen (1 bis 4 Zeichen) und 
möchte den auf 4 Zeichen fest formatieren. In der Funktion arbeite ich 
mit dem globalen string, gebe aber am Ende den Zeiger noch zurück, damit 
man das gleich für uart-Ausgabe schachteln kann.
Mein Quellcode sieht wie folgt aus:

char * format(char *str, uint8_t digits)
{
  
  char tmp_str[10];
  
  int8_t diff;
  diff = digits - strlen(str) //digits hier Wert 4
  for(uint8_t i = 0; i < diff; i++)
  {
    tmp_str[0] = '0';
    tmp_str[1] = '\0';
    strcat(tmp_str, str);
    strcpy(str, tmp_str);
  }
  
  return(str);
}

Ich bin mir bei den Pointern nicht ganz sicher.
Könntet ihr mal drauf schauen und etwas von "ist ok" bis "geht gar 
nicht" anmerken.

Danke und Grüße, Alex

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex schrieb:
>   for(uint8_t i = 0; i < diff; i++)
>   {
>     tmp_str[0] = '0';
>     tmp_str[1] = '\0';
>     strcat(tmp_str, str);
>     strcpy(str, tmp_str);
>   }
>
>   return(str);
> }
ich kann mir nicht vorstellenb das da immer etwas sinnvolles rauskommt, 
dann du hast ja das strcat in der schleife und damit hängt du ja 
mehrfach das str in das tmp_str.

Eventuell sollte du noch die länge von str prüfen.
Was hindert dich eigentlich daran den code einfach mal zu testen, dann 
weisst du doch ob er geht oder nicht?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Funktion hat irgendwie quadratische Laufzeit (ist bei 4 Stellen 
aber wohl nicht so schlimm) und braucht unnötige 10 Bytes Stackspeicher.

Ohne das jetzt zumindest einmal getestet zu haben versuche mal 
folgendes:

char * format(char *str, uint8_t digits)
{
  int8_t diff = digits - strlen(str) //digits hier Wert 4
  int8_t i;  // kein unsigned, sonst wäre i>=0 immer wahr

  if(diff<=0) return str;

  for(i=strlen(str); i>=0; i--)
    str[i+diff]=str[i];
  for(i=0; i<diff; i++)
    str[i]='0';

  return str;
}

Peter

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

danke für die Antwort.
Ich habe momentan die Hardware noch nicht da und wolte schon mal 
"trocken" vorarbeiten. Allerdings könnte ich da mal auf 'nem anderen 
Board testen. Werd das mal probieren.
Zum Thema string anhängen: Ich hänge vorn eine 0 an (Ergebnis in 
tmp_str) und dann kopiere ich den tmp_str in den Originalstring und 
benutze tmp_str in der nächsten Schleife wieder.
Passt das mit den Pointern so, speziell bei der Parameterübergabe, 
Zugriff in der Funktion auf str und Rückgabe. Ich binb da immer etwas 
unsicher.

Grüß, Alex

Autor: docean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was hinder dich daran den Code auf einem normalen x86 C-Compiler 
auszuprobieren, so eine Fkt. testen geht auch da, und debuggen geht da 
eh besser

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

ich hab's eben ausprobiert, es funktionieren beide Versionen.

Dank Dir nochmal

Gruß, ALex

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.