2015-08-10 1 views
0

Почему мой код не работает - я не понимаю! Я прочитал другой вопрос, что это «дубликат» и понимание ситуации с «scanf». Но в этой ситуации я предоставил оператор switch в случае, когда переменной будет пустое пространство, в котором он просто выйдет из цикла. Это не вызовет проблем, поскольку цикл будет продолжаться до тех пор, пока пользователь ничего не вводит - он будет просто проходить цикл 2 раза (один для ввода пользователя, 1 для пробелов).Оператор switch не работает, где переменная ' n', например enter?

#include <stdio.h> 

int main(void) { 

    setbuf(stdout, 0); 
    int op = 0; 

    do{ 
     int num1; 
     int num2; 

     printf("\n\nMenu of operations\n1. + \n2. - \n3. * \n4./\n5. %%"); 
     printf("\nEnter operation number to be executed: "); 

     op = getchar(); 

     printf ("\nEnter first integer: "); 
     scanf ("%d", &num1); 

     printf ("Enter second integer: "); 
     scanf ("%d", &num2); 

     switch (op){ 
     case '1': 
      printf ("\n%d + %d = %d", num1, num2, num1 + num2); 
      break; 

     case '2': 
      printf ("\n%d - %d = %d", num1, num2, num1 - num2); 
      break; 

     case '3': 
      printf ("\n%d * %d = %d", num1, num2, num1 * num2); 
      break; 

     case '4': 
      printf ("\n%d/%d = %f", num1, num2, (float)num1/num2); 
      break; 

     case '5': 
      printf ("\n%d %% %d = %d", num1, num2, num1%num2); 
      break; 

     case '\n': 
     case '\t': 
     case ' ' : 
      break; 

     default: 
      printf ("An invalid menu option"); 
      break; 
     } 



    }while (op!=0); 

    return 0; 
} 

И результаты так:

Menu of operations 
1. + 
2. - 
3. * 
4./
5. % 
Enter operation number to be executed: 4 //first time around- works fine 

Enter first integer: 28 
Enter second integer: 5 

28/5 = 5.600000 

Menu of operations 
1. + 
2. - 
3. * 
4./
5. % 

Menu of operations 
1. + 
2. - 
3. * 
4./
5. % 
Enter operation number to be executed: 
Enter first integer: 4 //so one cannot type after the statement "Enter operation number to be executed:" 

Я понимаю, что есть еще «\ п» символ в моем буфере из-за ввода, который получает присваивается переменной оп в GetChar () заявление. Но если это так, то оператор switch должен позаботиться об этом. Чтобы быть конкретным, он должен перейти к случаю, когда переменная op равна '\ n' или, альтернативно, '\ t', '', которую я написал в моем коде.

 case '\n': 
     case '\t': 
     case ' ' : 
      break; 

Так учил нас наш лектор, но почему это не будет работать в этом случае?

я нашел еще одну ошибку я получил, что могло бы помочь найти источник этой проблемы ...

Когда я продолжаю со вторым временем ввода num1 и num2 (где первая проблема лежит в не позволяя мне для ввода переменной оп), программа дает следующее:

Enter operation number to be executed: 

Enter first integer: 2 Enter second integer: 4 Вы можете спросить, почему это вторая проблема, но в моем коде, я сказал, что если оп было что-то еще, кроме 1,2,3 , 4,5, \ n, \ t, '', он должен запустить то, что находится по умолчанию, и напечатать «Недопустимый параметр меню».

Однако, это не делает ничего из этого. Кто-нибудь имеет представление о том, что происходит?

Кроме того, я пытался делать то, что кто-то предложил в comment- поэтому я отредактировал мой код так:

 while (getchar() != '\n') 
    { 
     op = getchar(); 
    } 

Однако, это еще не решает проблему ... Я получаю тот же самый результат. Поскольку newline/enter здесь не проблема, кто-нибудь знает, что такое?

+0

Это не так, и это меня раздражало, что кто-то сказал, что это дубликат, потому что теперь я не могу получить ответы. Thankyou «very much»:/ – breakstorm

ответ

1

Проблема возникает здесь, так как вы не очистки входной буфер после завершения первого входного значения.

Для разработки, то ENTER нажатия клавиши используется для полных входа в случае второго целого числа (то есть, сканируя значение num2), целое значение сканируется, но символ новой строки (\n) из-за на ENTER остается в буфере, который считывается следующим вызовом getchar().

Решения: Перед возвращения в начало цикла, съедают ничего запасного во входном буфере.Вы можете использовать что-то вроде (псевдо-код)

while (getchar() != `\n`); 

в конце цикла к чистого входного буфера.

+0

Спасибо, что объяснили, что было не так для меня! Я понимаю проблему сейчас, но это было то, что я попытался разрешить в коде, добавив случай, когда символ будет новой строкой, в которой он просто выйдет из цикла. Поскольку переменная «op» не будет равна нулю, я думал, что она пропустит любые вводимые символы (поскольку она просто перейдет к выражению «break;» then) и дождитесь, когда символ будет введен пользователем после ввода символа ». Почему этого не происходит, если я могу спросить? : D Я очень ценю вашу помощь !! – breakstorm

+0

Подсказка @breakstorm: проверка состояния выполняется _after_ тело цикла. :-) –

+0

О, правильно xD Это имеет смысл. – breakstorm

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