2016-02-25 3 views
-1

Здравствуйте, я пытаюсь проверить, содержит ли строка хотя бы одну букву, но на этом этапе не работает. Если я напечатаю 13, он будет продолжать, не давая мне ошибку, Не имеет значения, содержит ли номер, я просто хочу хотя бы одну букву, например: Patrick1 thats okay.Проверьте, содержит ли строка хотя бы одну букву

Это код, который я пытаюсь:

void setName(string b) { 
     cout << "Please enter your name:" << endl; 
     getline(cin, b); 
     for (int i =0; i<b.size(); i++) { 
      if ((b[i] >= 'A' && b[i] <= 'Z') || 
        (b[i] >= 'a' && b[i] <= 'z')) { 
       cout << "Error" << endl; 
       cout << "Please enter your name:" << endl; 
       getline(cin, b); 

      } 

любые предложения спасибо, ребята!

+0

Вы написали это таким образом. –

+0

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

ответ

5

C++ стандартной библиотеки имеют many nice algorithmic functions, например, один под названием std::any_of, который будет возвращать true, если любой элемент в диапазоне переданного вызывает предикат для возврата true.

Может использоваться с ::isalpha как этот

if (std::any_of(std::begin(b), std::end(b), ::isalpha)) 
{ 
    // There is at least one alphabetic character in the string 
} 

Важное примечание:std::any_of функция была введена в C++ 11. Некоторым компиляторам нужны специальные флаги для включения C++ 11. Очень старые компиляторы и стандартные библиотеки могут вообще не иметь никакой функции.

+0

, используя это, я получаю сообщение об ошибке «name.cpp: 9: 85: error: нет соответствующей функции для вызова« any_of »(std :: basic_string :: итератор, std :: basic_string :: итератор, std :: basic_string :: итератор, <неразрешенный перегруженный тип функции>) name.cpp: 11: 70: note: не удалось вывести параметр шаблона '_Predicate' '" – Tommylee2k

+0

@ Tommylee2k Вы включили необходимые файлы заголовков (' 'for' std :: any_of' и '' для 'std :: isalpha')? О, и 'std :: any_of' был введен в C++ 11, вам может потребоваться добавить флаг для включения C++ 11 в зависимости от вашего компилятора. –

+0

Я строю с помощью «g ++ -g -std = C++ 11 -Wall -c»% f » вот код всей функции, возможно, я что-то наблюдаю: ' void setName (std :: string & b) { BOOL isValidName = ложь; в то время как { станд :: соиЬ << "Пожалуйста, введите ваше имя:" (isValidName!) << станд :: ENDL; станд :: GetLine (станд :: CIN, б); if (std :: any_of (std :: begin (b), std :: end (b), std :: isalpha)) isValidName = true; else std :: cout << "Ошибка" << std: : endl; } } ' – Tommylee2k

0

пожалуйста, постарайтесь не повторять себя (как вы сделали с «GetLine»)
Если у вас есть, пересмотрите свой алгоритм ... в вашем случае это может быть что-то вроде "повторить запись, пока нет правильного названия введенный ", который может быть закодирован именно таким образом:
Таким образом, если вы хотите изменить код на месте A, вы не можете забыть также изменить его на месте B (и все другие места, в которые вы в конечном итоге скопировали его); -)

#include <algorithm> 
#include <iostream> 
#include <cctype> 

void setName(std::string& b) { 
    bool isValidName=false; // nothing entered yet 
    while (!isValidName) 
    { 
     std::cout << "Please enter your name:" << std::endl; 
     std::getline(std::cin, b); 
     if (std::any_of(std::begin(b), std::end(b), ::isalpha)) { 
      isValidName=true; // correct name entered 
     } 
     else { 
      std::cout << "Error" << std::endl; 
     } 
    } 
} 

int main() { 
    std::string name; 
    setName(name); 
    std::cout << "Hello, " << name << "!" << std::endl; 
    return 0; 
} 
Смежные вопросы