Probleme mit dem Inputbuffer
-
Hi, ich habe leider immer noch Probleme mit dem Inputbuffer von der Tastatur.
fflush(stdin);
und eine Zischenvariable
char buffer[100]; ... fgets(buffer, 100, stdin); sscanf(buffer, "%d", &abfrage);
funktionieren leider nicht so wie sie sollten. Bei einer Eingabe mit "fgets" oder "scanf" wird meist ein Wert vom Inputbuffer eingefügt (z.B. \n oder so). Gibt es da noch eine Lösung?
-
1. fflush(stdin) ist undefiniert (siehe FAQ)
2. fgets liest \n einfach mit. mit buffer[strlen(buffer)]=0; schneidest du das \n ab. Bei sscanf musst du einfach nur den richtigen Formatierungsstring angeben "%s\n"
-
kingruedi schrieb:
1. fflush(stdin) ist undefiniert (siehe FAQ)
2. fgets liest \n einfach mit. mit buffer[strlen(buffer)]=0; schneidest du das \n ab. Bei sscanf musst du einfach nur den richtigen Formatierungsstring angeben "%s\n"Zu 1: Das ist klar.
Zu 2: Das probiere ich jetzt mal.
-
kingruedi schrieb:
1. fflush(stdin) ist undefiniert (siehe FAQ)
2. fgets liest \n einfach mit. mit buffer[strlen(buffer)]=0; schneidest du das \n ab. Bei sscanf musst du einfach nur den richtigen Formatierungsstring angeben "%s\n"Frage: Warum ist fflush(stdin) eigentlich undefiniert? Wäre doch imho sehr einfach zu implementieren.
Ist es unter UNIX auch undefiniert wenn ich stdin umgeleitet habe? Also mit dup(0) + open()?
MfG SideWinder
-
Hi kingruedi, kannst du mir das bitte noch mal an einem Beispiel zeigen, meins will nicht so wie ich es gerne hätte.
char buffer[100]; ... printf("\n\nSo, jetzt machen wir ein Quiz, oder so!\n\n"); printf("\nVon welcher Firma ist Windows?\n"); fgets(buffer, 100, stdin); buffer[strlen(buffer)]=0; sscanf(buffer, "%s", &antwort1[0]); if((strcmp(richtig1, antwort1)) == 0) printf("\nRICHTIG!\n"); else printf("\nLeider flasch!\n\n");
-
char buffer[100]; ... printf("\n\nSo, jetzt machen wir ein Quiz, oder so!\n\n"); printf("\nVon welcher Firma ist Windows?\n"); fgets(buffer, 100, stdin); buffer[strlen(buffer)]=0; /* das macht fgets bereits für dich, und zwar direkt nach dem letzten zeichen der eingabe, und nicht erst am ende von buffer */ sscanf(buffer, "%s", &antwort1[0]); /* warum der umweg über sscanf? if((strncmp(richtigl,antwort,strlen(antwort)-1)==0)) */ if((strcmp(richtig1, antwort1)) == 0) printf("\nRICHTIG!\n"); else printf("\nLeider flasch!\n\n");
-
stahl schrieb:
char buffer[100]; ... printf("\n\nSo, jetzt machen wir ein Quiz, oder so!\n\n"); printf("\nVon welcher Firma ist Windows?\n"); fgets(buffer, 100, stdin); buffer[strlen(buffer)]=0; /* das macht fgets bereits für dich, und zwar direkt nach dem letzten zeichen der eingabe, und nicht erst am ende von buffer */ sscanf(buffer, "%s", &antwort1[0]); /* warum der umweg über sscanf? if((strncmp(richtigl,antwort,strlen(antwort)-1)==0)) */ if((strcmp(richtig1, antwort1)) == 0) printf("\nRICHTIG!\n"); else printf("\nLeider flasch!\n\n");
So, nachdem ich mal die eine IF Zeile umgeschrieben habe, sieht sie jetzt so aus:
if(strcmp(richtig1,antwort1[strlen(antwort1)-1])==0)
Wenn ich das Programm jetzt ausführe, bekomme ich leider nur noch ein Speicherzugriffsfehler.
-
über "antwort" hast ja auch noch nichts verraten..
[cpp]
char *richtig="linux";
char antwort[100];fgets(antwort,sizeof(antwort),stdin);
// solltest strncmp verwenden, das hat hier sogar den praktischen
// vorteil, dass nur soviele zeichen in strlen verglichen werden, wie
// der user tatsächlich eingegeben hat, und nicht komplett strlen(antwort)
if((strncmp(richtig,antwort,strlen(antwort)-1) == 0))
else
[/cpp]wo ist nur buffer geblieben?
-
stahl schrieb:
über "antwort" hast ja auch noch nichts verraten..
[cpp]
char *richtig="linux";
char antwort[100];fgets(antwort,sizeof(antwort),stdin);
// solltest strncmp verwenden, das hat hier sogar den praktischen
// vorteil, dass nur soviele zeichen in strlen verglichen werden, wie
// der user tatsächlich eingegeben hat, und nicht komplett strlen(antwort)
if((strncmp(richtig,antwort,strlen(antwort)-1) == 0))
else
[/cpp]wo ist nur buffer geblieben?
Jep, es geht, vielen Dank!