mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik merkwürdiges Problem mit get(s)


Autor: Johnny5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi @ all,

habe da ein sehr merkwürdiges Problem. Ich will eigentlich nur einen 
String mit gets() einlesen. Wenn ich den eingegebenen Wert danach mit 
printf auf dem Bildschirm ausgebe, stimmt alles noch.
Wenn ich mir s1 aber anschaue, stelle ich fest, dass s1 immer den 
gleichen Wert hat. Also zum Bsp.("x[7]_][]as]x]"). Bei s[0] wird also 
auch x angezeigt, bei s[1] [ usw.
Trotzdem erscheint das Eingegebene immer richtig mit printf. Kann sich 
das einer erklären?????????
Und warum schreibt dieses verdammte Programm den verdammten Wert nicht 
einfach in den angegebenen verdammten Speicherplatz rein ???????

Wäre sehr dankbar für Hilfe.
VG Johnny5

static char s1[50];
.
.
.
//************************************************
void getCharacter () {
         printf("Eingabe: ");
                       gets(s1);
                       printf("%s",s1);
                       }
//************************************************

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also du ruft die Funktion gets() auf, gibst "x[7]_][]as]x]" ein. Und in 
s1 steht dann "x[7]_][]as]x]" also in s[0] steht ein x, in s[1] ein [ 
usw. Und wenn du s1 mit printf() ausgibst, dann wird "x[7]_][]as]x]" 
ausgegeben. Verdammt, das ist tricky!

Aber mal im Ernst:

Mit WAS übersetzt du das Programmfragment und gibt es auch ein 
komplettes Fehlerprogramm?

WIE und WANN schaust du in s1 und s[0]... (schätze mal das soll s1[0] 
heissen) nach? Vielleicht ist DAS falsch!

Autor: Johnny5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan:

Also was ich eigentlich gemeint hab ist: S1 hat zu Beginn immer 
irgendeinen Startwert, was ja auch nicht weiter schlimm ist. Nur ich 
kann diesen Wert nie wieder ändern mit gets(s1). S1 bleibt immer gleich 
dem Startwert. Das komische ist, dass, wenn ich printf("%s",s1); aufrufe 
das vorher mit gets(s1) Eingegebene auf dem Bildschirm erscheint. Wo 
wird das also gespeichert, wenn doch in s1 nur der Startwert steht?? 
Sorry, hab mich wahrscheinlich nicht klar ausgedrückt.
Mit s1[0] hast recht gehabt, wollte damit aber nur sagen, dass s1 
wirklich nur immer den gleichen Startwert gespeicher hat.

Das Programmfragment lass ich von meinem Compiler ganz normal übersetzen 
und ich kann durch mein Programmierkabel ein und Ausgaben auf dem 
Bildschirm machen.

Gruss Johnny5

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hei Man,

schaust du dir die Werte von s1 oder was auch immer bloss im Debugger 
an, oder liest du sie wirklich aus, weil im Debugger werden die Werte 
womoeglich nicht gut aktualisiert oder er geht einfach ent gescheit. 
Versuch mal das.

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

Bewertung
0 lesenswert
nicht lesenswert
> Das Programmfragment lass ich von meinem Compiler ganz normal übersetzen

Schön für dich.
Wenn wir das auch könnten (dein Programm übersetzen),
dann könnte sich wer aufmachen und das mal tun und
nachsehen was da so alles passiert.

So aber: können wir nur raten.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was. Das hat zwar jetzt nichts mit deinem aktuellen Problem
zu tun, aber ...

gets() ist eine No-No Funktion.
Es gibt Leute, die sind der Meinung, dass Programmierer die gets() 
benutzen
sofort an die Wand gestellt werden sollten. So mit Augenbinde und 
letzter
Zigarette und so. Ich bin da nicht ganz so radikal. Entzug der
Bürgerrechte und lebenslanges Programmierverbot würden mir schon reichen 
:-)

gets()  - pfui
fgets() - bravo

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl Heinz, hast du das Warum bewusst aus didaktischen Gründen 
weggelassen?

Die brennende Zündschnur an gets() ist, dass überhaupt kein 
Schutzmechanismus vorhanden ist, um zu verhindern, dass über die Grenzen 
es Zielpuffers hinausgeschrieben wird. Solange Zeichen außer Newline 
kommen, wird gnadenlos in den Puffer geschrieben... bis zum berühmten 
Pufferüberlauf.

http://de.wikipedia.org/wiki/Puffer%C3%BCberlauf

Autor: Johnny5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten und Tipps,

es geht jetzt, der Debugger hat gesponnen und andauernd falsche Werte 
angezeigt.
Es ist jez aber ein neues Problem aufgetaucht.
Ich will eigentlich nur einen String s2(immer 8 Zeichen lang) an einen 
andern s anhängen. Ich benutze strcat(s,s2). Beide Strings sind 
nullterminiert.
Wenn ich aber mehr als 12 Zeichen beim ersten String habe, wird der 
Anhang immer kuerzer, bis dann bei 18 Zeichen gar nichts mehr angehaengt 
wird. Das versteh ich nicht, ich habe doch beide Strings mehr als 
grosszügig dimensioniert. Hat jemand eine Ahnung warum das anhängen nur 
bei kurzen Strings geht, die Fkt strcat ist nämlich nicht limitiert.
UND: Wenn ich die char-Zeichen einzeln(wie unten im Code ersichtlich) 
übergebe, hat das genau den gleiche Effekt, dass bei Basisstring über 12 
Zeichen gekürzt wird. BAHNHOF???????????

VG Johnny5
.
.
root char s1[50],s2[50];
.
.
root void SerDTransmitt(char *s) {        //als Argument wird s1 
eingesetzt


      sum=Calculate(s);  //Fkt liefert best. Wert zurück

      ltoa(sum,s2);      //long wird in String gewandelt(funzt auch)
      strcat(s1,s2);     //hier liegt die Wurzel alles Bösen
   /* s1[16]=s2[0];      //Bei deiser variante ergibt sich der genau 
gleiche
      s1[17]=s2[1];      //Effekt
      s1[18]=s2[2];
      s1[19]=s2[3];
      s1[20]=s2[4];
      s1[21]=s2[5];
      s1[22]=s2[6];
      s1[23]=s2[7];
      s1[24]='\0'; */

.
.
.
                   }

Autor: Johnny5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
forget it, gleicher Fehler wie vorhin, sorry

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.