【问题标题】:How to - comparing chars in a char array to make sure user didn't input a number如何 - 比较 char 数组中的字符以确保用户没有输入数字
【发布时间】:2021-09-24 23:50:45
【问题描述】:

我正在为银行系统做一个课堂项目。其中一项任务是确保用户在输入姓名时不输入数字字符,反之亦然,在输入出生日期和/或电话号码时。

我正在使用 char 数组来获取名字和姓氏,但我想检查用户输入以查找他们是否不小心输入了数字,例如:

  • 杰森(接受)
  • j3son(拒绝)
cout << "*************************" << endl;
cout << "Please enter your first name: ";
cin.getline(nameFirst, 20);
cout << endl;

这会提示用户输入名字。我想把它发送给一个函数

bool checkName();

我想有某种循环来检查数组的所有元素(nameFirst),看看是否放置了一个数值。如果是这样。然后返回一些东西并使用该返回值来确定用户是否输入了无效条目。

我被难住了。我找不到任何类似的东西。我发现的所有内容都仅适用于 ints,但没有什么可以将 intchar 进行比较。

【问题讨论】:

  • std::isdigit 和一个循环。如果您喜欢冒险,可以将循环替换为 std::none_of
  • 您是否还要检查名称的第一个字符是否为大写?
  • 请展开代码以显示您的nameFirst 声明!
  • "我找到的所有东西都只适用于ints。" -- 你指的是例如isdigit 采用 int 参数?这是一个古老的“hack”,因此该函数也可以满足 EOF 的传递。您将要检查的字符转换为unsigned char,然后再将其传递给isdigit。 -- 另外,不要使用 char 数组。使用std::string nameFirststd::getline( std::cin, nameFirst )...

标签: c++ arrays char integer


【解决方案1】:
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>

int main()
{
    std::string nameFirst;
    std::getline( std::cin, nameFirst );

    // This will work with nameFirst being char[] as well,
    // but you REALLY should use std::string...
    if ( std::any_of( std::begin( nameFirst ), std::end( nameFirst ), [](unsigned char c){return std::isdigit(c);} ) )
    {
        std::cout << "I found a digit!\n";
    }
}

【讨论】:

    【解决方案2】:

    您可以循环输入并检查 ASCII 值。如果输入落在数字范围内,则它是一个数字。同样的策略也适用于字符。最好的方法是使用像isDigit 这样的内置函数。 https://www.programiz.com/c-programming/library-function/ctype.h/isdigit

    【讨论】:

    • 不推荐使用 ASCII 码。读者更容易理解'0' 的意图而不是 47,更容易插入错字,例如 ASCII '0' 不映射到 47,并且目标系统可能不使用 ASCII 作为其字符编码.更喜欢使用 isdigit 函数,该函数将处理目标为您呈现的所有边缘情况和异常情况。
    • 没错,我们可以使用内置函数来完成我们的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多