2015-10-24 16 views
-3

Мой код выглядит следующим образом:инструкция "scanf" не выполняется?

int main(int argc, char **argv) 
{ 

int quit=1; 
int operation; 
paintUI(); 
init(); 
while(quit) 
{ 
    printf("please input a operation code:"); 
    scanf("%d",&operation); 
    switch(operation) 
    { 
     case 1:addBook();break; 
     case 2:deleteBook();break; 
     case 3:borrowBook();break; 
     case 4:backBook();break; 
     case 5:printAll();break; 
     case 6:printAllBorrowed();break; 
     case 7:findByNameAdapter();break; 
     case 8:findByNumberAdapter();break; 
     case 9:save();quit=0;break; 
     case 0:system("cls");paintUI();break; 
     default:printf("input error\n");break; 
    } 
} 
return 0; 
} 

, когда вход в целое число к «операции», код работает well.But, когда я ввести символьное значение на цели, код будет пойман в бесконечный цикл и напечатайте «входную ошибку» все время.Когда я отлаживаю, я обнаружил, что после ввода значения char для цели оператор «scanf» («% d», &) не выполняет больше, поэтому Код операции всегда неверный. Кто-нибудь скажет мне добавить инструкцию «fflush (stdin);», чтобы очистить входной кеш и решить эту проблему. Но почему, когда я ввожу неправильный код операции целого кода, код может работать хорошо даже хотя я не добавляю утверждение «fflush (stdin)».

+0

Попробуйте «int countOfScaned = scanf («% d », & operation)' –

+0

Просто прочитайте строки. Это намного надежнее ... –

+0

DCV 'cos no aparrent отладка. –

ответ

1

Вы должны проверить return из scanf -

int c; 
if(scanf("%d",&operation)==1){   //will return 1 if integer is entered 
    switch(operation) 
    { 
    case 1:addBook();break; 
    case 2:deleteBook();break; 
    case 3:borrowBook();break; 
    case 4:backBook();break; 
    case 5:printAll();break; 
    case 6:printAllBorrowed();break; 
    case 7:findByNameAdapter();break; 
    case 8:findByNumberAdapter();break; 
    case 9:save();quit=0;break; 
    case 0:system("cls");paintUI();break; 
    default:printf("input error\n");break; 
    } 
    while((c=getchar()!='\n') && c!=EOF); 
} 

Итак, scanf терпит неудачу, если вы вводите символ и getchar также очистить stdin.

+0

Примечание: 'while (getchar()! = '\ N');' бесконечный цикл должен 'stdin 'закрывайся. – chux

+0

@chux Если встречается 'EOF', это будет бесконечный цикл, правильно? Должен ли я также проверять «EOF»? – ameyCU

+0

Да, проблема с EOF. Классическое решение - 'int ch; while ((ch = getchar())! = '\ n' && ch! = EOF); ​​'. Тем не менее повышение более высокого уровня заключается в том, чтобы не использовать 'scanf()' вообще, buf 'fgets()'. – chux

Смежные вопросы