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); } //************************************************
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!
@ 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
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.
> 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.
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
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
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'; */ . . . }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.