我正在制作一个简单的人口统计计划。输入数据并将其输出到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;
}
}
}
}
}
答案 0 :(得分:0)
我建议您首先测试一下该名称是否有效,如果是,则将其添加到名称向量中,而不是试图找出循环的逻辑。您当前的代码添加了无效的名称,然后尝试删除它们,这没有多大意义。
检查名称是否有效(包含所有字母字符)的方法是使用std::all_of算法函数:
RegularExpressinAttribute
使用以下内容,在所有字符都是字母之前,不会接受特定名称的输入。您不再需要验证循环,因为放置在向量中的所有名称都是有效的。