2016-06-04 3 views
-1

Я пытаюсь собрать операнд (+, -, *, /) из ввода. Когда я пытаюсь сделать это, вход * и/принимается, и код работает. Когда я вводим + или -, генерируется исключение по умолчанию.C Программирование: getchar() не принимает «+» или «-» для ввода, но принимает «*» и «/»?

Что происходит ?! Есть ли какая-то проблема с символами + или - в getchar? Могу ли я попытаться ссылаться на него по значению ascii?

Я принимаю это как поплавок, а затем получаю. Это может быть проблема?

float result = 0.0; 
float userEntry = 0.0; 
char getOperand; 

void main(){ 

printf("Calculator is on\n"); 
printf("Initial value is 0.0, please issue an operation in the following format: ex. +5 -5 *5 or /5. Do not add more than one number to the total.\n"); 
scanf("%3f", &userEntry); 
getOperand = getchar(); 
printf("%f", userEntry); 
putchar(getOperand); 

switch(getOperand){ 

    case '+': 
     printf("addition\n"); 
     break; 
    case '-': 
     printf("subtraction\n"); 
     break; 
    case '/': 
     printf("division\n"); 
     break; 
    case '*': 
     printf("multiplication\n"); 
     break; 
    default: 
     printf("UnknownOperatorException is thrown.\n"); 
     break; 

    } 
} 
+2

'getOperand' должно быть' int', так как 'GetChar()' 'возвращает int'. Это также не 'void main()' но 'int main (void)' или 'int main (int argc, char * arg [])'. – pzaenger

+0

'+ 5' и' -5' являются действительными числами. Возможно, вы захотите переосмыслить свой метод ввода. –

+1

Код принимает операнд * после * значение, но это не то, как вы описываете проблему или что она предлагает в тексте подсказки. Вы уверены, что это код, о котором вы говорите? Этот код не будет работать ни с входом, как описано, но по другой причине. – Clifford

ответ

3

Проблема заключается в том, что +5 и -5 читается как 5 и -5 по scanf функции оставляя ничего для чтения с помощью функции getchar./и * не распознается scanf с данным форматом, и чтение останавливается после их достижения, оставляя их для getchar.

Вместо этого вы можете позвонить по телефону getchar перед вызовом scanf.

Вот excample его работать, просто переключая звонки на scanf и getchar вокруг:

http://ideone.com/Jlx7II

Вход:

+5 

Ouptut:

Calculator is on 
Initial value is 0.0, please issue an operation in the following format: ex. +5 -5 *5 or /5. Do not add more than one number to the total. 
5.000000+addition 
+0

Yay! Спасибо! :) Это было прекрасно. –

2

Чтобы предотвратить операнд из интерпретируются как знак, один scanf() вызова с дополнительным аргументом, также может быть использован:

scanf(" %c%3f", &getOperand, &userEntry);//leading space instructs trailing '\n's consumed 

без вызова getchar() вообще.

Распечатка для добавления -1:

Calculator is on 
Initial value is 0.0, please issue an operation in the following format: ex. +5 -5 *5 or /5. Do not add more than one number to the total. 
+-1 
-1.000000+addition 
+1

И когда вы расширяете свою программу до цикла для другого вычисления, вам понадобится 'space' перед спецификатором формата'% c', который говорит 'scanf' игнорировать' newline', который остался на входе буфера после предыдущего цикла. 'scanf ("% c% 3f ", & getOperand, & userEntry);' –

+0

У вас отличный глаз @Weather Vane.Спасибо, что указал на эту случайную опечатку с довольно серьезными последствиями! – user3078414