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.
_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
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
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 –