Stings verbinden

Gast #1665869
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]
#1665892
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'
#1665893
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.

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