При выполнении блока кода он пропускает ввод символов, т.е. scanf () - PullRequest
0 голосов
/ 21 марта 2020

Каждый раз, когда я пытаюсь запустить код, оператор ввода символов scanf ("% c", & ch); полностью игнорируется и переходит на строку netx, что приводит к выполнению бесконечности, в то время как l oop (я сделал это комментарием в приведенном выше блоке). Не могу найти, где я пошел не так. Другие функции работают должным образом.

void main()
 {
     int n,g,i;
     char ch;

     printf("Enter the number of students present today\n");
     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
        printf("Enter the rolls of the students who are present\n");
        attendance();
     }

     printf("Enter the state of the student entry/departure\n");
     printf("\n a for Entry and d for departure and c for door close\n");
     scanf("%c",&ch);


     /*while(1)
     {
         switch(ch)
         {
             case 'a':
            printf("Enter the roll of the students who arrived\n");
            entry();
            break;

            case 'd':
            printf("Enter the roll of the student who departed\n");
            departure();
            break;

            case 'c':
            exit(0);

            default:
            printf("Wrong\n");

         }
     }*/
     printf("Want to see the rolls of the student left in class?[1/0]");
     scanf("%d",&g);
     if(g==1)
     display();
 }


1 Ответ

0 голосов
/ 22 марта 2020

Да, scanf может быть хитрым. Для отладки подобных проблем может быть полезно вставить строку после scanf, чтобы показать вам точно, каков был результат, например:

    printf("scanf got character '%c' (0x%02x)\n", ch, ch);

, который покажет вам символ и цифру c значение этого символа, которое может быть полезно, если персонаж является чем-то экзотическим c, которое не имеет легко узнаваемого печатного вида.

Если вы сделаете это в этом случае, он скажет вам, что scanf("%c") дал вам следующий найденный персонаж, который был символом новой строки. Это новая строка, которая все еще находилась во входном буфере, оставшаяся от конца входной строки, которая была проверена предыдущим вызовом scanf в вашей функции attendance.

Если вы хотите scanf чтобы пропустить оставшиеся пробельные символы, включая символы новой строки, вы должны поставить пробел в начале строки формата scanf. Так что измените свой существующий:

    scanf("%c",&ch);

на

    scanf(" %c",&ch);

, и это должно привести вас к желаемому поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...