C中的数字输入验证

时间:2013-10-25 18:42:06

标签: c validation integer character

我正在为一个介绍编程类做一个实验室

我必须确保输入一个整数。我以为这会做到这一点,但当我写了一封信时,它会在一个无限循环中重复。

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

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

2 个答案:

答案 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值。 :)