2014-11-20 5 views
0

Задача: Не выйдет из цикла.Подтверждение пароля - пробелы

Я проверил миллион сайтов и не могу понять, как это реализовать. Этот цикл не будет выходить из-за getline(). Нужен ли мне cin.ignore() или cin.clear()? Я не могу заставить его работать после попытки каждого вывода. Пожалуйста, помогите ..

while (strlen(u.username) < 6 || strlen(u.username) > 18||got_space==true) 
{ 
    got_space = false; 
    cout << "\nError: Your username must be between 6 and 18 characters long and have no spaces. Please try again. (Press e to exit)\n"; 
    cin >> u.username; 
    if (strlen(u.username)<2 && tolower(u.username[0]) == 'e') 
    { 
     return; 
    } 
    cin.getline(u.username, USERNAME_SIZE); // Find whitespaces 

    for (int c = 0; c < strlen(u.username); c++) // Check for spaces 
    { 
     if (isspace(u.username[c])) 
     { 
      got_space = true; 
     } 
    } 
} 
+2

Использование станд :: строка. Во-первых, если вы обрабатываете пароли, вам, вероятно, нужен защищенный код. Труднее сделать ошибку, такую ​​как переполнение буфера со строками. –

+1

Мне также интересно, какое значение вводит «e» в качестве имени пользователя. –

+0

Что такое std :: anything, потому что я вижу его для множества решений в Интернете, но мой учитель сказал, что не используйте его прямо сейчас, по крайней мере до тех пор, пока мне не станет лучше в кодировании C++ .. ?? – Donald

ответ

0

Вы набирали имя пользователя в cin, что проверяется, если e была нажата, а также вводить в cin.getline(...). Я пришел к такому выводу, когда заметил, что

Typing в «1 1» дает мне 32 и 49 (пространство в центре)

Typing в "1 1" должно было привести с Интс 493249 выводится. Потому что вы бросаете своих персонажей в int в выражении ouput. В ASCII символ 1 эквивалентен целому числу 49, символ ' ' (пустое место) эквивалентно целому числу 32. Поскольку вы заявили, что набрали «1 1» и получили только 32 и 49, мне кажется, что вы начали вводить имя пользователя в первый cin и продолжали дальше. Вот исправление:

while (strlen(u.username) < 6 || strlen(u.username) > 18||got_space==true) 
{ 
    got_space = false; 
    cout << "\nError: Your username must be between 6 and 18 " 
     << "characters long and have no spaces. " 
     << "Please try again. (Press e then enter to exit)\n"; 

    // remove this cin because it's messing up your code 
    // cin >> u.username; 

    // move the cin.getline(...) to here 
    cin.getline(u.username, USERNAME_SIZE); // Find whitespaces   

    if (strlen(u.username)<2 && tolower(u.username[0]) == 'e') 
    { 
     return; 
    } 

    for (int c = 0; c < strlen(u.username); c++) // Check for spaces 
    { 
     if (isspace(u.username[c])) 
     { 
      got_space = true; 
     } 
    } 
} 

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

0

Поскольку он был помечен как C++, давайте сделаем это с помощью C++.

  1. Я предпочитаю использовать строку :: размер(), а не STRLEN() (для C-стиля строки)
  2. Чтобы найти место в строке можно использовать строку :: найти().

Следующая функция для проверки ввода имя пользователя:

const unsigned validate(std::string& uname) { 
    const unsigned s = uname.size(); 

    if(s < 6 || s > 18) return 1; 
    if(uname.find(" ") != std::string::npos) return 2; 
    return 0; 
} 
Смежные вопросы