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

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

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

Изучая оператор switch решил запихнуть его в цикл. Программа должна считывать символ, введенный с клавиатуры и вывести на экран слово, которое начинается на введенную букву.
Листинг программы
  1. #include<stdio.h>
  2. #include<conio.h>
  3. int main()
  4. {
  5. char A;
  6. int e;
  7. printf ("Введите первую букву предмета:\n");
  8. while(e!=1)
  9. {
  10. scanf ("%c", &A);
  11. switch (A)
  12. {
  13. case 'т': printf("Телефон.\n"); break;
  14. case 'к': printf("Компьютер.\n"); break;
  15. case 'ш': printf("Шкаф.\n"); break;
  16. case 'с': printf("Стул.\n"); break;
  17. case 'ц': printf("Цветок.\n"); break;
  18. case 'c': printf("computer.\n"); break;
  19. case 'e': e = 1; break;
  20. default: printf("Таких не знаю.\n");
  21. }
  22. }
  23. return 0;
  24. }
Все вроде бы нормально, кроме одного: после выполнения каждого из условий в case она выполняет условие в default. Я сначала думал, что он просто переходит на дефолт почему-то(но брейки-то везде стоят!), и для того, что бы посмотреть, КОГДА ИМЕННО это происходит, я решил сделать вот так:
Листинг программы
  1. #include<stdio.h>
  2. #include<conio.h>
  3. int main()
  4. {
  5. char A;
  6. int e;
  7. printf ("Введите первую букву предмета:\n");
  8. while(e!=1)
  9. {
  10. printf("1\n");
  11. scanf ("%c", &A);
  12. printf("2\n");
  13. switch (A)
  14. {
  15. case 'т': printf("Телефон.\n"); break;
  16. case 'к': printf("Компьютер.\n"); break;
  17. case 'ш': printf("Шкаф.\n"); break;
  18. case 'с': printf("Стул.\n"); break;
  19. case 'ц': printf("Цветок.\n"); break;
  20. case 'c': printf("computer.\n"); break;
  21. case 'e': e = 1; break;
  22. default: printf("Таких не знаю.\n");
  23. }
  24. printf("3\n");
  25. }
  26. return 0;
  27. }
Собственно, вот как это выглядело: На скрине видно, что программа выполняет тело цикла, пропуская
Листинг программы
  1. scanf ("%c", &A);
а затем выполняет его, ожидая введения с клавиатуры символа(я ввел "т" один раз, больше ничего не вводил, дальше было вновь ожидание введения). Почему так происходит? Почему цикл while через раз пропускает функцию scanf? У меня из-за подобного руки опускаются и пропадает желание изучать программирование дальше. Пожалуйста, помогите разобраться.

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

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

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

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

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


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

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

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы