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! 😉 👍


Anmelden zum Antworten