密码验证 - 空格

时间:2014-11-20 00:57:30

标签: c++

问题: 不会退出循环。

我检查了一百万个网站,但无法弄清楚如何实现这一点。由于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 个答案:

答案 0 :(得分:0)

您正在cin输入用户名,检查是否已按下e并输入cin.getline(...)。当你评论

时,我得出了这个结论
  

输入“1 1”给我32和49(中间的空格)

输入"1 1"时应该输入整数49 32 49。因为您在ouput语句中将字符转换为int。在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;
        }
    }
}

如果此代码运行并且您遇到内存泄漏或分段错误,则无法使用已发布的代码找到错误,并且需要更多代码,如在所有代码中一样。

答案 1 :(得分:0)

由于它已被标记为C ++,所以让我们用C ++方式。

  1. 我更喜欢使用string :: size()而不是strlen()(对于C风格的字符串)
  2. 要在字符串中查找空格,我们可以使用string :: find()。
  3. 以下是验证用户名输入的功能:

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