mikrocontroller.net

Forum: Compiler & IDEs Stings verbinden


Autor: Dennis S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: Dennis S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.