可以!isdigit用于检查int中的字母?

时间:2013-01-05 15:36:35

标签: c++ int

我在笔记中找到了一个函数,其中包含以下内容:

int isdigit(int c);

如果true是数字,则返回c

但是当我在日食中发现一个我无法找到的错误时。

到目前为止我的代码:

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

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

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

3 个答案:

答案 0 :(得分: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 ++的愚蠢警告。为此目的,它不能用演员代替。除了愚蠢警告抑制之外,不需要这种显式转换:最终效果与隐式转换的语言保证相同

答案 1 :(得分:0)

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

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

答案 2 :(得分: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();
}

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

除此之外,您可能会认为您可能希望允许在不同地区使用电话号码。例如,在英国,将区号与本地号码分隔一个空格是很常见的,例如:

01225 123456

此外,国际用户可能会将该号码表示为:

+44 (0)1225 123456

含义“如果从英国境外拨打电话,请拨打本地国际电话代码,然后拨打44,然后拨打区号,省略前导零,然后是用户号码”。只需数字就很难传达这么多信息。除非机器而不是人类拨打该号码,否则有时候让用户输入他们喜欢的内容会更好。