Почему этот оператор switch завершает цикл while при его запуске?

#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);