2015-09-26 3 views
0

Во вход функции я пытался выполнить проверку ввода, которая будет принимать только входные данные из выбранных вариантов. Я попытался использовать только переменную opt, чтобы получить значения из scanf, но когда я сравниваю с if, это дает ошибку, говорящую о сравнении указателя на другой тип.Как назначить значение из char в указатель?

С помощью этого кода мне удалось удалить эту ошибку, и программа теперь запускается, но программа заканчивается после ввода ввода. Кто-нибудь может мне с этим помочь? Спасибо :)

#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

Вам может понадобиться, чтобы прочитать о том, что [ 'scanf'] (http://en.cppreference.com/w/c/io/fscanf) фактически возвращает. Затем вам нужно прочитать, как работают условия в C. –

+0

afaik, scanf здесь сканирует вход пользователя. Вот почему я сравнил сканированное значение с действительными входами. Что-то не так с этим? – fixotherm

+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 все ненулевые значения считаются «истинными», только ноль «ложно». Если ваша система использует ASCII alphabet (скорее всего), то выражение

('1' || '2' || '3' || '4' || 'R' || 'E') 

эквивалентно

(49 || 50 || 51 || 52 || 82 || 69) 

Все подвыражения «истинны» приводит к выражению в то время как «истинный ", который в C эквивалентен 1.

Таким образом, выражение

scanf("%c", &choice) == ('1' || '2' || '3' || '4' || 'R' || 'E') 

эквивалентно

scanf("%c", &choice) == 1 

что и вы должны проверка, но не таким образом.

Что вы должны сделать, это поставить чек внутри цикл для правильной альтернативы, но помните, что я сказал, результат ('1' || '2' || '3' || '4' || 'R' || 'E') будет.

+0

Это сработало. Благодарю. Но он не сообщил о неправильном вводе. DId Я делаю что-то неправильно с проверкой ввода? – fixotherm

+0

Спасибо за ответ, но на самом деле я не понимаю, что вы говорите о том, чтобы поставить чек на правильную альтернативу. Мне очень жаль. Я совершенно новичок в этом. – fixotherm

+0

@fixotherm Либо оператор 'if', либо оператор' switch'. Например. 'if (choice! = '1' && choice! = '2' ...) {printf (« Неверная альтернатива \ n »); } ' –

0

Я думаю, что выше ответ объясняет, почему ваш код не работает очень хорошо, так вот рабочая версия вашего входа функции() и немного более короткая версия функции оператора:

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; 
} 
+0

терминал говорит, что метка case не сводится к целочисленной константе. O.O и что делает дополнительный getchar? o.o – fixotherm

 Смежные вопросы

  • Нет связанных вопросов^_^