在函数输入中,我试图进行输入验证,该验证仅接受给定选择的输入。我尝试仅使用变量 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;
}
最佳答案
您所显示的程序的问题之一是它不会为您提供输入的选项。这是因为在 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 中,所有非零值都被视为“真”,只有零被视为“假”。如果您的系统使用 ASCII alphabet (最有可能)然后是表达式
('1' || '2' || '3' || '4' || 'R' || 'E')
相当于
(49 || 50 || 51 || 52 || 82 || 69)
所有子表达式都为“true”,导致 while 表达式为“true”,这在 C 中相当于 1
。
所以表达式
scanf("%c", &choice) == ('1' || '2' || '3' || '4' || 'R' || 'E')
相当于
scanf("%c", &choice) == 1
这是您应该检查的内容,但不是以这种方式。
您应该做的是在循环内检查正确的替代方案,但请记住我所说的 ('1' || '2' || ' 的结果3' || '4' || 'R' || 'E')
将是。
关于c - 如何将字符中的值赋给指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792709/