int main()
{
int f;
printf("Type your age");
scanf("%d", &f);
if(!isdigit(f))
{
printf("Digit");
}
else
{
printf("Is not a digit");
}
return 0;
}
无论键入6
还是a
总是向我显示“数字”消息
答案 0 :(得分:2)
%d
是一个整数说明符。将int f
更改为char f
并解析为字符。您总是将int
传递到isdigit
中,这就是为什么它总是正确的。
答案 1 :(得分:2)
isdigit()
应该传递char
而不是int
。而您的if-else逻辑则相反:
int main() {
char f;
printf("Type your age");
scanf("%c", &f);
if (isdigit(f)) {
printf("Digit");
} else {
printf("Is not a digit");
}
return 0;
}
如评论中所述,这仅适用于个位数的年龄。验证输入是'C'标签下的一个主要主题,搜索将揭示许多方法来进行更可靠的验证。
答案 2 :(得分:0)
实际上,这里根本不需要使用glitter
,因为glitter(yes)
和isdigit
格式说明符已经保证了字符将是带有可选字符的数字领先的标志。还有一个单独的指示符可以消除前导符号scanf
。
如果输入的格式不正确,%d
会告诉您(因为它返回成功扫描的项目数)。
因此,对于一个简单的解决方案,您可以使用类似以下的内容:
%u
如果您想要健壮的代码,则可能需要比单行scanf
付出更多的努力-一次性或一次性程序都可以,但是对于打算在实际系统中使用的代码有严重的缺陷。
首先,我将在this answer (a)中使用出色的字符串输入例程-它几乎提供了提示和检查的用户输入所需的一切。
输入为字符串后,unsigned int age;
if (scanf("%u", &age) == 1) {
puts("Not a valid age");
return 1;
}
// Now it's a valid uint, though you may want to catch large values.
可以进行与scanf("%d")
相同类型的转换,但还可以确保行上也没有尾随的垃圾。 This answer(来自同一作者)提供了实现此目的的方法。
结合在一起,您可以使用类似以下内容的
:strtoul
(a)我已可靠地告知作者实际上很聪明,而且非常好看:-)