2015-10-02 6 views
0

Так что я хочу, чтобы проверить, что пользователь вводит только текст, а не цифры. Если какое-либо число вводится, я снова спрашиваю ее для ввода. Я думал, что это будет делать трюк, но это не похоже на работу:Проверка функции ввода и getline()

#include <iostream> 

using namespace std; 

int main() 
{ 
    string name = ""; 

    cout << "Enter name: "; 
    getline(cin, name); 

    while (!cin) // or cin.fail() 
    { 
     cout << "Numbers are not allowed, input name again: "; 
     cin.clear(); 
     cin.ignore(1000, '\n'); // is this even necessary since getline() already consumes spaces and new lines? 
     getline(cin, name); 
    } 
} 

Поскольку переменная name имеет string типа, а не если cin объект не в состоянии, когда он получает номер? Как я могу проверить его и убедиться, что он запрашивает ввод снова при вводе номера? Кроме того, из любопытства, поскольку я уже спрашиваю, если пользователь вводит что-то вроде: Scarlett9356, что было бы хорошим способом повторного запроса на хороший ввод? Спасибо.

+1

вы можете читать «1234» из входного потока в виде числа или строки: это всего лишь строка символов – BeyelerStudios

+0

Настоящая сложная вещь - это большая картина. Что * * действительное имя для человека? Это намного сложнее, чем можно было бы подумать: http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/. Конечно, для игрушечной программы обычно достаточно убедиться, что это содержит только Aa-Zz и пробелы. –

+0

Отлично, спасибо за обмен! @ChristianHackl – Blueshift

ответ

1

Вы можете подтвердить, что в вашей строке нет цифр:

#include <iostream> 

using namespace std; 

bool validName(string name) 
{ 
    if(name.length() == 0) 
     return false; // `name` cannot be empty 

    for(int i = 0; i < name.length(); i++) 
     if(name[i] >= '0' && name[i] <= '9') 
      return false; // There is a number in `name` 

    return true; // `name` is valid 
} 

int main() 
{ 
    string name = ""; 

    cout << "Enter name: "; 
    getline(cin, name); 

    while (!validName(name)) 
    { 
     cout << "Numbers are not allowed, input name again: "; 
     cin.clear(); 
     cin.ignore(1000, '\n'); // is this even necessary since getline() already consumes spaces and new lines? 
     getline(cin, name); 
    } 
} 
+0

Спасибо, это выглядит хорошо для меня. Когда я запустил его, нажав один раз, вы перейдете к следующей строке, и нажатие на ввод снова фактически остановит программу. Я прокомментировал строку 'cin.ignore()' и исправил первую часть этой проблемы, но теперь просто нажатие enter остановит программу. Может быть, потому, что цикл 'for' нуждается в некотором значении, чтобы проверить, является ли' i <имя.length() ', и нажатие enter испортит его? – Blueshift

+0

@Blueshift: Я отредактировал функцию validName, чтобы отразить это новое требование! ;-) Вы можете добавить дополнительные условия для этой функции! – mbinette

+0

Выучил от вас! – Blueshift

1

Поскольку переменная name имеет тип строки, не должен ли cin-объект терпеть неудачу при получении номера?

Нет. Ввод текста, который состоит из цифр, также является строкой.

Вам понадобится использовать другую стратегию для ввода недопустимого ввода.

Я хотел бы предложить что-то вдоль линий:

bool is_valid_input(std::string const& name) 
{ 
    bool is_valid = true; 
    // Figure out the logic for deciding when the input is not valid. 

    // ... 

    if (!is_valid) 
    { 
     cout << "Numbers are not allowed, input name again: "; 
    } 

    return is_valid; 
} 

int main() 
{ 
    string name = ""; 

    do 
    { 
     cout << "Enter name: "; 
     getline(cin, name); 
    } 
    while (!is_valid_input(name)); 
} 
+0

Получил, спасибо. Позаботьтесь о том, чтобы опубликовать какой-либо примерный код или подробнее рассказать о своем ответе? – Blueshift

0

Если вы хотите, чтобы ограничить ввод только принимать в строке без номера в нем, то вы можете использовать std::any_of и std::isdigit

std::string name = ""; 

std::cout << "Enter name: "; 
std::getline(std::cin, name); 

while (std::any_of(name.begin(), name.end(), [](char ch) { return std::isdigit(ch); })) 
{ 
    std::cout << "Numbers are not allowed, input name again: "; 
    std::getline(std::cin, name); 
} 
Смежные вопросы