-3

我在笔记中发现了一个函数,上面写着:

int isdigit(int c);

true如果c是数字则返回。

但是当我在eclipse中不断出现我找不到的错误时。

到目前为止我的代码:

for(;;) {
    if (int !isdigit(int(library[count].tele))) { // if a letter,
        printf("Please enter numbers only.");
        count --;
        Menu();
    }
    else
        break;
}

library[count].tele是类型int(在结构中)。

我要做的就是检查电话号码中没有字母。

4

3 回答 3

1

isdigit需要一个int参数,因为在原始 C 中,将字符代码处理为整数,以便有足够的范围来编码EOF为不能作为字符出现的值。

在 C++ 中,您最好将其包装起来以避免非 ASCII 字符的未定义行为,例如

bool isDigit( char const c )
{
    return !!::isdigit( (unsigned char)c );
}

它检查单个字符

为了检查一个字符串,你可以依次检查每个字符:

bool isDigits( string const& s )
{
    for( char c : s )
    {
        if( !isDigit( c ) ) { return false; }
    }
    return true;
}

此解决方案依赖于基于 ASCII 编码的假设,但实际上您在 2013 年可能遇到的所有编码都基于 ASCII


“bang bang”!!避免了使用最常用的 c++ 编译器 Visual c++ 的愚蠢警告。为此,它不能用演员表代替。除了愚蠢的警告抑制之外,不需要这种显式转换:最终效果与语言保证隐式转换相同

于 2013-01-05T15:47:04.457 回答
0

是的,您可以使用isdigit它。但是,您必须分别应用isdigit到输入字符串中的每个字符,并根据它返回的内容做出决定。

你说的library[count].tele是类型int。当值存储在 中时int,要弄清楚它是否包含任何非数字(它不能)为时已晚。因此,必须在从 string 转换为int.

于 2013-01-05T15:43:10.197 回答
0

!isdigit( ch )测试ch不是数字字符('0' - '9')。这与测试字母不同,因为它将true针对所有非数字字符,其中不仅包括字母。

在这种情况下,这实际上可能!isdigit( ch )正是您想要的,但如果您想专门检查字母,您将使用isalpha( ch ).

如果您想一次性检查整个字符串中的有效字符(即没有循环),您可以简单地使用:

if( strspn( telehone_num, "0123456789" != strlen(telephone_num) ) 
{ 
    printf("Please enter numbers only.");
    Menu();
}

其中 phone_num 是 C 字符串(不是 int)。当然,既然您标记了这个 C++ 而不是 C,那么使用 std::string 可能会有更好的解决方案。

除此之外,您可能会考虑您可能希望允许的不同地区的电话号码的某些约定。例如,在英国,区号和本地号码之间用空格分开是很常见的,例如:

01225 123456

此外,国际用户可能会将数字表示为:

+44 (0)1225 123456

意思是“如果从英国境外拨打,请拨打本地国际电话代码,然后拨打 44,然后拨打区号,省略前导零,然后拨打用户号码”。仅用数字很难传达这么多信息。除非是机器而不是人来拨打号码,否则有时最好让用户输入他们喜欢的任何内容。

于 2013-01-05T16:13:49.020 回答