我正在为一个介绍编程类做一个实验室
我必须确保输入一个整数。我以为这会做到这一点,但当我写了一封信时,它会在一个无限循环中重复。
我在另一篇文章中找到了这个解决方案
int num;
char term;
if (scanf("%d%c", &num, &term) != 2 || term != '\n')
printf("failure\n");
else
printf("valid integer followed by enter key\n");
但我不确定我做错了什么。为什么它不能在我的代码中工作?
#include <stdio.h>
int main(void)
{
int oneVar;
char term;
double numOne;
double numTwo;
double sum;
double dif;
double quo;
double mult;
int checker = 1;
do
{
printf("Please choose one of the following:\n""1) Add\n""2) Subtract\n""3) Divide\n""4) Multiply\n""5) Quit\n");
if (scanf("%d%c" , &oneVar ,&term) != 2 || term != '\n')
{
printf ("This is not valid input\n\n");
checker = 1;
}
else if (oneVar == 5)
{
printf("Thank you. Goodbye.\n");
checker = 0;
}
else if (oneVar != 1 && oneVar !=2 && oneVar != 3 && oneVar != 4)
{
printf("This is not a valid input\n\n");
checker = 1;
}
else
{
printf("Please enter the first number:\n");
if (scanf("%lf%c" , &numOne ,&term) != 2 || term != '\n')
{
printf ("This is not valid input\n\n");
checker = 1;
}
printf("Please enter the second number:\n");
if (scanf("%lf%c" , &numTwo ,&term) != 2 || term != '\n')
{
printf ("This is not valid input\n\n");
checker = 1;
}
else if (oneVar == 1)
{
sum = numOne + numTwo;
printf("The sum is: %.2lf\n" ,sum);
checker = 0;
}
else if (oneVar == 2)
{
dif = numOne - numTwo;
printf("The difference is: %.2lf\n" ,dif);
checker = 0;
}
else if (oneVar == 3)
{
quo = numOne / numTwo;
printf("The quotient is: %.2lf\n" ,quo);
checker = 0;
}
else if (oneVar == 4)
{
mult = numOne * numTwo;
printf("The product is: %.2lf\n" ,mult);
checker = 0;
}
else if (oneVar == 5)
{
printf("Thank you. Goodbye.\n");
checker = 0;
}
}
} while (checker == 1);
return(0);
}
我的教授发布了这个我不知道它有多帮助,但我认为这可能对某人有所帮助 要确保用户输入的数字是整数,您可以使用强制转换的概念。转换是一种告诉C将变量视为不同类型变量的方法。
所以,如果我有这样的事情:
double myDouble;
myDouble = 5.43;
printf ("%d", (int) myDouble);
它会告诉C打印myDouble,但要把它当成一个整数。只打印5个,您不会遇到任何类型不匹配错误。您可以使用强制转换来检查输入数字是否为整数,方法是将输入与数字的(int)强制转换进行比较。这样的事情应该有效:
if(inputNum == (int) inputNum)
你仍然可以获得1.0和2.0作为有效数字传递,但现在还可以。
答案 0 :(得分:1)
使用%c
“消耗”行尾不是一个好的解决方案。如果用户输入say:
123 abc<newline>
num
将为123,但term
将为空格字符。如果输入一个字母而不是一个数字,扫描将停止而不消耗任何字符,下一个输入调用将由于已经缓冲的行而返回,并且可能仍然没有消耗任何内容。您的程序不断循环,因为每个输入语句都无法使用换行符并立即返回。标准输入函数在返回之前等待完整的行,如果未完全读取行,则输入函数不需要等待。
有许多解决方案,其中许多解决方案(例如您使用的解决方案存在缺陷),下面的方法强制将输入缓冲区刷新到包括换行符。
int check = scanf( "%d", &num ) ;
while( getchar() != '\n' )
{
// do nothing
}
if( check != 2 )
printf("failure\n");
else
printf("valid integer followed by enter key\n");
如果在输入结尾处使用%c
格式说明符,则需要稍微不同的刷新,因为字符输入可能是换行符:
int check = scanf( "%c", &ch ) ;
while( ch != '\n' && getchar() != '\n' )
{
// do nothing
}
答案 1 :(得分:1)
为什么复杂化?
char x = 0;
scanf("%c", &x);
if (x >= 0x41 && x <= 0x7A)
printf("you entered a letter");
在ASCII表中,字母的值介于0x41(“A”)和0x7A(“z”)之间。 因此,您只需要检查输入的ASCII值。 :)