Forum: Compiler & IDEs Stings verbinden


von Dennis S. (Gast)


Lesenswert?

Hallo ich habe mir ein kleines Programm geschrieben das mir als erstes 
meine Kommazahl aufteilt in Vor und Nschkommastelle.Anschliessend 
wandele ich diese beiden Int Zahlen in ASCII um.Nun möchte ich die 
einzelnen Strings miteinander verbinden.Dies funktioniert bis zu meinem 
letzten strncat.Da überschreibt mein zweiter String meinen ersten statt 
sie zu verbinden.Kann mir irgend jemand sagen wo mein Fehler liegt?
[c]
void GetFunktion2()
{
  //1.0
  float Zahl =256.8;
  char string[8];
  char buf[2];

  Uint16 NachkommaStelle =0;
  Uint16 Vorkommastelle =0;

  Float_To_INT(Zahl,&NachkommaStelle,&Vorkommastelle);

  INT_To_ASCII(Vorkommastelle,3,string);
  INT_To_ASCII(NachkommaStelle,1,buf);

  strncat(string,".",1);
  strncat(buf,",",1);
  strncat(string,buf,2);

  asm ("      ESTOP0");
}
[\c]

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie groß ist buf? Und wie lang ist der String, den Du darin ablegen 
willst? Bedenke, daß ein String in C immer ein Byte mehr als die 
Nutzdaten benötigt.

buf ist 2 Bytes groß.

Du willst aber eine einstellige Nachkommastelle und ein Komma darin 
unterbringen ...

von Karl H. (kbuchegg)


Lesenswert?

Dennis S. schrieb:

>   char string[8];
>   char buf[2];

Merk dir eines:
Bei Stringoperationen wird NIEMALS gekleckert, sondern "geklotzt was man 
sich gerade noch erlauben kann". Ein Array der Länge 2, ist beim 
Arbeiten mit Strings so gut wie nie sinnvoll, es sei dann, da kommt eine 
Konstante rein. Denn ein String mit 1 variablen Nutzzeichen benötigt man 
so gut wie nie. Und ob du temporä in einer Funktion ein paar Bytes mehr 
auf dem Stack allokieren lässt oder nicht, spielt in 99% aller Fälle 
auch keine Rolle mehr.


>   INT_To_ASCII(Vorkommastelle,3,string);
>   INT_To_ASCII(NachkommaStelle,1,buf);
>
>   strncat(string,".",1);
>   strncat(buf,",",1);

Soso. An einem String mit streln gleich 1, hängst du noch ein Zeichen 
drann. Damit muss das Array schon mindestens 3 Lang sein. 2 Zeichen + 
'\0'

von Hc Z. (mizch)


Lesenswert?

Die Stringlänge von buf ist mit [2] zu kurz.  Da das abschließende '\0' 
dazukommt, hast Du 3 Zeichen.

buf ist nach string alloziert. kommt im Stack also direkt unterhalb. 
Beim
1
strncat(buf,",",1);
kommt das '\0' 1 Stelle hinter den für buf reservierten Raum, und das 
ist string[0].  Deshalb ist string beim nächsten strncat leer.

von Dennis S. (Gast)


Lesenswert?

Besten dank an alle.Manchmal sieht man den Wald vor lauter Bäumen 
nicht.Und ich such jetzt schon seit 8 uhr meinen Fehler.

von Klaus (Gast)


Lesenswert?

Dennis S. schrieb:
> Manchmal sieht man den Wald vor lauter Bäumen
> nicht.

Muss bei C natürlich heißen: Manchmal sieht man den String vor lauter 
char[] nicht :-)

von Falk B. (falk)


Lesenswert?


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.