2016-02-21 3 views
-2

Я работаю над простой демографической программой. Введите данные и выведите их в файл csv. У меня возникает вопрос о проверке ввода данных для имени. Проверка корректна, если вводится только номер, но если я дважды вводим буквенно-цифровую строку, это не сработает. Например, если я набираю Max1, я получаю исключение, если я снова нахожу Max1, он просто переходит к следующему вызову функции. Однако, если я введу только строку цифр он не будет двигаться дальше, пока не будет введен правильный альфа только строка или две строки буквенно-цифровогоВопросы проверки строки строки

#include <iostream> 
    #include <vector> 
    #include "People.h" 

    int main() 
    { 
     const short elements = 2; 
     PersonalData Demographics; 
     std::string input; 
     std::vector<std::string> response; 

     for (int i = 0; i < elements; i++) 
     { 
      std::cout << "Please enter first name of child: " << i+1 << std::endl; 
      std::cin >> input; 
      response.push_back(input) 
      Demographics.setName(response); 
     } 
     return 0; 
    } 

    People.hpp 

#ifndef PEOPLE_H_INCLUDED 
#define PEOPLE_H_INCLUDED 
#include <vector> 

    class PersonalData 
    { 
     private: 
      std::vector<std::string> name; 
     public: 
      void setName(std::vector<std::string>&); //get the names of each person 
    }; 

    #endif // PEOPLE_H_INCLUDED 



People.cpp 

#include <iostream>> 
#include "People.h" 
#include <vector> 

    void PersonalData::setName(std::vector<std::string> &names) 
    { 
     string retry; 
     bool valid=false; // we start by assuming that the entry is not valid 
     std::string::const_iterator it; 
     while(!valid) //start validation loop 
     { 
      for(int i=0; i <names.size(); i++) 
      { 
       for(it = names[i].begin(); it != names[i].end(); ++it) //start loop to check type of each char in string 
       { 
        if(isalpha(*it)) //if it is char set name to user names 
        { 
         name=names; 
         valid = true; //the entry was valid, jump out of loop 
        } 
        else //it was not just char, try again 
        { 
         std::cout << "Name should be alphabetic only. Try again: " <<endl; 
         std::cin >> retry; 
         names.erase(names.begin()+i); // remove the bad non-alphabetic entry from the names array 
         names.push_back(retry); 
         break; 
        } 
       } 
      } 
     } 
    } 
+0

Эта целая петля может быть заменена на 'std :: remove_if/erase' простой лямбдой. Кроме того, почему вы начинаете создавать плохие имена в своем векторе? Почему бы не проверить перед тем, как поместить имя в вектор? – PaulMcKenzie

+0

Хорошо, это имеет смысл. Просто удалите все, что не является альфа-символом. Не знаю, существует ли опция remove if. Я все еще довольно новый, как вы можете сказать. Не знаю, что такое лампа, но я могу ее исследовать. – NoiseyAgent

ответ

0

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

Путь, чтобы проверить, если имя является действительным (содержит все буквенные символы), чтобы использовать функцию std::all_of алгоритма:

#include <iostream> 
#include <vector> 
#include <ccytpe> 
#include <algorithm> 
//... 
using namespace std; 
int main() 
{ 
    const short elements = 2; 
    PersonalData Demographics; 
    std::string input; 
    std::vector<std::string> response; 

    for (int i = 0; i < elements; i++) 
    { 
     bool input_good; 
     do 
     { 
      std::cout << "Please enter first name of child: " << i+1 << std::endl; 
      std::cin >> input; 
      input_good = std::all_of(input.begin(), input.end(), ::isalpha); 
      if (!input_good) 
       cout << "Sorry, bad input. Try again...\n"; 
     } while (!input_good); 
     response.push_back(input) 
    } 

    // now we know that all the names are valid. Place in 
    // Demographics 
    Demographics.setName(response); 
    return 0; 
} 

void PersonalData::setName(std::vector<std::string> &names) 
{ 
    name = names; // simple 
} 

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

+0

Да, это имеет смысл, спасибо. Мне нужно ознакомиться с библиотекой алгоритмов, я не знал обо всех. – NoiseyAgent

+0

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

+0

Какой компилятор вы используете? 'std :: all_of' поддерживается для компиляторов, совместимых с C++ 11. Вот простой пример: http://ideone.com/garzCb – PaulMcKenzie

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