String formatieren, Frage zum Code

Gast #2058317
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
Gast #2058410
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?
Gast #2058419
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
Gast #2058496
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren