while循环中scanf后代码崩溃

while循环中scanf后代码崩溃,c,function,C,Function,问题在于这个函数。它应该验证两个变量作为整数的输入。我做错了什么?谢谢:) 我使用if-else语句检查变量valid中的更改,以便在给出正确的输入后退出循环。即使我输入了正确的值,代码仍然崩溃 void input(int *n1, int *n2, char *opt) { int valid = 0; int v2 = 0; char choice; int a, b; while (v2 == 0) { printf(

问题在于这个函数。它应该验证两个变量作为整数的输入。我做错了什么?谢谢:)

我使用if-else语句检查变量valid中的更改,以便在给出正确的输入后退出循环。即使我输入了正确的值,代码仍然崩溃

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;
}
#包括
#包括
整数相加(整数n1,整数n2);
整数减去(整数n1,整数n2);
整数乘法(整数n1,整数n2);
整数除法(整数n1,整数n2);
无效输入(int*n1、int*n2、char*opt);
内部主(空)
{
int n1、n2、ret;
字符选择;
开始:
输入(&n1,&n2,&opt);
开关(opt)
{
案例“1”:
ret=添加(n1,n2);
printf(“总和为%d\n”,ret);
打破
案例“2”:
ret=减去(n1,n2);
printf(“差值为%d\n”,ret);
打破
案例“3”:
ret=乘法(n1,n2);
printf(“产品是%d\n”,ret);
打破
案例“4”:
ret=除以(n1,n2);
printf(“商为%d\n”,ret);
打破
案例“R”:
转到开始;
打破
案例“E”:
printf(“再见!\n”);
返回0;
打破
}
转到开始;
}
无效输入(int*n1、int*n2、char*opt)
{
int valid=0;
int v2=0;
字符选择;
INTA,b;
而(v2==0)
{
printf(“输入第一个数字:\n”);
如果(scanf(“%d”,&a)==1)
{
而(v2==0)
{
printf(“输入第二个数字:\n”);
如果(扫描频率(“%d”,&b)==1)
{
v2=1;
getchar();
}
其他的
{
getchar();
printf(“无效输入!\n”);
}
}
getchar();
}
其他的
{
getchar();
printf(“无效输入!\n”);
}
}
while(有效==0)
{
printf(“添加->1\n复制->2\n复制->3\n复制->4\n重新设置->R\n下一步->E\n”);
scanf(“%c”,选择(&c));
如果(选项=='r'| |选项=='e')
{
选择=toupper(选择);
}
如果((选项='1')| |(选项='2')| |(选项='3')| |(选项='4')|(选项='R')| |(选项='E'))
{
有效=1;
}
其他的
{
printf(“无效输入!\n\n”);
}
}
*opt=选择;
*n1=a;
*n2=b;
}
整数加(n1,n2)
{
int结果;
结果=(n1+n2);
返回结果;
}
int减法(n1,n2)
{
int结果;
结果=(n1-n2);
返回结果;
}
整数除法(n1,n2)
{
int结果;
结果=(n1/n2);
返回结果;
}
乘(n1,n2)
{
int结果;
结果=(n1*n2);
返回结果;
}
而不是

        if(scanf("%d", a) != 0)
你应该使用

        if(scanf("%d", &a))
Scanf可能返回0,1或EOF,其中只有1表示输入中没有错误! 但是,如果a是指向某个整数地址位置的指针,则可以使用前一个代码。将其更改为输入b

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

scanf
return
EOF
如果它未能分配给第一个接收参数。在这种情况下,如果数据成功读入
&a
,它将返回
1

同样,变革也是如此

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


哎呀。我想我错过了。但是循环现在不会退出,即使它接受了值:(谢谢。它现在接受了值,但循环不会退出。你是否尝试在调试器中运行它?如果你的意思是像在cmd中一样,是的。我也在尝试自己找到它。:DNo,我的意思是使用调试器:嗯…还没有。我现在就试试。谢谢
            if(scanf("%d", b) != 0)
            if(scanf("%d", &b) == 1)
                       // ^^^  ^^^^