Forum: Compiler & IDEs String formatieren, Frage zum Code


von Alex (Gast)


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:

1
char * format(char *str, uint8_t digits)
2
{
3
  
4
  char tmp_str[10];
5
  
6
  int8_t diff;
7
  diff = digits - strlen(str) //digits hier Wert 4
8
  for(uint8_t i = 0; i < diff; i++)
9
  {
10
    tmp_str[0] = '0';
11
    tmp_str[1] = '\0';
12
    strcat(tmp_str, str);
13
    strcpy(str, tmp_str);
14
  }
15
  
16
  return(str);
17
}

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

von Peter (Gast)


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?

von Peter (Gast)


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

von Alex (Gast)


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

von docean (Gast)


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

von Alex (Gast)


Lesenswert?

Hallo Peter,

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

Dank Dir nochmal

Gruß, ALex

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.