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


von Johnny5 (Gast)


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);
                       }
//************************************************

von Stefan (Gast)


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!

von Johnny5 (Gast)


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

von Paule (Gast)


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.

von Karl H. (kbuchegg)


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.

von Karl heinz B. (kbucheg)


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

von Stefan (Gast)


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

von Johnny5 (Gast)


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'; */

.
.
.
                   }

von Johnny5 (Gast)


Lesenswert?

forget it, gleicher Fehler wie vorhin, sorry

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.