2017-01-25 4 views
0

Sorry für die dumme Art zu fragen, aber ich weiß nicht, wie ich es technisch sagen soll.Wie mache ich mein Programm "vergessen" die Buchstaben, die ich auf der Tastatur gedrückt habe?

Mein Programm ist ein Tipptraining. Ich möchte einen Ton machen, wenn der vom Benutzer geschriebene Buchstabe (userWord [i], erhalten von der Tastatur mit getch()), nicht derselbe ist wie der entsprechende Buchstabe von dem Wort, das ich ihm gebe (filas [maxIndex] [i]). Mein Code funktioniert gut, außer, wenn ich zum Beispiel "Hallo" sage und er "heklo" schreibt, weil er sehr schnell schreibt, wird der Fail Sound 3 mal abgespielt (für k, l, o). Ich möchte irgendwie den Puffer der Tastatur freigeben (ich denke, das ist die technische Art zu sagen "vergiss die Buchstaben, die ich gedrückt habe"), damit der Benutzer sein Wort ohne die Wörter "k", "l", "o" erneut schreiben kann 'gespeichert und als userWord [i] genommen habe ich versucht fflush, funktioniert aber nicht.

ich Visual Studio bin mit

printf("\n\n%s\n", filas[maxIndex]); //Here it prints "Alba" 

    cont = 1; 

    while (cont == 1) { 
     i = 0; 
     while (userWord[i] != ' ') { // the user presses space to make the program know he has completed his word and wants to go to the next one 

       while (!kbhit()) {} 
       fflush(stdin); //I believe this should free the keyboard buffer? 
       userWord[i] = getch(); 
       printf("%c", userWord[i]); //prints each letter the user writes each time the loop is executed, then he presses space to exit 


      if (userWord[i] != filas[maxIndex][i]) { 

       PlaySound(TEXT("failSound.wav"), NULL, SND_SYNC); //MY PROBLEM 
       cont = 1; 
       Sleep(8); 
       printf("\n"); //now the user should start writing his word again from the beginning 
       break; 
      } 
      else if (filas[maxIndex][i + 1] == '\0') { 
       cont = 0; 
       i++; 
       break; 
      } 
      else { cont = 0; } 

      i++; 
     } 
     if (cont == 0) { 
      userWord[i] = '\0'; 

      if (length != length2) { //calculated before, but irrelevant to my problem 
       cont = 1; 
       Sleep(8); 
       printf("\n\n%s\n", filas[maxIndex]); 
      } 
     } 
    } 

    if (cont != 3) { 

     while (!kbhit()) {} 
     option = getch(); // if option = '2' the user closes the program and if it equals ' ' the next word if obtained with a function and the loop begins again. 
    } 
    } 

Mein Problem ist, dass, wenn er Typen schnell, weil er bald beenden will, wird er einen Rechtschreibfehler machen (schreibt „Akba“ anstelle von „Alba“) und FailSound spielt 3 mal. Ich möchte etwas machen, um den Rest der Benutzereingaben zu ignorieren, wenn er den Fehler macht, aber ich weiß nicht, wie ich es machen soll.

+0

_Note_: ich hier falsch sein könnte (ich weiß nicht gerade eine _Win_ Box zu testen), aber ich denke, Sie sollten ein 'Sleep (1) hinzuzufügen; 'Anweisung in der' while (! kbhit()) 'Schleife, sonst wird das Programm einen Ihrer Prozessoren töten, wenn der Benutzer nichts drückt. – CristiFati

+0

Leider kann ich das Problem in der Beschreibung nicht mit dem bereitgestellten Code verknüpfen. 1: Die Anweisung 'break' verlässt die Schleife __outer__ (im Gegensatz zu dem, was im Kommentar steht). Auch "i" wird nicht inkrementiert, so dass der Code auf dem gleichen Zeichen der Arrays arbeitet. Wie soll es sich auch verhalten, wenn der Benutzer die falsche Sequenz langsam drückt? _Note_: Anstatt die (ungültigen?) Zeichen zu "vergessen", könntest du sie selbst verwerfen (indem du sie nicht in 'userWord' steckst) – CristiFati

+0

Ich habe den Code hoffentlich geändert, jetzt kannst du ihn verstehen, sorry für den vorherigen Mangel an Informationen . Nun, wie könnte ich die Zeichen selbst verwerfen? Ich komme nicht mit einer Idee, weil sie wie erinnert werden ... Ich weiß nicht, sie sind nicht Teil von userWord noch, bis ich die getch() erreiche, aber dann bekommt sie sie ... @ CristiFati –

Antwort

0

Sie versuchen, Low-Level-Konio-Eingabefunktionen zu mischen, die Tastatureingaben direkt mit STDIO-Ebenen höherer Ebene verarbeiten, die auf einem gefilterten Eingabepuffer arbeiten, der nur verfügbar ist, nachdem eine Rückgabe erzielt wurde.

Das bedeutet, dass Ihre fflush(stdin), wie von @PaulR erklärt, in diesem Zusammenhang nutzlos ist, und sollte als nicht Standard vermieden werden.

Sleep unterbricht das Programm für den Eingabewert als Millisekunden. Was mich betrifft, kann ich in 8 ms nichts machen! So der erste Teil könnte Ihre Schleife werden:

while (userWord[i] != ' ') { // the user presses space to make the program know he has completed his word and wants to go to the next one 

      /*while (!kbhit()) {} 
      fflush(stdin); // All this is useless */ 
      userWord[i] = getch(); // get next char from keyboard 
      printf("%c", userWord[i]); //prints each letter the user writes each time the loop is executed, then he presses space to exit 


     if (userWord[i] != filas[maxIndex][i]) { 

      PlaySound(TEXT("failSound.wav"), NULL, SND_SYNC); //MY PROBLEM 
      cont = 1; 
      // Sleep(8); useless 
      printf("\n"); //now the user should start writing his word again from the beginning 
      while (kbhit) { getch(); } // empties keyboard event queue 
      break; 
     } 
+0

Das hat für mich funktioniert, danke. Allerdings habe ich auf einer anderen Website gelesen, dass, wenn ich ** ** ich könnte in meinem Code "bdos" (0xC, 0, 0) schreiben; 'und dies würde de BIOS Tastaturpuffer löschen. Empfiehlst du das zu benutzen?Da ich ziemlich programmieren bin, weiß ich nicht, ob eine falsche Verwendung "gefährlich" wäre @SergeBallesta –

+0

Puh ... 'bdos (0xc, 0, 0)'! Haden't rohe BIOS-Aufrufe seit Jahrzehnten nicht gesehen ... Nun weiß ich nicht ob es in der Windows Konsolenanwendung unterstützt wird, also kannst du es einfach ausprobieren. Aber ich würde vermeiden, etwas auf einer niedrigeren Ebene zu verwenden, die ... –

Verwandte Themen