Validate string for invalid characters
我今天正在研究如何验证无效字符(如数字)的字符串输入,遗憾的是没有成功。 我正在尝试验证字符串以获取客户的姓名,并检查是否有任何数字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include"stdafx.h" #include <string> #include <iostream> #include <conio.h> #include #include <cctype> using namespace std; string validateName(string name[], int i) { while(find_if(name[i].begin(), name[i].end(), std::isdigit) != name[i].end()){ cout <<"No digits are allowed in name." << endl; cout <<"Please re-enter customer's name:" << endl; cin.clear(); cin.ignore(20, ' '); } return name[i]; } int main() { string name[10]; int i=0; char newentry='n'; do{ cout <<"Plase enter customer's name:" << endl; getline(cin, name[i]); name[i]=validateName(name, i); i++ cout <<"Would you like to enter another questionare? Enter either 'y' or 'n':" << endl; cin >> newentry; } while((newentry =='y') || (newentry=='Y')); |
该功能似乎做得很好,但只有第一个输入。 例如,当我运行程序并输入数字3时,将显示一条错误消息,并要求用户再次输入名称。 用户输入有效名称后,即使没有使用数字或特殊字符,程序也会一直要求输入相同的错误消息。
我已经改变了你的代码,但由于已经很晚了,明天我必须去大学,我会留给你看看我做了什么:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <string> #include <iostream> #include <conio.h> #include #include <cctype> using namespace std; void validateName(string &name) //Pass by reference and edit given string not a copy, so there is no need to return it { cout <<"Plase enter customer's name:" << endl; cin.clear(); cin.sync(); getline(cin, name); while (name.find_first_of("0123456789") != -1) { cout <<"No digits are allowed in name." << endl; cout <<"Please re-enter customer's name:" << endl; cin.clear(); cin.sync(); getline(cin, name); } } int main() { string name[10]; int i = 0; char newentry = 'n'; do{ validateName(name[i++]); if (i >= 10) break; cout <<"Would you like to enter another questionare? Enter either 'y' or 'n':" << endl; do{ cin.clear(); cin.sync(); cin >> newentry; } while ((newentry != 'y') && (newentry != 'Y') && (newentry != 'n') && (newentry != 'N')); } while ((newentry == 'y') || (newentry == 'Y')); } |
如果名称不正确且包含数字,则您的函数validateName没有退出循环。
我想您忘记在此循环中放置
还插入声明
1 2 | cin.ignore(20, ' '); |
之前
1 | getline(cin, name[i]); |
在do-while循环中。
甚至更好地使用
1 | cin.ignore( std::numeric_limits<std::streamsize>::max() ); |
问题是在循环结束时有声明
1 | cin >> newentry; |
它将新行字符放在输入缓冲区中,而下一个getline则不读取任何内容。