Цикл выполняется через раз игнорируя считывание с клавиатуры - C (СИ)
Формулировка задачи:
Изучая оператор switch решил запихнуть его в цикл. Программа должна считывать символ, введенный с клавиатуры и вывести на экран слово, которое начинается на введенную букву.
Все вроде бы нормально, кроме одного: после выполнения каждого из условий в case она выполняет условие в default. Я сначала думал, что он просто переходит на дефолт почему-то(но брейки-то везде стоят!), и для того, что бы посмотреть, КОГДА ИМЕННО это происходит, я решил сделать вот так:
Собственно, вот как это выглядело:
На скрине видно, что программа выполняет тело цикла, пропуская
а затем выполняет его, ожидая введения с клавиатуры символа(я ввел "т" один раз, больше ничего не вводил, дальше было вновь ожидание введения).
Почему так происходит? Почему цикл while через раз пропускает функцию scanf?
У меня из-за подобного руки опускаются и пропадает желание изучать программирование дальше. Пожалуйста, помогите разобраться.
#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; }
#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);
Решение задачи: «Цикл выполняется через раз игнорируя считывание с клавиатуры»
textual
Листинг программы
char str[10]; scanf("%s",str); //и вводим последовательность - примерно такую: "12345678901234567890". //Все, получаем ошибку сразу после выхода из функции.
Объяснение кода листинга программы
- Объявлена переменная типа char массивом на 10 элементов:
char str[10];
- Производится чтение строки с клавиатуры с помощью функции
scanf()
и передачей в нее адреса массиваstr
и спецификатора формата%s
, который указывает на чтение строки:scanf(
%s,str);
- Введенная строка сохраняется в массиве
str
. - При попытке выхода из функции
scanf()
происходит ошибка, так как введенная строка превышает размер массиваstr
. - Если бы цикл выполнялся через раз, игнорируя считывание с клавиатуры, то он бы выполнялся нормально, но в данном коде такого цикла нет.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д