【发布时间】:2022-01-11 01:23:09
【问题描述】:
我正在开发一个具有注册系统的程序,您可以在其中注册新成员。
为了提供一些上下文,您注册的名称必须与现有名称不同,只能是一个单词,并且在保存到文件之前变成全部大写。为了避免文件处理中的潜在错误,我只希望用户名是字母,没有数字或特殊字符。
因为我想避免用户可能意外输入的前导和尾随空格,我决定将注册的新用户名存储到一个字符数组newName,但我就是不知道如何正确地通过字符数组检查任何数字或特殊字符,以便我可以要求用户输入正确的用户名。我已经尝试使用 isalpha() 函数使用不同的循环变体,但还没有找到任何东西。
这是我的代码部分,无论我输入的用户名是数字/特殊字符还是字母,它现在只显示"sorry, wrong username":
char newName[80];
bool valid;
do {
valid = true;
std::cin >> newName;
std::cin.sync();
for (int i = 0; i < 80; i++) {
if (!std::isalpha(newName[i]))
valid = false;
else
valid = true;
}
if (!valid)
std::cout << "Sorry, wrong username." << std::endl;
} while (!valid);
for (int i = 0; i < 80; i ++) {
if (newName[i] != '\0')
newName[i] = toupper(newName[i]);
else
break;
}
for (int i = 0; i < nameList.size(); i++) {
if (nameList.at(i) == newName) {
std::cout << "Sorry, this name already exists. If you are registering a new member, please enter a new name for them." << std::endl;
validName = false;
break;
}
if (nameList.at(i) != newName)
validName = true;
}
【问题讨论】:
-
您是否阅读过此处的“注释”部分:en.cppreference.com/w/cpp/string/byte/isalpha?
-
除了上面的评论,你是从使用 char 数组的错误决定开始的。
std::string和cin.getline()是你的朋友。 -
无关:您从
std::cin.sync();获得或相信会获得什么好处? -
for (int i = 0; i < 80; i++)每次都会处理整个数组,但是如果……如果用户输入“Bob”怎么办?你能指望数组中未使用的部分有什么吗?例如,字符串的终止 null 是有效的字母字符吗?