C 使用isdigit验证阶乘程序的输入

C 使用isdigit验证阶乘程序的输入,c,C,我用C编写了下面的代码来制作一个计算任意数的阶乘的程序 我想在程序中添加一些验证/错误处理,例如防止输入随机字符、浮点或负值,因此我使用了isdigit函数 不幸的是,有一个隐藏的问题,我不知道如何解决。当我输入任何输入时,即使是正数,它也会认为它是错误的(即不是数字) #include <stdio.h> #include <ctype.h> int main() { char choice; unsigned long long int factor

我用C编写了下面的代码来制作一个计算任意数的阶乘的程序

我想在程序中添加一些验证/错误处理,例如防止输入随机字符、浮点或负值,因此我使用了
isdigit
函数

不幸的是,有一个隐藏的问题,我不知道如何解决。当我输入任何输入时,即使是正数,它也会认为它是错误的(即不是数字)

#include <stdio.h>
#include <ctype.h>

int main()
{
    char choice;
    unsigned long long int factorial=1;
    int counter,number;
    for(;;)
    {
        printf("Please , enter a positive integer number only : ");
        scanf("%d",&number);
        fflush(stdin);
        if(isdigit(number))
        {
            for(counter=number;counter>1;counter--)
            factorial*=counter;
            printf("The factorial of number %d is %llu",number,factorial);
        }
        else
        {
            printf("\a\aError\n");
            continue;
        }
        printf("\n1-Press c or C if you want to calculate the factorial of a new number\n2-Press any key         if you want to exit the program\n ");
        scanf("%c",&choice);
        if(choice=='c'||choice=='C')
        {
            factorial=1;
            system("cls");
            continue;
        }
        else
        return 0;
    }
}
#包括
#包括
int main()
{
字符选择;
无符号长整型阶乘=1;
整数计数器,数字;
对于(;;)
{
printf(“请仅输入正整数:”);
scanf(“%d”和编号);
fflush(stdin);
if(isdigit(数字))
{
对于(计数器=编号;计数器>1;计数器--)
阶乘*=计数器;
printf(“数字%d的阶乘是%llu”,数字,阶乘);
}
其他的
{
printf(“\a\aError\n”);
继续;
}
printf(“\n1如果要计算新数字的阶乘,请按c或c\n2如果要退出程序,请按任意键”\n”);
scanf(“%c”,选择(&c));
如果(选项=='c'| |选项=='c')
{
阶乘=1;
系统(“cls”);
继续;
}
其他的
返回0;
}
}

您使用的是错误的isdigit。阅读其文档以了解其实际功能

你可能是说:

 if ( number >= 0 && number <= 9 )
因为如果输入失败,该值将保持不变


注意

isdigit检查单个字符是否为十进制数字字符。 但是,您的输入可以是25,多个字符。所以,我改了一部分:L

 char input[30];
 for(;;)
 {
  printf("Please , enter a positive integer number only : ");
  scanf("%s",input);
  if(isdigit(input[0]))
  {
   number = atoi(input);
   for(counter=number;counter>1;counter--)
保持程序片段的其余部分不变。
在这里,isdigit用于检查输入中的第一个字符是否是数字,因此是否是有效的候选字符,以便由atoi转换为整数值。

注意,如果平台是Windows,
fflush(stdin)
定义得很好。如果平台不是Windows,这是一个问题。-注释中MS的相关链接。@JonathanLeffler,链接到MSVC文档。这表明“操作系统”“通常”会进行缓冲,但很明显,在某些情况下,fflush(stdin)在Windows中不起作用。特别是如果你不是在马桶里编程的话!除了应该把运行Windows的机器放在哪里,马桶和Windows还有什么关系?我不知道你的意思是什么;的MSVC手册中说,如果流是开放供输入的,则fflush会清除缓冲区的内容。这句话没有任何回旋余地或不确定之处。它甚至不与stdin绑定;它是任何输入流。OK;接受更正;在Windows上使用MSVC提供的库…请注意12!是适合32位(无符号)整数的最大值,和20!是适合64位(无符号)整数的最大值。除答案外,建议删除
fflush(stdin)
并更改
scanf(“%c”,&choice)
scanf(“%c”,选择(&c))(添加空格)。这将消耗可选的前导空格,包括前几行。不要使用
fflush(stdin)
刷新输入缓冲区——它不做您认为它做的事情。而是声明并
intc
然后在每个处理字符串输入的
scanf
后面放置以下行:
do{c=getchar();}while(c!='\n'&&c!=EOF)。这将从输入缓冲区中删除所有剩余字符。向你自己证明。在上面的代码中输入:
1 2 3
。它将循环3次,在“printf”之后从不暂停。
 char input[30];
 for(;;)
 {
  printf("Please , enter a positive integer number only : ");
  scanf("%s",input);
  if(isdigit(input[0]))
  {
   number = atoi(input);
   for(counter=number;counter>1;counter--)