问题: 不会退出循环。
我检查了一百万个网站,但无法弄清楚如何实现这一点。由于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;
}
}
}
答案 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 ++方式。
以下是验证用户名输入的功能:
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;
}