如何将char中的值赋给指针?

时间:2015-09-26 01:26:45

标签: 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;
}

2 个答案:

答案 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;
}