C: повторение цикла "слишком много!" - PullRequest
0 голосов
/ 07 марта 2011

У меня есть маленькая программа, которая сбивает меня с толку.Я пытаюсь использовать цикл для получения ввода от пользователя.Если ввод неправильный, он повторяется снова, но если он правильный, он завершается.Фрагмент кода: </p> <pre><code>void main() { char user_status; // Checks User Status q = Quiz Master and p = Participant int valid_status = '0'; // Checks If User Status Is Valid Or Not. Used In Some Loops. 0 = Invalid, 1 = Invalid. printf("Welcome to General Knowledge Quiz Management System.\nThis application has been designed to help you conduct a quiz or test your GK."); do { user_status = '0'; printf("\n\nPlease enter your role.\nQuiz Master = \'q\'\nParticipant = \'p\'\n"); scanf("%c", &user_status); if (user_status == 'q'|| user_status == 'Q') { printf("Initializing Quiz Master Segment\n\n________________________________\n"); initiate_qm(); valid_status = '1'; } else if (user_status == 'p' || user_status == 'P') { printf("Initializing Participant Segment"); initiate_pa(); valid_status = '1'; } } while (valid_status != '1') printf("\nProgram Will Exit Now. Press Any Key To Return To Windows."); getch(); }

Я ожидаю такой вывод:

Please Enter Your Role 
Quiz Master = 'q' 
Participant = 'p'

До сих пор он работает отлично.Когда я ввожу q / Q / p / P, это прекрасно работает.Но когда я ввожу что-то неправильно, это не дает требуемого вывода.

Например, если я введу «abc», я должен снова получить приведенный выше текст с просьбой ввести q или p.Но вместо этого я получаю это:

 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p' 
 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p'
 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p'
 Please Enter Your Role 
 Quiz Master = 'q' 
 Participant = 'p'
 _ (I have to input here)

Теперь, почему это повторяется еще 3 раза.Интересно отметить, что если я ввожу что-то длиной 2 символа, оно повторяется еще 2 раза, а если я оставляю это поле пустым (просто нажимаю клавишу возврата), оно не повторяется.

Я должениспользовать только C. Я использую Visual C ++ 2010 для компиляции.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 07 марта 2011

Потому что вы дали scanf три символа для обработки. Он удаляет первый первый символ при первом вызове scanf, получая «a», но в буфере stdin все еще остается «bc».

Вам нужно проверить остатки в буфере, прежде чем снова искать ввод. И я бы избегал очистки буфера stdin, потому что это неопределенное поведение. (http://www.gidnetwork.com/b-57.html)

Вы можете прочитать оставшиеся символы и отбросить их с помощью

do{  
    scanf("%c", &user_status);  
}while(user_status!='\n'); //This discards all characters until you get to a newline

сразу после прочтения нужного вам символа.

1 голос
/ 07 марта 2011

Вы хотите

do
{

} while (condition);

Когда вы забыли точку с запятой, вы получите:

do
{
    ....
}

while(condition)
    do something else;

Вы могли заметить это, просто сделав отступ в коде в редакторе.как я сделал с вашим вопросом.

Также, когда вы делаете scanf, вы должны включить \n в спецификацию формата.

0 голосов
/ 07 марта 2011

Прежде всего, # include <stdio.h> и используйте getc(stdin), чтобы получить персонажа.Это поможет вам предотвратить перемещение курсора и размещение ненужных символов в консоли.Во-вторых, напишите приветственное сообщение перед циклом.

...