while循环中scanf后代码崩溃
问题在于这个函数。它应该验证两个变量作为整数的输入。我做错了什么?谢谢:) 我使用if-else语句检查变量valid中的更改,以便在给出正确的输入后退出循环。即使我输入了正确的值,代码仍然崩溃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(
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
returnEOF
如果它未能分配给第一个接收参数。在这种情况下,如果数据成功读入&a
,它将返回1
同样,变革也是如此
if(scanf("%d", b) != 0)
到
哎呀。我想我错过了。但是循环现在不会退出,即使它接受了值:(谢谢。它现在接受了值,但循环不会退出。你是否尝试在调试器中运行它?如果你的意思是像在cmd中一样,是的。我也在尝试自己找到它。:DNo,我的意思是使用调试器:嗯…还没有。我现在就试试。谢谢
if(scanf("%d", b) != 0)
if(scanf("%d", &b) == 1)
// ^^^ ^^^^