与if一起使用isdigit

时间:2018-07-10 02:11:30

标签: c

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总是向我显示“数字”消息

3 个答案:

答案 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)我已可靠地告知作者实际上很聪明,而且非常好看:-)