2010-09-29 5 views

ответ

4

cin сделаю это за вас, отчасти. cin потерпит неудачу, если получит то, что не того же типа, что и input. Что вы можете сделать это:

int input; 
while(!(cin >> input)) 
{ 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    cout << endl <<"Column size must be an integer"<< endl << endl; 
    cout << "Enter the number of columns: " ; 
} 

cin.clear() очищает биты ошибок и cin.ignore() очищает входной поток. Я использую number_limits, чтобы получить максимальный размер потока, который требует, чтобы вы #include<limits>. В качестве альтернативы вы можете просто использовать большое число или цикл.

+0

Спасибо, есть ли способ сделать так, чтобы плавающая точка # генерировала тот же ответ? – rectangletangle

+0

Этот ответ правильный, но нужно добавить одну вещь: вам нужно объявить переменную «input» как целочисленный тип до этого, например 'int input;' – aschepler

+0

Чтобы разрезать весь этот шаблонный код, вы можете использовать эту функцию : http://stackoverflow.com/questions/2256527/how-to-clear-the-unneccessary-input-stream-in-c/2257168#2257168 –

3

Вы не можете это сделать, как это; input должен иметь конкретный тип.

Самый простой подход, который будет работать, чтобы прочитать строку из cin, а затем преобразовать его в целое число во второй стадии с strtol или одного из его родственников, и выдает сообщение об ошибке, если strtol не потребляют целая строка.

1
#include<iostream.h> 
using namespace std; 
int main() 
{ 
int x; 
int input; 
    while(!0){ 
     cout<<"Enter your option :"; 
     cout<<"1 .Enter Column size :"<<endl; 
     cout<<"2.Exit "<<endl; 
     cin>>x; 
    switch(x) 
     { 
      case 1: cout << "Enter the number of columns: "<<endl ; 
         cin>>input; 
        if(input>0) 
         cout << "The number of columns: is "<<input<<endl ; 
        else 
         cout << "Enter the number of columns as integer "<<endl ; 

      case 2:exit(0);    
     } 
    }; 
return 0; 
} 
0

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

int input; 
int count = 1; 
while(count == 1){ //this is just a simple looping design 
    cin >> input; 
    if(cin.fail()){  //If the input is about to crash your precious program 
     cin.clear();  //Removes the error message from internal 'fail safe' 
     cin.ignore(std::numeric_limits<int>::max(), '\n');  //Removes the bad values creating the error in the first place 
     count = 1; //If there is an error then it refreshes the input function 
    } 
    else{ 
     count--; //If there is no error, then your program can continue as normal 
    } 
} 

Вот расширенный код: stackoverflow.com/questions/2256527/

+0

Примечание. Я отредактировал ваш ответ, но мне нужно было добавить дополнительную скобку перед 'else', потому что ваша логика была немного отключена. Это одна из веских причин, по которой вы должны отступать от своего кода. Однако, если это было ошибкой, не стесняйтесь переиздавать его. – Mike

1

Многие ответы здесь используют CIN встроенный фильтр. Хотя эти действия предотвращают ввод символа или строки, они не препятствуют записи с плавающей точкой. Когда вводят float, он принимается, и десятичное значение остается в буфере. Это создает проблемы с последующими запросами на cin. Следующий код проверяет флаг cin error, а также предотвращает входы float.

* примечание: инструкция cin.ignore может потребовать некоторой настройки для полной проверки кода.

void main() 
{ 
    int myint; 

    cout<<"Enter an integer: "; 
    intInput(myint); 
} 

void intInput(int &x) 
{ 
    bool valid = true; //flag used to exit loop 

    do 
    { 
     cin>>x; 

     //This 'if' looks for either of the following conditions: 
     //cin.fail() returned 'true' because a char was entered. 
     //or 
     //cin.get()!='\n' indicating a float was entered. 
     if(cin.fail() || cin.get()!='\n') 
     { 
      cout<<"Error. The value you entered was not an integer."<<endl; 
      cout<<"Please enter an integer: "; 
      cin.clear();   //clears cin.fail flag 
      cin.ignore(256,'\n'); //clears cin buffer 
      valid = false;   //sets flag to repeat loop 
     } 
     else valid = true;   //sets flag to exit loop 
    }while(valid == false);  
} 
Смежные вопросы