问题是即使用户输入了正确的名称格式,只有在第一次输入输入不正确的情况下,while循环才会退出。当用户第一次正确输入名称时,不会发生此问题。
void inputclass::validateName(string name) {
bool flag = true
while (flag == true) {
for (int i=0; i < name.length(); i++) {
if (name[i] != ' ') {
if (!isalpha(name[i])) {
cout << "You have entered incorrectly. Please try again. " << endl;
setName();
} else if (i == name.length()-1) {
cout << "Welcome " << name << endl;
flag = false; //break out of while loop
}
}
}
}
}
void inputclass::setName() {
string name;
cout << "Please enter your name: " << endl;
getline(cin, name);
validateName(name);
}
答案 0 :(得分:1)
这是c ++,没有数组边界检查。您正在读取数组的末尾并且isalpha()返回true。交换if和else,然后检查我是否在数组末尾。
答案 1 :(得分:1)
您似乎很难找到解决问题的逻辑。只需从一些伪代码开始,一旦你知道你需要什么就开始实现。我想你正在寻找像
这样的东西bool valid = false
while not valid:
name = setName()
valid = validate(name)
然后就不需要递归了。只需实现一个读取用户输入并返回字符串的setName()
。以及执行验证并返回bool的validate()
。简单,呵呵?
答案 2 :(得分:1)
请不要递归调用验证函数,这是一种可能导致堆栈溢出的可怕做法
正如您所写,您需要通过在父母之一中输入的每个错误数字输入有效输入来逃避递归函数
提示:更好的方法是让验证函数使用其返回值,如果输入无效,则返回false
。然后父母可以再次尝试,如果它适合它。