我在笔记中找到了一个函数,其中包含以下内容:
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
(在结构中)。
我想做的就是检查电话号码中没有字母。
答案 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
!!
避免了使用最常用的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,然后拨打区号,省略前导零,然后是用户号码”。只需数字就很难传达这么多信息。除非机器而不是人类拨打该号码,否则有时候让用户输入他们喜欢的内容会更好。