2016-11-20 3 views
1

Пользователь имеет только два варианта: «a» или «b», если пользовательский ввод не является «a» или «b», сообщение об ошибке должно побуждать их вводить только «a» или «a», б.Проверка ввода: проверка нескольких значений

ХОРОШЕЕ: Я ввожу букву «a», и она обходит цикл while.

THE BAD: Когда я вхожу в 'b', он не обходит цикл while?

Любые предложения по исправлению этого вопроса?

#include <stdio.h> 
int main(void) 
{ 
    char c; 

    printf("enter a or b to make it out!\n"); 

    //loop if answer is NOT a or b 
    while ((c = getchar() != 'a') && (c = getchar() != 'b')) 
    { 
     //let the user know there has been a problem! 
     printf("That value is invalid"); 
     printf("\nPlease enter a or b:\n"); 
     fseek(stdin,0,SEEK_END); 
    } 

    printf("You made it out!"); 
    return 0; 
} 
+0

Читает два символа, потому что вы звоните 'getchar' дважды. Вы в конечном итоге захватываете символ новой строки '\ n'. Поэтому, когда вы вводите a, 'c = getchar()! = 'A'' оценивается как false, и он пропускает цикл (я думаю, что пропускаю второе условие также из-за короткого замыкания). Но когда вы вводите b, ''b'! = 'A'' и' '\ n'! = 'B'', то он входит в цикл while. Кроме того, я уверен, что это выполняется как 'c = (getchar()! = 'A')', что, по-видимому, не то, что вы ожидаете. –

+0

Спасибо, Милли! –

ответ

1

Всякий раз, когда вы делаете getchar() _на другую_ символ читается. Таким образом, вы должны изменить цикл while, как

while (((c = getchar()) != 'a') && (c != 'b')) 

В противном случае, когда условие c = getchar() != 'b' проверяется, с будет \n.

Более того, вы должны получить это \n в пути. Таким образом, вы можете добавить еще getchar() в свой цикл while, возвращающее значение, которое вам не нужно использовать.

+0

Спасибо, эликацис! –

1

Несколько проблем:

  • c = getchar() != 'a' не сохраняет характер чтения в c, он читает и отбрасывает характер и сохраняет результат сравнения в c.

  • Вы должны проверить значение прочитанного символа вместо чтения второго символа.

  • Вы должны также проверить на конец, если файл, и использовать int, чтобы для всех значений unsigned char и специального значения EOF.

  • перематывать stdin читать далее байты не будут производить то, что вы ожидаете: либо он преуспевает, и вы будете перечитывать одни и те же байты, или он может потерпеть неудачу stdin небуферизован и привязан к устройству.

Попробуйте это:

#include <stdio.h> 

int main(void) { 
    int c; 

    printf("enter a or b to make it out!\n"); 

    //loop if answer is NOT a or b 
    while ((c = getchar()) != EOF && c != 'a' && c != 'b') { 
     //let the user know there has been a problem! 
     printf("That value is invalid"); 
     printf("\nPlease enter a or b:\n"); 
    } 
    printf("You made it out!\n"); 
    return 0; 
}