Ваша проблема в обработке control-Z не в том, чтобы оставить оператор switch
, а в том, что он while
.
В системе Windows, когда пользователь нажимает control-Z в начале строки ввода, программное обеспечение будет действовать аналогично концу файла. Примечательно, что при выполнении scanf("%c", &choose);
не будет входных данных для чтения, поэтому в choose
ничего не будет сохранено. Вместо этого scanf
вернет EOF
, чтобы указать, что не может быть достигнуто совпадение с "%c"
(поскольку данные не были доступны). Однако ваш код не проверяет возвращаемое значение scanf
, поэтому он не увидит этого. Один из способов исправить это:
while (1)
{
int n = scanf("%c", choose);
if (n != 1) // Did scanf match %c and store something in choose?
break; // No, so break out of the while loop.
switch (choose)
…
}
Тогда возникает вопрос о том, что должно быть в выражении switch
. Вы говорите, что вам «необходимо обработать все входы от коммутатора». A char
обычно имеет 256 возможных значений. Таким образом, если в switch
нет 256 case
меток, вы не обрабатываете все входные данные в операторе switch
. У вас должен быть ярлык default
.
Если в любом из случаев внутри switch
необходимо, чтобы выполнение покинуло оператор while
, вы можете организовать это различными способами. Одним из способов является использование переменной, чтобы указать, что:
while (1)
{
int n = scanf("%c", choose);
if (n != 1) // Did scanf match %c and store something in choose?
break; // No, so break out of the while loop.
int LeaveWhile = 0;
switch (choose)
{
case 'A':
// Code to handle A input.
break;
case 'B':
…
case something: // Some case where we want to end the loop.
LeaveWhile = 1; // Indicate end of loop.
break;
…
default:
// Code to handle remaining values.
break;
}
// If it is time to leave the while loop, break out of it.
if (LeaveWhile)
break;
}