在函数输入中,我试图进行输入验证,只接受来自给定选项的输入。我尝试仅使用变量opt来获取scanf中的值,但是当我与if进行比较时,它会给出一个错误,说明将指针与另一个类型进行比较。
使用此代码,我有点设法使该错误消失,程序现在运行但程序在我输入选择后结束。谁能帮我这个?谢谢:))
#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;
}
return 0;
}
void input(int *n1, int *n2, char *opt)
{
int valid;
char choice;
printf("Enter first number: \n");
scanf("%d", n1);
printf("Enter second number: \n");
scanf("%d", n2);
getchar();
valid = 0;
while( valid == 0)
{
printf("Addition -> 1\nSubtraction -> 2\nMultiplication -> 3\nDivision -> 4\nReset -> R\nExit -> E\n");
if ( scanf("%c", &choice) == ('1' || '2' || '3' || '4' || 'R' || 'E'))
{
valid = 1;
}
else
{
printf("Invalid input!\n");
}
}
opt = &choice;
}
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;
}
答案 0 :(得分:1)
您显示的程序存在的一个问题是它不会为您提供输入的选项。这是因为参数是通过C中的值传递的,这意味着参数被复制并且更改参数不会更改原始值。
当你这样做时,这是显而易见的
opt = &choice;
一旦函数返回,opt
指针的重新分配将会丢失。
在这种特定情况下,您需要使用取消引用运算符取消引用您传入的指针,并将choice
的值分配给解除引用的指针:
*opt = choice;
您的代码中还有许多其他错误,包括您没有注意到的错误,因为它有效,但不符合您的预期。
让我们采取条件
scanf("%c", &choice) == ('1' || '2' || '3' || '4' || 'R' || 'E')
scanf
函数返回成功解析的格式数,或EOF
。在你的情况下,如果它读取并解析了一个字符,它将返回1
。
表达式('1' || '2' || '3' || '4' || 'R' || 'E')
是没有按预期工作的表达式。在C中,所有非零值都被认为是&#34;真&#34;,只有零是&#34;假&#34;。如果您的系统使用ASCII alphabet(最有可能),那么使用表达式
('1' || '2' || '3' || '4' || 'R' || 'E')
相当于
(49 || 50 || 51 || 52 || 82 || 69)
所有子表达式都是&#34; true&#34;导致while表达为&#34; true&#34;在C中相当于1
。
所以表达式
scanf("%c", &choice) == ('1' || '2' || '3' || '4' || 'R' || 'E')
相当于
scanf("%c", &choice) == 1
这是应该检查的内容,但不是这样。
你应该做的是在循环中检查以获得正确的替代方案,但请记住我所说的('1' || '2' || '3' || '4' || 'R' || 'E')
的结果。
答案 1 :(得分:0)
我认为上面的答案解释了为什么你的代码不能很好地运行,所以这里是input()函数的工作版本和运算符函数的更短版本:
void input(int *n1, int *n2, char *opt)
{
int valid;
char choice = '0';
printf("Enter first number: \n");
scanf("%d", n1);
printf("Enter second number: \n");
scanf("%d", n2);
getchar();
valid = 0;
while( valid == 0)
{
printf("Addition -> 1\nSubtraction -> 2\nMultiplication -> 3\nDivision -> 4\nReset -> R\nExit -> E\n");
choice = getchar();
switch (choice) {
case ('1', '2', '3', '4', 'R', 'E'):
valid = 1;
break;
default: printf("Invalid input!\n");
break;
}
}
*opt = choice;
}
和你可以做的操作员
int add(n1, n2)
{
return n1 + n2;
}