2016-02-23 2 views
1

Цель этого кода заключается в том, что если пользователь вводит неверно отформатированный ввод, программа попросит пользователя повторить попытку. По какой-то причине, хотя в моем коде, зсапЕ постоянно пропускаются после первой итерации, в результате чего в бесконечном циклеScanf пропускается во время цикла, вызывая бесконечный цикл

#include <stdio.h> 
int main() { 
double A1; 
int n1, loopchck, i=0; 
while (i==0) { 
    printf("Enter a real number and inerger (A n): "); 
    fflush(stdin); 
    loopchck=scanf_s(" %lf %d", &A1, &n1); 
    if (loopchck == 2) { 
     i = 1; 
    } 
    else { 
     i = 0; 
    } 
} 
return 0; 
} 
+2

'fflush (stdin);' UB, удалить это. –

+2

в случае сбоя, вам нужно очистить stdin .... –

+1

Вы не вызываете стандартную функцию 'scanf', а вместо этого' scanf_s', которая должна быть настраиваемой функцией. Возможно, проблема связана с тем, что делает эта функция. –

ответ

0

Для начала, давайте думать о том, что вы хотите fflush(stdin); делать. fflush работает только с потоками, которые были записаны; он заставляет все неписанные (кэшированные) данные полностью записываться, и это не имеет смысла в контексте stdin.

Это распространенная ошибка. Когда вы скажете scanf, чтобы прочитать целое число (или плавающую точку, что угодно), он перестанет читать, когда он больше не видит ничего числового. Это означает, что, по крайней мере, вы, вероятно, оставите '\n'. Пользователь мог бы также ввести другой (ошибочный) ввод, который вы хотите отменить.

Идея отбрасывание ввода пользователем ужасно! Вы должны думать о принятии ввода в другой форме (например, используя argv в int main(int argc, char **argv)), чтобы сделать их неудобную жизнь более удобной.

Если вы не можете сделать это (или вы не хотите), вы можете использовать один из следующих фрагментов кода, чтобы отказаться от до (включительно) следующего '\n':

void fdiscardline(FILE *f) { 
    int c; 
    do { 
     c = fgetc(f); 
    } while (c != EOF && c != '\n'); 
} 

void fdiscardline(FILE *f) { 
    fscanf(f, "%*[^\n]"); 
    fgetc(f); 
} 

Вы должны использовать этот после свой вход, а не до. Кроме того, вам нужно подумать о том, что должно быть i. Должен ли он быть нулевым, когда можно считывать больше ввода (например, while (i==0)) или ноль, если ввод не был правильно прочитан? Вы должны быть последовательными, потому что это условие вашего цикла. Например:

#include <stdio.h> 
int main() { 
    double A1; 
    int n1, loopchck, i=0; 
    while (i==0) { 
     printf("Enter a real number and inerger (A n): "); 
     loopchck=scanf_s(" %lf %d", &A1, &n1); 
     fdiscardline(stdin); 
     if (loopchck == 2) { 
      i = 0; 
     } 
     else { 
      i = 1; 
     } 
    } 
    return 0; 
} 
Смежные вопросы