2017-01-05 11 views
0

Я пытаюсь заверить, что моя строка ввода правильно сформирована (правильный формат XXX-X-XXX), но я не хочу использовать char temp [255] и cin. getline.Обеспечьте правильный ввод строки в C++

До сих пор мне удалось "поймать" всех исключений, кроме этого:

Введите регистрационный знак: shjkf 22h 23jfh3kfh jkfhsdj H2j H2K 123-A-456

Как предполагается regPlate выберет все строки из ввода, включая правильный, сформированный в конце, и он напечатает строку. Это неверно. После прочтения первой строки он должен печатать Bad input и все после его удаления.

Я пытался использовать cin.clear(), cin.ignore() и т. Д. в моем , если функция, но без результатов.

void main() 
{ 
    std::string regPlate; 
    do 
    { 
     cout << "Enter registration plate: "; 
     cin >> regPlate; 
     if (regPlate.size() < 9 || regPlate.at(3) != '-' || regPlate.at(5) != '-' || regPlate.size() > 9) 
     { 
      cout << "Bad entry" << endl; 

     } 
    } while (regPlate.size() < 9 || regPlate.at(3) != '-' || regPlate.at(5) != '-' || regPlate.size() > 9); 
    cout << endl << regPlate << endl; 

    system("pause"); 
} 
+2

Вам не нужно, чтобы проверить размер быть меньше, чем '9' * и * больше, чем' 9'. Просто выполните одну проверку размера, не равного '9'. –

+0

Что касается вашей проблемы, возможно, вы ищете ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline)? –

+0

@Someprogrammerdude ", но я не хочу использовать char temp [255] и cin.getline сочетание." –

ответ

0

Будет ли рабочий цикл в то время, может быть что-то вроде:

int main(){ 
    string regPlate; 
    while(regPlate.size() != 9 || regPlate.at(3) != '-' || regPlate.at(5) != '-'){ 
     cout << "Enter registration plate: " << endl; 
     cin >> regPlate; 
    } 
    cout << regPlate; 
    return 0; 
} 
0

Используя пример вы предоставляете (с несколькими предположениями) Я побежал код об этом, это, кажется, работает, как ожидалось. Вот что я побежал, с включенными заголовками.

#include <string> 
#include <iostream> 

using namespace std; 

void main() 
{ 
    string regPlate; 
    do 
    { 
     cout << "Enter registration plate: "; 
     cin >> regPlate; 
     if (regPlate.size() != 9 || regPlate.at(3) != '-' || regPlate.at(5) != '-') 
     { 
      cout << "Bad entry" << endl; 

     } 
    } while (regPlate.size() != 9 || regPlate.at(3) != '-' || regPlate.at(5) != '-'); 
    cout << endl << regPlate << endl; 

    system("pause"); 
} 

выход я получаю это:

Enter registration plate: shjkf 22h 23jfh3kfh jkfhsdj h2j h2k 123-A-456 
Bad Entry 
Enter registration plate: Bad Entry 
Enter registration plate: Bad Entry 
Enter registration plate: Bad Entry 
Enter registration plate: Bad Entry 
Enter registration plate: Bad Entry 
Enter registration plate: Bad Entry 
Enter registration plate: 
123-A-456 

Я также набраны вручную из всех значений, представленных в таблице, и оказалось, работать таким образом также.

+0

Этот вход недействителен. Я исправил проблему, но спасибо в любом случае. –

0

Благодаря @Someprogrammerdude мне удалось исправить эту проблему.

Единственное, что я должен был сделать это вместо того, чтобы использовать std::cin>>regPlatestd::getline(cin,regPlate)

std::string regPlate; 
    do 
    { 
     cout << "Enter registration plate: "; 
     std::getline(cin, regPlate); 
     if (regPlate.size() != 9 || regPlate.at(3) != '-' || regPlate.at(5) != '-') 
     { 
      cout << "Bad entry" << endl; 

     } 
    } while (regPlate.size() != 9 || regPlate.at(3) != '-' || regPlate.at(5) != '-'); 
    cout << regPlate << endl;