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