2015-10-06 4 views
0

Я пытался создать простую программу для изменения базы числа (i, e я даю основания 2 и 5, а число 101 и я должно получить 10) и при выполнении функции читать базы Я получаю следующее: Если я правильно набираю данные, которые он работает, если я этого не делаю (например, я набираю «231»), программа переходит в бесконечный цикл, почему это происходит?Почему эта программа дает мне бесконечный цикл? Простая программа

#include <stdio.h> 

int main(void) 
{ 
    int base1,base2; 
    readBases(&base1,&base2); 
    printf("%d%d\n",base1,base2); 
    return 0; 
} 

void readBases(int *baseOrig, int * baseDest) 
{ 
    int aux1,aux2,flag; 
    do 
    { 
     printf("Type in the bases, in the format <a>b:"); 
     flag=scanf("<%d>%d",&aux1,&aux2); 
     if(aux1<2||aux1>10||aux2<2||aux2>10) 
     { 
      flag=0; 
      printf("Invalid data.\n"); 
     } 
    }while(flag!=2); 
    *baseOrig=aux1; 
    *baseDest=aux2; 
} 
+0

Вы должны проверить значение 'flag' * перед * исследованием входных значений, но вместо этого вы игнорируете его и перезаписываете. –

+3

Когда 'scanf' не может преобразовать вход, он возвращается к тому месту, где оно было остановлено. Ошибочный ввод останется в очереди и будет разбираться снова и снова. Я предлагаю вам прочитать целую строку с 'fgets', а затем проанализировать ее с помощью' sscanf'. –

+0

@WeatherVane Я не понимаю, что вы имеете в виду, прежде чем перезаписывать его, я должен попасть в часть «scanf» и присвоить ему новое значение, возможно, я неправильно понял. – YoTengoUnLCD

ответ

1
flag=scanf("<%d>%d",&aux1,&aux2); 

читает как большая часть входного потока, как это может, и возвращает количество преобразованных полей.

Если он ничего не может прочитать, он не будет прогрессировать ввода - остановка. Вам нужно каким-то образом прочитать данные - безопасно.

Прекращение работы линии довольно хорошо.

while(fgets(buffer, sizeof(buffer), stdin) != NULL){ 
     flag = sscanf(buffer, "<%d>%d",&aux1,&aux2); 

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