Я создаю программу, которая позволяет пользователям вводить имя пользователя и пароль. проблема в том, что когда система запрашивает "Enter userName:", и я нажимаю клавишу ввода, она будет печатать "Имя не может содержать пробел",
но если я нажму FEW spaceBars и нажмите клавишу ввода и сделаю пустое поле после этого, он пропустит, чтобы пригласить пользователя ввести пароль без распечатки "Имя не может содержать пробел" и предложит пользователю снова ввести имя пользователя.
как мне изменить мои коды, чтобы убедиться, что он все равно предложит пользователю снова ввести имя пользователя, даже если я попал в пробелы и нажал Enter? пожалуйста, порекомендуйте. благодаря
код
string userName=" ";
string password;
cout << "Enter UserName:";
while (getline(cin, userName)) {
if (userName.empty()) {
cout << "Name cannot contain a blank."<< endl;
cout << "Enter userName:";
userName = userName;
//throw errorMsg;
}
if(!userName.empty()) {
cout << "Enter Password";
}
}
Проверка имени не является тривиальной, по многим причинам. Вы не хотите заниматься производством того, что вы "думаете", что пользователь хотел ввести, в то же время ясно, что вы хотите избежать потенциально долгого подтверждения того, что будет недействительным.
В конце концов, я бы заподозрил, что вы можете просто взять запись о перспективах, удалить все пробелы, а если что-то осталось, отправьте исходную запись для проверки. Не отрывайте дело от проверки того, что пользователь мог напечатать. Т.е.
"\t\t "
должны быть основанием для повторного
"John Smith"
"\t WillJohnson "
"Gary"
все должны быть представлены дословно, и пусть фишки упадут там, где они могут.
Тем не менее,
bool isValidUserName(std::string name)
{
name.erase(std::remove_if(name.begin(), name.end(),
[](char c){ return std::isspace(static_cast<unsigned char>(c));}), name.end());
return !name.empty();
}
должен сделать это за вас. Пример:
int main()
{
std::cout << std::boolalpha << isValidUserName("\t \t ") << std::endl;
std::cout << std::boolalpha << isValidUserName("\t Will Johnson ") << std::endl;
return 0;
}
Вывод
false
true
Предполагая, что компилятор, совместимый с С++ 11, ваш тест на пробелы может использовать std :: find_if
if (std::find_if(userName.begin(), userName.end(), isspace))
!= userName.end())
или
if (std::find_if(userName.begin(), userName.end(),
[=](char c){return isspace(c);}) != userName.end())
Обратите внимание, что несколько символов являются пространственными ' '
но также '\t'
(табуляция) и т.д....
find_if
... И я подумал, что мое решение было умным ...: P
просто рассмотрите пространство как символ и увеличьте его, когда найдете его
Теперь вам нужно сделать валидацию для хорошего имени пользователя.
#include <iostream>
#include <cstring>
using namespace std;
int main() {
string userName = " ";
string password;
cout << "Enter UserName:";
while(getline(cin, userName)) {
if(userName.empty()) {
cout << "Empty String";
} else if(userName.find_first_not_of("\t ") > 0) {
cout << "Could contain spaces followed by username or just spaces";
} else {
cout << "User Name is Valid";
}
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main(){
string username, password;
int un = 1;
int ps = 1;
while(un){
cout<<"Username:";
getline(cin,username);
int usize = username.size();
vector <string> v ;
v.insert(v.begin(), username);
if (usize==1){
if(username==" "){
cout<<"Username can not be blank"<<endl;
}
else{
un=0;
}
}
else{
int check=0; int trim = 0;
for (int i=0; i<usize; i++){
if (username[i]!=' '){
check=1;
trim = i;
break;
}
}
if(check==1){
un=0;
}
else{
}
}
}
while(ps){
cout<<"Password:";
getline(cin,password);
int usize = password.size();
vector <string> v ;
v.insert(v.begin(), password);
if (usize==1){
if(password==" "){
cout<<"Password can not be blank"<<endl;
}
else{
ps=0;
}
}
else{
int check=0;
for (int i=0; i<usize; i++){
if (password[i]!=' '){
check=1;
break;
}
}
if(check==1){
ps=0;
}
else{
}
}
}
cout<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"Username is: "<<username<<endl;
cout<<"Password is: "<<password<<endl;
return 0;
}
Логика состоит в том, чтобы проверить, является ли начальный символ имени пользователя пустым пространством, а также последний слот строки не является пробелом. пример:
Это должно быть принято = "ab". Но
это не должно быть "а". или это не должно быть "а". или это не должно быть "а".
if (userName[0]!=" " && userName[userName.size()]!=" "){
//accept this case and move on.
}
else{
//reject all other cases.
}
[](char c){ ...
неправильно, вы должны указать в этой точке предикат. По крайней мере, для меня это не скомпилировано! Итак, я изменил это, создав методbool isSpace(char c)
, который был просто оболочкой дляstd::isspace()
.