Hilfe, aufeinmal spinnt die gets() funktion
-
Hallo zusammen,
wollte mir ebenmal spaßeshalber ein Programm schreiben, das zwar keinen Sinn macht aber alles bisher gelernte benötigt.
Nun ich bin leider nicht weit gekommen,denn irgendwie spinnt aufeinmal die gets()Funktion...
Das Programm tut so, als ob es gets() garnicht gibt, kann mir jemand helfen woran das liegen könnte?
Ich habe Hier mal ein bisschen Code von dem Programm das nicht funktioniert:#include <stdio.h> #include <string.h> void main (void) { char name [50]; char vor_name [20]; char zu_name [30]; int geschlecht, b, c; 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: "); gets(name); puts(name); }while (1); }
Hier z.B hat es ohne Probleme funktioniert:
#include <stdio.h> int stril (char string []); void main(void) { char string [80]; int laenge; char ende; do { printf("\n\n\tGeben Sie bitte bis zu 79 Zeichen ein, und druecken Sie dann RETURN\n\t"); gets (string); printf("\tKontrolle:\n\t"); puts (string); laenge = stril (string); printf("\tDie Länge des Strings beträgt %3d Zeichen", laenge); printf("\n\n\tEnde mit 'e' sonst weiter "); ende = getchar(); printf("\n\n\n"); }while (ende != 'e'); }
Was auch sehr komisch ist, das mein Compiler bei jedem Programm indem ich die gets() Funktion benutze meckert..
und zwar :main.c: In function ‘main’:
main.c:6: warning: return type of ‘main’ is not ‘int’
/tmp/ccmEdQ08.o: In functionmain': main.c: (.text+0x6a): warning: the
gets' function is dangerous and should not be used.Freue mich auf jede Antwort
Bei Fragen einfach fragen
Mfg StrigeAchso, falls das wichtig sein sollte, ich programmiere unter Linux und benutze den gcc version 4.2.1 von SuseLinux
-
Wer lesen kann, ist klar im Vorteil sagt man. Hast du die Fehlermeldung (in diesem Fall Warnungen) gelesen?
main.c:6: warning: return type of ‘main’ is not ‘int’
Auf Deutsch: Die 'main'-Funktion is von Tyo int, nicht void!
main.c: (.text+0x6a): warning: the `gets' function is dangerous and should not be used.
Aus Deutsch: Nimm gets nicht, da die Funktion nicht sicher ist. Um aus stdin zu lesen gibt es man: fgets(3).
-
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.