1

我正在为入门编程课程做一个实验室

我必须确保输入了一个整数。我以为这样就可以了,但是当我输入一封信时,它会无限循环地重复。

我在另一篇文章中找到了这个解决方案

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 作为有效数字传递,但现在还可以。

4

2 回答 2

1

使用%c“消耗”行尾不是一个好的解决方案。如果用户输入说:

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
}
于 2013-10-25T19:27:56.933 回答
1

为什么要把事情复杂化?

char x = 0;
scanf("%c", &x);
if (x >= 0x41 && x <= 0x7A)
printf("you entered a letter");

在 ASCII 表中,字母的值介于 0x41(“A”)和 0x7A(“z”)之间。因此,您只需要检查输入的 ASCII 值。:)

于 2013-10-25T19:53:49.037 回答