2015-11-02 2 views
-3

Я новичок в программирования C и, как я проходил через мои задания для моего курса языка с, я наткнулся на проблему ...Вложенный коммутатор: почему вторая команда коммутатора не принимает вход?

int main() { 
char one, ona, onb; 

/*code for choices (a), (b), and (c) here*/ 
scanf ("%c", &one); 

switch (one) { 
    case 'a': 
     /*code for choices (d), and (e) here*/ 
     scanf ("%c", &ona); 

     switch (ona) { 
      case 'd': 
       printf ("end"); 
       break; 
      case 'e': 
       printf ("continue"); 
       break; 
     } 
     break; 

    case 'b': 
     /*code for case 'b' here*/ 
     break; 

    case 'c': 
     /*code for case 'c' here*/ 
     break; 
} 

system ("pause > nul"); 
getch(); 
return 0; 
} 

моих вложенных команд коммутатора (те, под ONA и ONB) не работает, когда я компилирую & запустил консольное приложение?

Я проверил все перерывы; команды, и они все там? есть что-то, чего я не вижу/делаю неправильно?

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

я использую систему («pasue> NUL») после несколько PRINTF statments, если это помогает найти ответ? (также, я использую dev-C++, поскольку это было рекомендуемое приложение, которое наш профессор сказал нам использовать)

Я надеюсь, что кто-то может найти то, что я неправильно закодировал ;; Огромное спасибо заранее! :)

+8

Что означает «не работает»? – user93353

+2

Проблема заключается не в вашем коде, а в ваших вводах. Тест с «ad» (например) будет работать. –

+0

хорошо, когда я запускаю программу и добираюсь до той части, где должен работать рабочий переключатель (ona), это не так, и он переходит прямо к последней части кода> printf ("\ n \ n"); (...) return 0; } :( – fujisaki

ответ

0

Спецификатор формата %c до scanf будет соответствовать любому символу, включая новую строку. После первого scanf введенный вами символ помещается в one, а новая строка остается во входном буфере. Следующий scanf берет новую строку, оставшуюся в буфере, и в результате вы ничего не получите.

Именно поэтому добавление дополнительного scanf похоже исправить вашу проблему.

При использовании %c вы должны положить перед ним пробел в шаблоне. Пробел будет соответствовать и отбрасывать любые новые строки.

Меняем эти:

scanf ("%c", &one); 
... 
scanf ("%c", &ona); 
... 
scanf ("%c", &onb); 

К этим:

scanf (" %c", &one); 
... 
scanf (" %c", &ona); 
... 
scanf (" %c", &onb); 

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

1

Возможно, вы напечатали что-то вроде «< введите > d», в результате чего ваш второй scanf будет читать ключ ввода. Если вы пишете код для чтения символов, вы должны ввести символы. Если вы собираетесь вводить строки, напишите код для чтения строк.

+0

привет! я так сожалею о том, что беспокою вас, но как мне удастся избежать после ввода «a», поскольку код, который я закодировал, не выполняется автоматически после ввода «a»? большое спасибо !!:) – fujisaki

+1

@fujisaki Напишите код, который делает то, что вы на самом деле хотите. Если вы хотите прочитать * строки *, напишите код, который читает строки. Или, возможно, вам следует написать функцию, которая читает символ, но игнорирует символы новой строки. Код, который вы хотите. –

+0

Я добавил еще один 'scanf' перед' scanf ("% c", &ona); 'и' switch (ona) 'наконец-то побежал! Вероятно, есть лучший способ исправить мою проблему, но haha ​​ спасибо вам большое для ответа !! Я очень благодарен !! – fujisaki

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