调用scanf后代码崩溃

调用scanf后代码崩溃,c,function,C,Function,我是一个编程初学者,我的代码需要帮助。它应该是一个有6个功能的计算器,包括main。四个用于操作,一个用于输入两个数字。当我输入第二个数字时,它就崩溃了。此外,我在将函数input()中的值返回到主函数以执行操作时遇到问题。也许这和扫描opt有关 #include <stdio.h> int add(int n1, int n2); int subtract(int n1, int n2); int multiply(int n1, int n2); int divide(int

我是一个编程初学者,我的代码需要帮助。它应该是一个有6个功能的计算器,包括main。四个用于操作,一个用于输入两个数字。当我输入第二个数字时,它就崩溃了。此外,我在将函数
input()
中的值返回到主函数以执行操作时遇到问题。也许这和扫描opt有关

#include <stdio.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);


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


    input(&n1, &n2);

    printf("Addition -> 1\nSubtraction -> 2\nMultiplication -> 3\nDivision -> 4\nReset -> R\nExit -> E\n");

    scanf("%c", &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 sum is %d\n", ret); 
                break;              
            case '4': 
                ret = divide(n1, n2);
                printf("The sum is %d\n", ret);
                break;
    }

    return 0;   

}


void input(int *n1, int *n2)
{
    int a, b;   

    printf("Enter first number: \n");
    scanf("%d", &n1);

    printf("Enter second number: \n");
    scanf("%d", &n2);   

    *n1 = a;
    *n2 = b;
}

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

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

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);
内部主(空)
{
int n1、n2、ret;
字符选择;
输入(&n1和&n2);
printf(“添加->1\n复制->2\n复制->3\n复制->4\n重新设置->R\n下一步->E\n”);
scanf(“%c”和&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);
打破
}
返回0;
}
无效输入(int*n1,int*n2)
{
INTA,b;
printf(“输入第一个数字:\n”);
scanf(“%d”&n1);
printf(“输入第二个数字:\n”);
扫描频率(“%d”和“n2”);
*n1=a;
*n2=b;
}
添加(n1,n2)
{
int结果;
结果=(n1+n2);
返回结果;
}
减去(n1,n2)
{
int结果;
结果=(n1-n2);
返回结果;
}
除法(n1,n2)
{
int结果;
结果=(n1/n2);
返回结果;
}
乘(n1,n2)
{
int结果;
结果=(n1*n2);
返回结果;
}

我做得对吗

scanf
接受指向整数的指针,但错误地将指针传递给指向整数的指针

修正:

您不需要
a
b
,输入的值直接写入指针指向的对象。在调用
scanf(“%c”,&opt)之前,您还必须从输入流中读取
'\n'
在主功能中。否则,您将在希望读取选项字符时读取换行符


在评论中回答您的问题:

int *n1

n1
声明为指向整数的指针。

scanf
接受指向整数的指针,但错误地将指针传递给指向整数的指针

修正:

您不需要
a
b
,输入的值直接写入指针指向的对象。在调用
scanf(“%c”,&opt)之前,您还必须从输入流中读取
'\n'
在主功能中。否则,您将在希望读取选项字符时读取换行符


在评论中回答您的问题:

int *n1

n1
声明为指向整数的指针。

问题出在
input

printf("Enter first number: \n");
scanf("%d", &n1);

printf("Enter second number: \n");
scanf("%d", &n2);   
%d
格式说明符需要一个
int*
参数。由于
n1
n2
已经是
int*
,这意味着
&n1
&n2
属于
int**
类型。这会导致分段错误

要解决此问题,只需传入
n1
n2

void input(int *n1, int *n2)
{
    printf("Enter first number: \n");
    scanf("%d", n1);

    printf("Enter second number: \n");
    scanf("%d", n2);   

    getchar();
}
您会注意到,如果执行此操作,则不需要
a
b
。还要注意调用
getchar()
来使用输入缓冲区中的换行符。如果不这样做,换行符将被
main
中的
scanf
拾取,并且不会输入switch语句


另外,您的四个数学函数没有指定返回类型。由于这些函数的原型将它们声明为返回
int
,并且
int
是函数的默认返回类型,因此它能够正常工作。但是,您应该始终指定返回类型。

问题出在
输入中:

printf("Enter first number: \n");
scanf("%d", &n1);

printf("Enter second number: \n");
scanf("%d", &n2);   
%d
格式说明符需要一个
int*
参数。由于
n1
n2
已经是
int*
,这意味着
&n1
&n2
属于
int**
类型。这会导致分段错误

要解决此问题,只需传入
n1
n2

void input(int *n1, int *n2)
{
    printf("Enter first number: \n");
    scanf("%d", n1);

    printf("Enter second number: \n");
    scanf("%d", n2);   

    getchar();
}
您会注意到,如果执行此操作,则不需要
a
b
。还要注意调用
getchar()
来使用输入缓冲区中的换行符。如果不这样做,换行符将被
main
中的
scanf
拾取,并且不会输入switch语句

另外,您的四个数学函数没有指定返回类型。由于这些函数的原型将它们声明为返回
int
,并且
int
是函数的默认返回类型,因此它能够正常工作。但是,您应该始终指定返回类型。

scanf(“%c”,&opt);避免此操作以获取字符作为输入。。 而是使用scanf(“%s”和&opt)以获取字符输入

我认为这个答案很有帮助。

scanf(“%c”和&opt);避免此操作以获取字符作为输入。。 而是使用scanf(“%s”和&opt)以获取字符输入


我认为这个答案很有帮助。

您的输入函数有几个问题:

void input(int *n1, int *n2)
{
    int a, b;   

    printf("Enter first number: \n");
    scanf("%d", &n1);
这(最有可能)是导致崩溃的根本原因。函数参数
n1
已经是指向
int
的指针,它包含您要在
main
中写入的对象的地址
&n1
是指向
int
的指针,并提供
n1
函数参数的地址。因此,与其将整数值写入
n1
所指向的内容,不如
    *n1 = a;
    *n2 = b;
    scanf( "%d", &a ); // a is not already a pointer, need the & operator
    ...
    scanf( "%d", &b ); // same as above
    ...
    *n1 = a;
    *n2 = b;
}