Hilfe, aufeinmal spinnt die gets() funktion
-
Hi,
kannst du englisch? steht doch alles da:
main.c: (.text+0x6a): warning: the `gets' function is dangerous and should not be used.
'gets' ist gefährlich und sollte nicht verwendet werden.Warum? Weil ein Pufferüberlauf sehr einfach möglich ist mit gets.
Benutze lieber fgets mit stdin, da kannst du die Anzahl der Zeichen, die gelesen werden sollen, mit angeben.
Beispiel:#define MYBUFSIZE 64 /* buffer-groesse */ /* ... */ char mybuf[MYBUFSIZE] memset(mybuf, 0, MYBUFSIZE); /* alle bytes auf 0 setzen */ fgets(mybuf, MYBUFSIZE, stdin); /* maximal 64 zeichen einlesen */
stell dir vor, du nutzt gets und der benutzer deines programms gibt 80 zeichen ein. dann wird bis zur speicherstelle mybuf+79 geschreiben, obwohl bei mybuf+63 schluss ist. gesund ist das nicht. für genauere infos zum Buffer-Overflow kannst du ja google bemühen.
Und bitte schreibe
int main(void)
und am Ende
return (0);
. void main gibt es nicht!
-
mmh komisch, mache bei der SGD den Kurs zum C/c++ Programmierer und und dort habe ich von anfang an mit
void main(void)
gelernt...
andere Programme funktionieren ja auch mit
void main...
auch
gets()
funktionierte bis jetzt immer, und in den Übungsaufgaben hatte sie einwandfrei funktioniert..
Das zweite Beispiel das ich euch gegeben hatte, habe ich auch mit void main geschrieben und da hat gets ohne Probleme funktioniert und die Compilerwarnungen waren die selben...
und fgets hatte ich bisher noch nicht... naja egal...
also auf deutsch bedeutet es, das ich mit fgets() den String holen soll,
kann mir jemand ein Beispiel für die funktion geben?Das wäre sehr hilfreich dür mich
Mfg Strige
-
Ah, war zu langsam :-)))
Danke für das Beispiel werde ich gleich testen
Danke
-
strige schrieb:
mmh komisch, mache bei der SGD den Kurs zum C/c++ Programmierer und und dort habe ich von anfang an mit
void main(void)
gelernt...
dann hat der Dozent dir Schei.sse erzählt. Kommt in Deutschland sehr oft vor.
strige schrieb:
auch
gets()
funktionierte bis jetzt immer, und in den Übungsaufgaben hatte sie einwandfrei funktioniert..
super Einstellung, so kommt sicherlich im Leben weiter! Klar kann ich ein Auto mit angezogener Handbremse fahren, dem Auto wird es aber nicht gut tun...
strige schrieb:
also auf deutsch bedeutet es, das ich mit fgets() den String holen soll,
kann mir jemand ein Beispiel für die funktion geben?RTFM! man: fgets(3)
-
#include <stdio.h> #include <string.h> int main (void) { int geschlecht, b, c; char name123 [64]; char vor_name [20]; char zu_name [30]; do { printf("\n\n\n\t\t\t\t\t\t\t\tHallo!\n"); printf("\n\t\t\t\t\tBitte beantworte mir zunächst ein paar Fragen:\n\n"); printf("\t\t\t\t\tWelches Geschlecht? 1 - weiblich 2 - männlich:\t"); scanf("%d", &geschlecht); printf("\n\n\t\t\t\t\t Wie lautet dein Name??\n"); printf("\t\t\t\t\t Bitte Vor- UND Nachname eingeben: "); memset (name123, 0, 64); fgets (name123, 64, stdin); puts(name123); }while (1); return (0); }
Ist das so ok? Der witz ist, es funktioniert immer noch nicht, habe halt keine Compiler Warnungen mehr.
Lasst euch Zeit, werde erst morgen wieder schreiben, Meine Frau meckert schon
Danke trotzdem für eure Hilfe
Mfg
Strige
-
strige schrieb:
mmh komisch, mache bei der SGD den Kurs zum C/c++ Programmierer und und dort habe ich von anfang an mit
void main(void)
gelernt...
kann ich mal den namen und die telefonnummer oder die emailadresse des verantworlichen bekommen?
-
*g* einfach mal www.sgd.de
dort kannst dir sogar ne Probelektion.pdf durchlesen... muss jetzt aber gehen bis morgen!!
-
strige schrieb:
Ist das so ok? Der witz ist, es funktioniert immer noch nicht, habe halt keine Compiler Warnungen mehr.
code sieht gut aus (wobei ich persönlich scanf und fgets nicht mischen würde). Daher weiß ich nicht, was du mit "funktioniert immer noch nicht" meinst. Was funktioniert denn nicht?
-
supertux schrieb:
strige schrieb:
mmh komisch, mache bei der SGD den Kurs zum C/c++ Programmierer und und dort habe ich von anfang an mit
void main(void)
gelernt...
dann hat der Dozent dir Schei.sse erzählt. Kommt in Deutschland sehr oft vor.
lol
-
Aber das Kursziel sagt doch schon alles, oder? "C/C++-Programmierer", das ist wie "Taxi/Omnibusfahrer"
-
LordJaxom schrieb:
"C/C++-Programmierer", das ist wie "Taxi/Omnibusfahrer"
wenn C das taxi ist, dann ist C++ eine droschke mit rennreifen, spoilern und verchromten pedalen.
-
Das fgets() wird noch komplett übersehen.. das selbe problem wie oben bei gets()
-
fricky schrieb:
LordJaxom schrieb:
"C/C++-Programmierer", das ist wie "Taxi/Omnibusfahrer"
wenn C das taxi ist, dann ist C++ eine droschke mit rennreifen, spoilern und verchromten pedalen.
Jo, und das Taxi hat keine Gurte und Spikes auf dem Lenkrad und an den Rücksitzen und ist aus Balsaholz gebaut, während die Droschke Airbags und Seitenaufprallschutz hat und aus Titanstahl gebaut ist.
-
mmh, was wollt ihr mir damit sagen?
entweder man lernt c oder c++??? Leider hilft mir das bei meinem problem auch nicht weiter...geht mal davon aus das ich momentan noch alles in c schreibe
-
Um auch mal wieder was produktives loszulassen:
Das Problem ist, dass Du mit scanf("%s,...") nur ein Wort einliest, keine ganze Zeile. Dadurch bleibt das Return im Tastaturpuffer. Das nun folgende fgets liest Zeichen von der Tastatur bis zum Return. Da Return das erste Zeichen im Tastaturpuffer ist, hat fgets sofort eine (für ihn) komplette Zeile gelesen ohne überhaupt auf Eingaben zu warten.
Eine mögliche Lösung dafür wäre, fgets und scanf nicht zu vermischen. Eine andere wäre, nach jedem scanf den Tastaturpuffer zu leeren, etwa indem man mit fgets eine Zeile liest und diese dann verwirft.
-
ah ok, das kann natürlich sein, denn wenn ich gerade so zurückdenke, fällt mir auch auf, das ich
scanf()
nicht benutzt habe als ich mit
gets()
probiert habe, und dafür mit sscanf()....
aber wenn ich das richtig verstehe müsste es doch dann mit fgets()funktionieren? oder was bedeutetmemset()
dachte das sei um den Puffer wieder auf Null zusetzen...
Naja, aufjedenfall werde ich es mal kurz probieren... Danke Dir.
-
So habe nun scanf() mit fgets() ersetzt, funktioniert!!! Hurra!! Danke euch...
Bis zum nächsten Problem..
Vlg Strige
-
strige schrieb:
oder was bedeutet
memset()
dachte das sei um den Puffer wieder auf Null zusetzen...
Naja, aufjedenfall werde ich es mal kurz probierenäh... http://cppreference.com/stdstring/memset.html
Puffer im Sinne von Array: ja. Puffer im Sinne des Tastaturpuffers: nein.
-
Ah ok, Danke habe eben auch bisschen probiert und gemerkt wenn ich den Tastaurpuffer nach scanf() lösche funktionierts auch, aufeinmal ist wieder alles so einfach komisch gell?
...
Werde jetzt bisschen mit meinem Sohn spazieren gehen, melde mich später nochmal..
Danke für die zahlreichen Antworten
bis dann