Switch всегда работает по умолчанию внутри цикла while

#include<stdio.h>

int main()
{
    char a;

    do {
    printf("\n enter letter a,b or c: ");
    scanf("%c", &a);

    switch (a)
    {
    case  'a' :
        printf("\n one \n");
        break;
    case  'b' :
        printf("\n two \n");
        break;
    case  'c' :
        printf("\n three \n");
        break;
    default:
        printf("\n invalid input \n");
        break;
    }
    }while(a != 'd');
}

этот код всегда работает по умолчанию, даже если есть перерыв;

но если вы замените %c на %s, он работает нормально, я просто хочу понять, почему использование %c делает это или есть ли другой способ заставить его работать идеально с использованием %c

также использование a=getch() работает, но я хочу отображать ввод без использования printf для его отображения

Попробуйте вместо этого использовать " %c". Обратите внимание на начальный пробел в строке формата.

Some programmer dude 28.10.2022 12:22

Что касается того, что происходит, я предлагаю вам использовать отладчик, чтобы увидеть, какое значение a действительно имеют в вашем текущем коде.

Some programmer dude 28.10.2022 12:24

Обратите внимание: scanf() оставляет символ новой строки в буфере.

Weather Vane 28.10.2022 12:24

«Если вы замените %c на %s, он будет работать нормально». Нет, это неопределенное поведение.

Weather Vane 28.10.2022 12:26

«Я хочу понять, что делает %c». Некоторое объяснение: большинство спецификаторов формата для scanf автоматически фильтруют начальные пробелы, но %c, %[] и %n этого не делают. Добавление пробела перед % указывает scanf фильтровать начальные пробелы и здесь. Причина в том, что эти три спецификатора позволяют вам читать каждый символ, включая пробелы, но предоставляется способ, чтобы они вели себя как %d, %f и %s, где это необходимо.

Weather Vane 28.10.2022 12:27

Если вы хотите понять scanf, посидите два часа с справочной страницей и небольшой тестовой программой. Не используйте кладжи, такие как a=getch(). Они не нужны, как только вы поймете, как обрабатываются пробелы.

Weather Vane 28.10.2022 12:28

Подсказка: измените printf("\n invalid input \n"); на printf("\n invalid input , a= %d\n", a); и посмотрите, что произойдет. Подсказка 2: 10, который вы увидите, — это код клавиши Enter.

Jabberwocky 28.10.2022 12:30

Или... просто не тратьте слишком много времени на изучение stdio.h. Это одна из самых ужасных библиотек, когда-либо созданных, во всех категориях. В лучшем случае ее следует рассматривать как библиотеку быстрой и грязной отладки. Существует очень мало программ, которые на самом деле должны получать ввод со стандартного ввода вместо, например, параметров командной строки. В общем, почти все перестали использовать консольный ввод-вывод более 20 лет назад. Таким образом, помимо того, что она изначально и ужасно нарушена дизайном, это также совершенно неуместная библиотека для изучения при изучении современного программирования на C.

Lundin 28.10.2022 12:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При использовании scanf вам нужно нажать клавишу ввода после буквы a/b/c, чтобы отправить ввод. %c интерпретирует ваш ввод как два символа. Один для фактической буквы, которую вы ввели, а второй для клавиши ввода. Именно этот ключевой символ ввода проходит через регистр «по умолчанию». Когда вы используете getch(), все работает нормально, потому что вы не нажимаете клавишу ввода

Я видел комментарий, в котором говорилось, что использование "%c" будет работать, и это сработало. Ничего, если вы дадите мне хоть малейшее представление о том, почему это сработало? даже без подробного объяснения, просто ключевая информация

Vavlo 28.10.2022 13:01

@Vavlo — повторяющийся вопрос все объясняет. Так что сделайте некоторые комментарии.

Jonathan Leffler 28.10.2022 15:37

Другие вопросы по теме

Как перебирать список словарей и извлекать слова с одинаковыми «именем» и «школой» в новый список, получая в нем другие значения
Python удаляет элемент из словаря при двойной итерации
Как преобразовать массив в строку, как объединить строку с первым словом массива, например, массивом [0].'->'.массив[1]
Фильтрация вложенного массива объектов с некоторыми фильтрами
Как найти различные значения в списке столбцов и распечатать их в одном CSV
Язык C: можно ли поставить «да» в цикл do while?
Пауза в «для i в диапазоне» с помощью python
Почему добавление «переменной + 1» не увеличивает ее значение на единицу для каждого цикла в цикле for? (С++)
Java: как остановить мой вложенный цикл for после завершения цикла
«Переполнение стека. Повторите 261929 раз[...]» — это сообщение об ошибке, когда я отлаживаю свой код, после чего я не вижу никаких проблем, так что мне делать?