scanf in while循环后代码崩溃

时间:2015-09-26 06:08:41

标签: c function

问题在于此功能。它应该将两个变量的输入验证为整数。我做错了什么? O__O谢谢:)

我使用if else语句来检查变量的变化是否有效,以便在给出正确的输入后它将退出循环。即使我输入正确的值,代码仍会崩溃。

void input(int *n1, int *n2, char *opt)
{
    int valid = 0;
    int v2 = 0;
    char choice;
    int a, b;


    while (v2  == 0)
    {
        printf("Enter first number: \n");
        if(scanf("%d", &a) == 1)
        {
            while(v2 == 0)
            {
                printf("Enter second number: \n");
                if(scanf("%d", &b) == 1)

                {
                    v2 =1;
                    getchar();
                }
                else
                {
                    getchar();
                    printf("Invalid input!\n");
                }
            }
getchar();          
        }
        else
        {
            getchar();
            printf("Invalid input!\n");
        }
    }



    while( valid == 0)
    {
        printf("Addition -> 1\nSubtraction -> 2\nMultiplication -> 3\nDivision -> 4\nReset -> R\nExit -> E\n");
        scanf("%c", &choice);
        if (choice == 'r' || choice == 'e')
        {
            choice = toupper(choice);
        }
        if ((choice  == '1') ||  (choice  == '2') ||  (choice  == '3') ||  (choice  == '4') ||  (choice  == 'R') ||  (choice  == 'E'))  
        {
            valid = 1;
        }
        else
        {
            printf("Invalid input!\n\n");
        }
    }
    *opt = choice;
    *n1  = a;
    *n2  = b;
}

以下是整个代码供参考。之前的答案能够解决崩溃问题。现在,要么循环没有退出,要么它无法正常工作。

#include <stdio.h>
#include <ctype.h>

int add(int n1, int n2);
int subtract(int n1, int n2);
int multiply(int n1, int n2);
int divide(int n1, int n2);
void input(int *n1, int *n2, char *opt);


int main(void)
{
    int n1, n2, ret;
    char opt;

    start:
    input(&n1, &n2, &opt);

    switch(opt)
{
            case '1': 
                ret = add(n1, n2);
                printf("The sum is %d\n", ret);
                break;
            case '2':
                ret = subtract(n1, n2);
                printf("The difference is %d\n", ret);
                break;
            case '3': 
                ret = multiply(n1, n2);
                printf("The product is %d\n", ret); 
                break;              
            case '4': 
                ret = divide(n1, n2);
                printf("The quotient is %d\n", ret);
                break;
            case 'R':
                goto start;
                break;
            case 'E':
                printf("Goodbye!\n");
                return 0;
                break;
    }
    goto start; 
}


void input(int *n1, int *n2, char *opt)
{
    int valid = 0;
    int v2 = 0;
    char choice;
    int a, b;


    while (v2  == 0)
    {
        printf("Enter first number: \n");
        if(scanf("%d", &a) == 1)
        {
            while(v2 == 0)
            {
                printf("Enter second number: \n");
                if(scanf("%d", &b) == 1)

                {
                    v2 =1;
                    getchar();
                }
                else
                {
                    getchar();
                    printf("Invalid input!\n");
                }
            }
getchar();          
        }
        else
        {
            getchar();
            printf("Invalid input!\n");
        }
    }



    while( valid == 0)
    {
        printf("Addition -> 1\nSubtraction -> 2\nMultiplication -> 3\nDivision -> 4\nReset -> R\nExit -> E\n");
        scanf("%c", &choice);
        if (choice == 'r' || choice == 'e')
        {
            choice = toupper(choice);
        }
        if ((choice  == '1') ||  (choice  == '2') ||  (choice  == '3') ||  (choice  == '4') ||  (choice  == 'R') ||  (choice  == 'E'))  
        {
            valid = 1;
        }
        else
        {
            printf("Invalid input!\n\n");
        }
    }
    *opt = choice;
    *n1  = a;
    *n2  = b;
}


int add(n1, n2)
{
    int result;
    result = (n1+n2);
    return result;
}

int subtract(n1, n2)
{
    int result;
    result = (n1-n2);               
    return result;
}

int divide(n1, n2)
{
    int result;
    result = (n1/n2);
    return result;
}

multiply(n1, n2)
{
    int result;
    result = (n1*n2);
    return result;
}

2 个答案:

答案 0 :(得分:2)

更改

    if(scanf("%d", a) != 0)

    if(scanf("%d", &a) == 1)
                   //  ^^^^ This is the right check
           //     ^^^ Missing &

scanf如果无法分配给第一个接收参数,则返回EOF。在这种情况下,如果数据已成功读入1,则会返回&a

同样,改变

            if(scanf("%d", b) != 0)

            if(scanf("%d", &b) == 1)
                       // ^^^  ^^^^

答案 1 :(得分:0)

而不是

        if(scanf("%d", &a))

你应该使用

{{1}}

Scanf可以返回0,1或EOF,其中只有1表示输入没有错误! 但是,如果你的a是一个指向某个整数地址位置的指针你可以使用前一个代码。也可以输入b来改变它