我在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;
}
}
答案 0 :(得分:1)
您使用的是isdigit错误。阅读其文档,了解它的实际功能。
你可能意味着:
if ( number >= 0 && number <= 9 )
但是,您还需要检查scanf是否成功。如果他们输入了某些字词,那么scanf("%d"
会失败并且不会更新number
,因此在这种情况下尝试访问number
会访问未初始化的变量。要处理这个问题,您可以检查scanf
的返回值,或执行:
int number = -1;
scanf("%d",&number);
因为如果输入失败,该值将保持不变。
答案 1 :(得分:0)
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转换为整数值的有效候选。