2013-11-27 6 views
-2

После некоторых предложений. Я применил их.Поведение странного поведения cin

Отрывок из функции bool getInput(int format=1)

cin>>num1>>plus>>num2>>i; 
if(cin.fail()){ 
    cout<<"\n[X][cin--fail] Oops! You entered in the incorrect format! Correct format: a+bi"; 
    cin.clear();  
    cin.ignore(INT_MAX); 

    return false; 
} 
if(plus == '+' && i=='i'){ 
    setComplex(num1, num2); 
    return true; 
} else { 
    cout<<"\n[X] Oops! You entered in the incorrect format! Correct format: a+bi"; 
    return false; 
} 

Я еще одну функцию, которая вызывает указанную выше функцию.

void getInput_recursive(int format=1){ 
    while(!getInput(format)){}; 
} 

Он отлично работает для правильного ввода. Но когда ввод похож на 2+3iiiii, тогда происходит какая-то странная вещь.

Мое первое предположение: Возможно, это было связано с входным буфером. Я попытался очистить его, используя cin.ignore и cin.clear, но все равно ничего не произошло.

Может ли кто-нибудь помочь мне здесь? Что я делаю не так?

Вы можете найти полный код здесь: http://codepad.org/Gl2zBrn1

ответ

2

Ваш подход хорош, и вы делаете правильную работу, но я думаю, что у вас есть заказ перепутали: первый cin.clear(); сбросить флаги, чем cin.ignore(INT_MAX);, чтобы очистить буфер.

EDIT:

Я думаю, вам нужно заменить cin.ignore(INT_MAX); с cin.ignore(INT_MAX,'\n'); Позвольте мне знать, если это делает трюк.

+0

спасибо, но не помог – cipher

+0

это изменило мой выход, но он снова был странным и неопределенным:/ – cipher

+0

вы можете вставить в функции get_input и get_inputRecursive ... может быть, проблема не в коде, вы показываете – Pandrei

2

(a) Не рекурсивно. while (!getInput(format)) {} будет делать, рекурсия предназначена для сохранения состояния для последующего возобновления, и здесь нечего возобновлять.

(б) Вы не возвращает значение на false ветви

bool getInput_recursive(int format=1){ 
    if(getInput(format) == true){ 
     return true; 
    } else { 
     getInput_recursive(format); // here 
    } 
} 

и производит неопределенное поведение.

и (с) Я думаю, вы должны смотреть на то, что

cin.ignore(INT_MAX); 

делает, и то, что государство, которое оставит свой поток в. Это будет делать это.

+0

Предложение отмечено. Но. Я все еще не понимаю, почему это неопределенное поведение и почему я должен возвращать значение в ложной ветви? Я вижу, что это довольно просто. если вход терпит неудачу, то он снова запрашивает ввод, но если ввод преуспевает, чем функция выходит с истинным значением? Разве это не так? – cipher

+0

Использовал ли 'while (! GetInput (format)) {}', но эта же проблема сохраняется – cipher

+0

re UB, некоторая копания будет связана с тем, что отказ вернуть значение из функции, объявленной для возврата значения, фактически вызывает неопределенные поведение во всех его последствиях, что касается «почему», проверка википедии, и если это не удовлетворительно расширяет охват вашего google-fu до того, как вы спросите, это всегда хорошая идея. – jthill

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