c - 如何将字符中的值赋给指针?

标签 c function validation

在函数输入中,我试图进行输入验证,该验证仅接受给定选择的输入。我尝试仅使用变量 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/

相关文章:

c++ - 创建 gnome-shell 小程序/小部件?

c - 共享库页面是匿名的吗?

c++ - 线程 : How to calculate precisely the execution time of an algorithm (duration of function) in C or C++?

c++ - 将 Symbian 描述符形式的非常大的整数转换为无符号字符*

c - 字符串指针在函数之间不起作用

javascript - JQuery 删除模糊上的空白

javascript - React 默认调用不带括号的函数 useState

python - 基于另一列的字符串搜索,使用 Spark Dataframe 中的函数创建新列

c++ - DD/MM/YYYY 输入验证

java - 根据其他 xml 中的值目录验证 XML