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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.