矢量字符串验证问题

时间:2016-02-21 17:16:46

标签: c++ string validation vector

我正在制作一个简单的人口统计计划。输入数据并将其输出到csv文件。我在验证名称的数据输入时遇到问题。如果只输入数字,验证工作正常但如果我输入两次字母数字字符串则不起作用。例如,如果我输入Max1,我会得到异常,如果我再次输入Max1,它只会转到下一个函数调用。但是,如果我只输入一串数字,那么在我输入正确的alpha字符串或两个字母数字字符串之前它将不会继续运行

    #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;
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我建议您首先测试一下该名称是否有效,如果是,则将其添加到名称向量中,而不是试图找出循环的逻辑。您当前的代码添加了无效的名称,然后尝试删除它们,这没有多大意义。

检查名称是否有效(包含所有字母字符)的方法是使用std::all_of算法函数:

RegularExpressinAttribute

使用以下内容,在所有字符都是字母之前,不会接受特定名称的输入。您不再需要验证循环,因为放置在向量中的所有名称都是有效的。