Цикл выполняется через раз игнорируя считывание с клавиатуры - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Изучая оператор switch решил запихнуть его в цикл. Программа должна считывать символ, введенный с клавиатуры и вывести на экран слово, которое начинается на введенную букву.
#include<stdio.h>
#include<conio.h>
 
int main()
{
    char A;
    int e;
    printf ("Введите первую букву предмета:\n");
    while(e!=1) 
{
    scanf ("%c", &A);
    switch (A)
    {
        case 'т': printf("Телефон.\n"); break;
        case 'к': printf("Компьютер.\n"); break;
        case 'ш': printf("Шкаф.\n"); break;
        case 'с': printf("Стул.\n"); break;
        case 'ц': printf("Цветок.\n"); break;
        case 'c': printf("computer.\n"); break;
        case 'e': e = 1; break;
        default: printf("Таких не знаю.\n");
    }   
}
    return 0;
}
Все вроде бы нормально, кроме одного: после выполнения каждого из условий в case она выполняет условие в default. Я сначала думал, что он просто переходит на дефолт почему-то(но брейки-то везде стоят!), и для того, что бы посмотреть, КОГДА ИМЕННО это происходит, я решил сделать вот так:
#include<stdio.h>
#include<conio.h>
 
int main()
{
    char A;
    int e;
    printf ("Введите первую букву предмета:\n");
    while(e!=1) 
{
        printf("1\n");
    scanf ("%c", &A);
        printf("2\n");
    switch (A)
    {
        case 'т': printf("Телефон.\n"); break;
        case 'к': printf("Компьютер.\n"); break;
        case 'ш': printf("Шкаф.\n"); break;
        case 'с': printf("Стул.\n"); break;
        case 'ц': printf("Цветок.\n"); break;
        case 'c': printf("computer.\n"); break;
        case 'e': e = 1; break;
        default: printf("Таких не знаю.\n");
    }   
        printf("3\n");
}
    return 0;
}
Собственно, вот как это выглядело: На скрине видно, что программа выполняет тело цикла, пропуская
scanf ("%c", &A);
а затем выполняет его, ожидая введения с клавиатуры символа(я ввел "т" один раз, больше ничего не вводил, дальше было вновь ожидание введения). Почему так происходит? Почему цикл while через раз пропускает функцию scanf? У меня из-за подобного руки опускаются и пропадает желание изучать программирование дальше. Пожалуйста, помогите разобраться.

Решение задачи: «Цикл выполняется через раз игнорируя считывание с клавиатуры»

textual
Листинг программы
char str[10];
scanf("%s",str);
//и вводим последовательность  - примерно такую: "12345678901234567890".
//Все, получаем   ошибку сразу после выхода из функции.

Объяснение кода листинга программы

  1. Объявлена переменная типа char массивом на 10 элементов: char str[10];
  2. Производится чтение строки с клавиатуры с помощью функции scanf() и передачей в нее адреса массива str и спецификатора формата %s, который указывает на чтение строки: scanf(%s,str);
  3. Введенная строка сохраняется в массиве str.
  4. При попытке выхода из функции scanf() происходит ошибка, так как введенная строка превышает размер массива str.
  5. Если бы цикл выполнялся через раз, игнорируя считывание с клавиатуры, то он бы выполнялся нормально, но в данном коде такого цикла нет.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы