C ++, как обнаружить пробелы

0

Я создаю программу, которая позволяет пользователям вводить имя пользователя и пароль. проблема в том, что когда система запрашивает "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";
    }
}
Теги:
c++11
visual-c++

6 ответов

2
Лучший ответ

Проверка имени не является тривиальной, по многим причинам. Вы не хотите заниматься производством того, что вы "думаете", что пользователь хотел ввести, в то же время ясно, что вы хотите избежать потенциально долгого подтверждения того, что будет недействительным.

В конце концов, я бы заподозрил, что вы можете просто взять запись о перспективах, удалить все пробелы, а если что-то осталось, отправьте исходную запись для проверки. Не отрывайте дело от проверки того, что пользователь мог напечатать. Т.е.

"\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
  • 0
    Это не точно проверяет правильность имени пользователя, но скорее удаляет пробелы в данной строке. Это заставляет имя пользователя быть действительным в некотором роде.
  • 0
    Кроме того, я думаю, что [](char c){ ... неправильно, вы должны указать в этой точке предикат. По крайней мере, для меня это не скомпилировано! Итак, я изменил это, создав метод bool isSpace(char c) , который был просто оболочкой для std::isspace() .
Показать ещё 2 комментария
2

Предполагая, что компилятор, совместимый с С++ 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' (табуляция) и т.д....

  • 1
    Что угодно, есть find_if ... И я подумал, что мое решение было умным ...: P
1

просто рассмотрите пространство как символ и увеличьте его, когда найдете его

0
  1. Проверьте, является ли строка пустой, если да, то выполните пустую проверку
  2. Если строка не пустая, то проверьте, есть ли у нее пробелы, т. Е. Find_first_not_of ("\ t"), если это возвращает число больше 0, мы знаем, что имя пользователя имеет ведущие пробелы white/tab, за которыми следуют ноль или более символов. т.е. ведущие пробелы, то имя пользователя
  3. Теперь вам нужно сделать валидацию для хорошего имени пользователя.

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

Логика состоит в том, чтобы проверить, является ли начальный символ имени пользователя пустым пространством, а также последний слот строки не является пробелом. пример:
Это должно быть принято = "ab". Но
это не должно быть "а". или это не должно быть "а". или это не должно быть "а".

if (userName[0]!=" " && userName[userName.size()]!=" "){
       //accept this case and move on.
}
else{
         //reject all other cases.
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню