调用scanf后代码崩溃
我是一个编程初学者,我的代码需要帮助。它应该是一个有6个功能的计算器,包括main。四个用于操作,一个用于输入两个数字。当我输入第二个数字时,它就崩溃了。此外,我在将函数调用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
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;
}