"leere" eingabe akzeptieren?
-
hallo,
ich frage per scanf()-befehl den user nach z.B. einem namen.Ich würde nun aber gerne auch die leere eingabe akzeptieren, sprich
wenn der user bei der frage:Bitte Namen eingeben:
einfach ENTER drückt, dass halt dann scanf() nichts abspeichert, sondern einfach im programm weiter gemacht wird.
Allerdings geht das halt nicht damit, oder ich weiss nicht wie.
Wenn man ENTER drückt, dann springt einfach das blinkende Eingabekästchen eine Zeile weiter runter, aber scanf() wartet noch immer auf eine Eingabe..
Wie kann ich das realisieren?
Andere Funktion? Dankeschön :xmas1:
-
scanf("%[^\n]s", test);
So geht das.
und frohe Weihnachten. :xmas1:
-
cool danke!
wieso wird sowas bei meinem tutorial nicht bei der einführung von scanf() erwähnt?
hast du vllt. einen tipp für ein gutes open book?
ich benutze "C von a bis z" und find's eigentlich ganz gut, aber es kratzt nur überall an der oberfläche und geht halt nicht so krass auf die dinge ein..
any tips?
dankeschön :xmas2:
-
fgets
-
sorry leute,
ich habe etwas voreilig geantwortet.
in der tat kann man bei
printf("Dein Vorame: "); scanf("%[^\n]s",vorname);
nur enter drücken. allerdings, wenn ich dann eine weitere abfrage machen will, in der man auch nur enter drücken kann:
printf("Dein Nachname: "); scanf("%[^\n]s",nachname);
dann springt er da auch automatisch weiter, man kann also gar keinen nachnamen mehr eingeben, weil er da gar nicht mehr auf eine Eingabe wartet...
Wenn ich das [^\n] aber beim nachnamen rausnehme, dann geht es.
so wie ich C inzwischen kennen und hassen gelernt habe, liegt das wieder an einer fehlenden Null-Terminierung, oder so? :xmas2:
Naja, also, wie kann ich das machen?
ps: den tipp mit "fgets" habe ich übrigens nicht übersehen. danke dafür, aber ich möchte erstmal scanf() genauer kennenlernen
-
#include <stdio.h> int main() { char vorname[255]; char nachname[255]; printf("Dein Vorname: "); fgets(vorname, sizeof(vorname), stdin); fflush(stdin); printf("Dein Nachname: "); fgets(nachname, sizeof(nachname), stdin); fflush(stdin); printf("\n\nDeine Eingabe:\nVorname: '%s'\n\nNachname: '%s'\n", vorname, nachname); return 0; }
So oder so ähnlich würds wohl mit fgets gehen
-
Ich wette das fflush(stdin); haste geschrieben um uns zu ärgern
-
getline schrieb:
Ich wette das fflush(stdin); haste geschrieben um uns zu ärgern
allerdings
hab schon fflush(stdin) nach scanf gesehen, aber nach fgets
PS: es fehlt ein :kopfschüteln-smiley:
-
nach jedem scanf ein
while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
FAQ
-
Ich verstehe die Aufregung um fflush nicht. Ich hab das auch so gelernt bekommen, also mit fflush nach dem scanf. Ok vll bekomme ich damit Probleme auf einem anderen Betriebssystem, aber ich muss ja sowieso dann das Programm fast komplett auseinandernehmen und neu schreiben. Oder liege ich da falsch. Bitte diesen Post nicht falsch auffassen, mich interessiert das halt einfach, vorallem weil man mir das eben auch mit fflush(stdin) beigebracht hat...
-
1. Les die FAQ zu fflush durch!
2. Das Verhalten von fflush bei Anwendung auf einen _Eingabestrom_ ist undefiniert. Du kannst dich also in keiner Umgebung darauf verlassen, das sich das Programm wie gewünscht verhält.
-
okay soweit sogut.
aber nun ne frage: kann es sein, dass das nur bei strings so richtig geht?
seht euch das mal an, was bei mir jetzt passiert:
#include <stdio.h> int main(void){ char name[10] = "NULL"; char nachname[10] = "NULL"; int alter = 0; int c; printf("Name vor scanf: %s\n",name); printf("Name eingeben: "); scanf("%[^\n]s",name); while ((c = getchar()) != EOF && c != '\n'); printf("Name nach scanf: %s\n\n",name); printf("Nachname vor scanf: %s\n",nachname); printf("Nachname eingeben: "); scanf("%[^\n]s",nachname); while ((c = getchar()) != EOF && c != '\n'); printf("Nachname nach scanf: %s\n\n",nachname); printf("Alter vor scanf: %d\n",alter); printf("Alter: "); scanf("%[^\n]d",&alter); while ((c = getchar()) != EOF && c != '\n'); printf("Alter nach scanf: %d\n",alter); return 1;}
Ich rufe das Programm auf und gebe bei Name "Thomas" ein, und bei Nachname "Müller", und bei Alter "21". Meine Ausgabe:
Name vor scanf: NULL Name eingeben: Thomas Name nach scanf: Thomas Nachname vor scanf: NULL Nachname eingeben: Müller Nachname nach scanf: Müller Alter vor scanf: 0 Alter: 21 Alter nach scanf: 12594
Vielleicht hilft euch folgendes, leichteres Beispiel, schneller zu erkennen was der Compiler da tut:
Alter vor scanf: 0 Alter: 1 Alter nach scanf: 51
edit: es hat sicherlich etwas mit dieser warnung zu tun, die ich kriege:
test.c:24: warning: format ‘%[^ ’ expects type ‘char *’, but argument 2 has type ‘int *’
-
lass doch beim alter den code einfach so wie er war
printf("Alter vor scanf: %d\n",alter); printf("Alter: "); scanf("%d",&alter); printf("Alter nach scanf: %d\n",alter);
-
ich möchte aber auch, dass man dort nichts eingeben kann.
okay das hier ist ein doofes beispiel, aber ich habe hier ein programm, das standart-einstellungen hat, und nur wenn man etwas eingibt wird etwas verändert.
wenn man nichts verändern will, und die standarteinstellung hernehmen möchte, soll man einfach nur enter drücken können.und viele abfragen beziehen sich halt auf variablen vom datentyp int und double.
ist scanf() hier am ende seiner kapazitäten, und ich muss nun umsteigen auf andere funktionen?
oder kriegt man das mit irgendwelchen tricks hin?edit:
nach 3 mal edit bleibt die alte frage..
wollte das über nen string machen und dann casten.
aber man kann ja nur chars in int casten und keine kompletten strings. oder doch?
-
Les es als String ein und verwende dann sscanf um aus dem eingelesenen String die Zahl zu extrahieren oder nimm eine Funktion wie strtol mit der du auch eine Zahl aus einem String bekommen kannst.
-
Okay vielen Dank! :xmas1: :xmas1: