#c #while-loop #switch-statement #boolean
#c #цикл while #switch-statement #логическое
Вопрос:
Я хочу, чтобы эта программа вышла из коммутатора и вернулась в цикл while. Почему это не работает?
Я помещаю оператор switch в цикл while. Я думаю, что перерывы мешают циклу while, заставляя его прерываться раньше. Как я могу решить эту проблему?
#include <stdbool.h>
#include <stdio.h>
int main(void)
{
bool ON_status = true;
char option = '0';
while (ON_status == true)
{
printf("enter option 1, 2, 3, or 4.n");
printf("Select an option from the menu above then press the enter key: ");
scanf("%1s", amp;option);
switch (option)
{
case '1':
printf("option1 was selcted");
break;
case '2':
printf("option2 was selcted");
break;
case '3':
printf("option3 was selcted");
break;
case '4':
printf("option4 was selcted");
ON_status = false;
break;
default:
break;
}
}
return 0;
}
Комментарии:
1.
%1s
прочитает один символ И добавит нулевой символ, для которого у вас нет места. (Этот нулевой символ может перезаписать ваш bool, он становится false .)2. Изменить
%1s
на%c
3.
while (ON_status == true)
лучше записать какwhile (ON_status)
.4. @john-kugelman Я не верю, что это дублирование. Во-первых, это обратное / обратное дублированию … а также основной причиной является переполнение буфера. Голосование за повторное открытие.
5. @PaulOgilvie Да, вы правы. Я проверил адрес памяти
option
иON_status
. Оба выделяются в соседних адресах памяти. Null char перезаписалON_status
переменную
Ответ №1:
Проблема с вашим кодом заключается в том, что строка
scanf("%1s", amp;option);
переполняет память option
.
Строки в C завершаются нулем. Итак, ‘%1s’ хранит один символ и нулевой терминатор. Но ваша option
переменная имеет длину всего в один символ, так куда же девается ноль (или NULL, NUL, null в зависимости от вашего имени)?
В этом случае, поскольку ON_status
параметр и объявлен рядом в памяти, он перезаписывается ON_status
.
Чтобы увидеть, что это происходит, вы могли бы напечатать значение ON_status
outside the switch
, и вы бы заметили, что оно равно 0.
Чтобы устранить проблему, я думаю, я бы заменил ваш scanf
на
option = getc(stdin);