【问题标题】:Am I using isalpha() function in c++ correctly?我在 C++ 中正确使用 isalpha() 函数吗?
【发布时间】: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::stringcin.getline() 是你的朋友。
  • 无关:您从std::cin.sync(); 获得或相信会获得什么好处?
  • for (int i = 0; i &lt; 80; i++) 每次都会处理整个数组,但是如果……如果用户输入“Bob”怎么办?你能指望数组中未使用的部分有什么吗?例如,字符串的终止 null 是有效的字母字符吗?

标签: c++ file isalpha


【解决方案1】:

主要问题是您使用 C 样式 char[] 处理字符串。在 C++ 中,我们将数据类型 std::string 用于字符串。 std::string 比样式字符串更优越,很难理解,为什么有人仍然想使用旧的东西。

因此,您遇到了现在面临的问题。您正在使用魔术常数 80 来定义 char 数组。您还在循环中使用硬编码的数字 80,因此如果您在一个地方更改 80,您可能会在其他地方忘记它。并遇到麻烦。

然后,接下来,这就是问题的根本原因,如果您输入的名称少于 80 个字符,将会发生什么。

示例:您输入“Mike”。这是 4 个字母和一个尾随 0。所以,总共 5 个字符。在这 5 个字母之后,这 5 个相关字母之后的剩余数组位置会出现随机垃圾。

但是您的循环一直运行到 80。因此,在检查了前几个正确字符之后,您将继续检查垃圾。然后在第一个循环中得到随机结果。

如果你想解决这个问题,那么你还应该使用 C-Style strlen 函数来获取字符串的长度。然后你应该循环到这个值。

类似:

int length = strlen(newName);
for (int i = 0; (i < length) and (i < 80); i++) {

这将解决您的问题。

但再次建议:请考虑使用std::string

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 2020-03-08
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多