регистр переключения не работает со значением символа, если я ввожу значение символа, переключатель не обнаруживает значение по умолчанию и запускает цикл linfinite

#c #switch-statement

#c #switch-statement

Вопрос:

———- > ## Заголовок ## > когда я ввожу символ в качестве ввода, регистр switch по умолчанию не встречается, и цикл запускается > бесконечное время > > > введите код здесь


 #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void create();
void display();
void search();
struct node {
    int data;
    struct node* link;
};
struct node* head;
int main()
{
    int value;
    while (1) {
        printf("Enter Correct Choice :- n");
        printf("Enter 1 to Create Linklist :- n");
        printf("Enter 2 to Display Linklist :- n");
        printf("Enter 3 to Search Linklist  :- n");
        printf("Enter Your Choice Here _________ ");
        scanf(" %d", amp;value);
        switch (value) {
        case 1:
            create();
            break;
        case 2:
            display();
            break;
        case 3:
            search();
            break;
        default:
            printf("Error !! Wrong Choice :- n");
            break;
        }
    }
    return 0;
}
 

Ответ №1:

TL;DR- всегда проверяйте возвращаемое значение scanf() для успеха.

В случае ввода нечисловых символов спецификатор формата %d не находит совпадения, и ввод не используется (т. Е. Недопустимый ввод остается во входном буфере). Таким образом, switch тело выполняется, скорее всего, оно не находит совпадения ни с одним существующим case оператором, поэтому выполняются операторы case по умолчанию, и управление возвращается в while цикл.

Затем, из-за наличия недопустимого ввода в буфере (и не потребляется), вышеуказанные явления продолжают повторяться.

Основная проблема заключается в том, что в случае scanf() сбоя значение переменной value остается неинициализированным и неопределенным. Он не создает четко определенную программу.

Пара вещей:

  • Всегда инициализируйте локальные переменные.
  • Всегда проверяйте успешность scanf() перед использованием возвращаемого значения, если вам нужно использовать scanf() . Для лучшего использования fgets() для ввода пользователем.
  • В случае сбоя ввода scanf() , очистите входной буфер, прежде чем пытаться прочитать следующий ввод.

Ответ №2:

Это break приводит к завершению программы switch case , но не к while . Чтобы завершить while, вы также должны сделать что-то вроде этого:

 #include <stdio.h>
#include <stdlib.h>

int main()
{
    int value;
    int done = 0;
    while (!done) {
        printf("Enter Correct Choice :- n");
        printf("Enter 1 to Create Linklist :- n");
        printf("Enter 2 to Display Linklist :- n");
        printf("Enter 3 to Search Linklist  :- n");
        printf("Enter Your Choice Here _________ ");
        scanf(" %d", amp;value);
        switch (value) {
        case 1:
            printf("do stuffn");
            break;
        case 2:
            printf("do stuffn");
            break;
        case 3:
            printf("do stuffn");
            break;
        default:
            printf("Error !! Wrong Choice :- n");
            done = 1;
            break;
        }
    }
    return 0;
}
 

Здесь я использовал переменную, инициализированную значением 0, что указывает на то, что операция еще не завершена. Когда приходит время выхода, переменной присваивается значение 1, что приводит к выходу программы из цикла while

Кроме того, всегда не забывайте проверять возвращаемое значение printf() , чтобы избежать возможных ошибок

Ответ №3:

Для while() нет условия прерывания.

 #include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void create();
void display();
void search();
struct node {
    int data;
    struct node* link;
};
struct node* head;
int main()
{
     int value = 1;
     while (value) {
        printf("Enter Correct Choice :- n");
        printf("Enter 1 to Create Linklist :- n");
        printf("Enter 2 to Display Linklist :- n");
        printf("Enter 3 to Search Linklist  :- n");
        printf("Enter 0 to exit  :- n");
        printf("Enter Your Choice Here _________ ");
        scanf(" %d", amp;value);
        switch (value) {
        case 1:
            create();
            break;
        case 2:
            display();
            break;
        case 3:
            search();
            break;
        default:
            printf("Error !! Wrong Choice :- n");
            break;
        }
    }
    return 0;
}
 

Ответ №4:

если недопустимое целое число вводится для scanf(" %d", amp;value); значения, не установлено, и недопустимый ввод не выполняется => scanf никогда не заблокирует и не обновит значение

вам нужно проверить, что scanf возвращает 1 (вы читаете значение 1), и, если нет, очистить недопустимый ввод, например, для чтения всей строки

таким образом, вы можете заменить

 scanf(" %d", amp;value);
switch (value) {
...
}
 

Автор:

 if (scanf("%d", amp;value) != 1) {
  puts("invalid input");
  while ((value = getchar()) != 'n') {
    if (value == EOF) {
      puts("EOF, exit");
      exit(-1);
    }
  }
}
else {
  switch(value) {
  ...
  }
}
  
 

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

 if (scanf("%d", amp;value) != 1) {
  while ((value = getchar()) != 'n') {
    if (value == EOF) {
      puts("EOF, exit");
      exit(-1);
    }
  }
  value = -1; /* any value except 1,2 or 3 */
}
switch(value) {
...
}
 

Из-за этого у вас нет возможности остановить выполнение, вы можете сделать :

 ...
puts("Enter 4 to exit             :-);
...
switch (value) {
...
case 4:
   exit(0);
...
}
 

Ответ №5:

Я полагаю, что ваше намерение состоит в том, чтобы запускать программу до тех пор, пока не будет введено «0», но для «0» нет никакого значения. также, когда у нас есть scanf для %d и вместо этого вводится «char», scanf не будет считывать символ из буфера. данные о значении не будут изменены, и он продолжит печатать существующие данные. (мусор, если мы вводим неверные данные в первый раз или любые введенные данные.)

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

  • инициализировано «значение = 0»
  • добавлен регистр для «0».
  • scanf заменяется на fget sscanf
       #include <stdio.h>
      #include <stdlib.h>
      int main()
      {
          int value = 0;
          char buff[256] = {0};
          while (1) {
              value = -1;
              printf("Enter Correct Choice :- n");
              printf("Enter 1 to Create Linklist :- n");
              printf("Enter 2 to Display Linklist :- n");
              printf("Enter 3 to Search Linklist  :- n");
              printf("Enter Your Choice Here _________ ");
              fgets(buff, 255, stdin);
              sscanf(buff, "%d", amp;value);
    
              switch (value) {
              case 1:
                  //create();
                  printf("case : 1n");
                  break;
              case 2:
                  //display();
                  printf("case : 2n");
                  break;
              case 3:
                  //search();
                  printf("case : 3n");
                  break;
              case 0 :
                  printf("case : 0 : Exiting programn");
                  return 0;
              default:
                  printf("Error !! Wrong Choice :- %dn", value);
                  break;
              }
          }
          return 0;
      }