Оператор C Switch выводит два случая

#c

#c

Вопрос:

Вот мой код:

 int main(void)
{
char newr;
lol:
scanf("%c", amp;newr);


switch (newr) {
case 'a':
    goto killswitch;

case 'b':
    printf("You entered %c", newr);
    goto lol;
    break;
default:
    printf("you entered something other than a or ban");
    goto lol;
    break;
killswitch:
    printf("ayyyy!");
    goto lol;
    break;
}
 

Моя проблема в том, что когда я запускаю программу и ввожу символ, скажем, в данном случае a, это дает мне следующий результат:

 ayyyy!you entered something other than a or b
 

Это всегда происходит независимо от того, какой символ я ввожу, например, если я ввожу l, он вернет это:

 you entered something other than a or b
you entered something other than a or b
 

Я очень смущен. Кто-нибудь знает причину этого?

Спасибо

Комментарии:

1. У вас никогда не должно быть goto перед разрывом, и у вас (почти) никогда не должно быть меток внутри оператора switch. Но это не причина нашей проблемы.

2. подпишите петицию, чтобы уничтожить goto

3. @david.pfx Я просто экспериментировал, чтобы посмотреть, смогу ли я заставить программу работать, но, тем не менее, это то, что я буду иметь в виду. Спасибо

4. @bolov: я пишу goto на C / C примерно по 1 на каждые 100 ТЫС. LOC. Когда он вам нужен, он вам действительно, действительно нужен.

Ответ №1:

Вы продолжаете нажимать enter. Поскольку enter — это нечто иное, чем a или b , ваша программа правильно указывает на это.

Если вы введете «ab», ваша программа должна указать, что она получила an a , a b и что-то другое, кроме a or b .

Комментарии:

1. Понятно, спасибо! Тогда не могли бы вы сказать мне, как нажать enter, чтобы компьютер проигнорировал нажатие клавиши?

2. @AndrewHu Это зависит от того, что именно вы хотите сделать. Вы могли бы добавить еще case один, чтобы игнорировать вводы. Вы можете добавить второй scanf (и проигнорировать результат), чтобы пропустить ввод.

3. @AndrewHu После вызова scanf() добавьте вызов getchar() , где вы отбрасываете символ перевода строки, который появляется при нажатии enter.

4. Ах, да, это решило проблему! Спасибо всем за вашу помощь.

5. @AndrewHu Если это решило вашу проблему, вы должны принять ответ Дэвида как правильный, нажав на большую галочку слева от его сообщения. Также подумайте о том, чтобы дать ему преимущество, поскольку это было полезно.

Ответ №2:

Удалить goto lol;

 killswitch:
printf("ayyyy!");
break;
 

Комментарии:

1. Однако, если бы я удалил goto lol; тогда программа не смогла бы выполнять цикл.

2. @AndrewHu Поэтому мы используем циклы while() для цикла вместо goto. Вы могли бы поместить все это в do while и ввести символ while != (некоторый символ выхода). Таким образом, у вас есть выход, а также вы можете избежать использования goto. МЫ НЕ ИСПОЛЬЗУЕМ GOTO.

3. @Kartik_Koro Лол, есть ли движение против goto? Рассмотрим

4. @AndrewHu Это не считается хорошей практикой. Наличие нескольких выходов в блоке кода обычно заставляет вас тратить время на то, чтобы убедиться, что все выходы правильно завершены (например, все выходы приводят к освобождению динамически выделяемых ресурсов). xkcd.com/292

Ответ №3:

 switch (newr) {
case 'a':
goto killswitch;  
 

и выводит «ayyy!»

затем он переходит к ‘scanf’

и введенный вами ввод принял значение ‘ n’ и снова переходит в переключатель.

Комментарии:

1. Да, мне сказали, что решение состояло в том, чтобы добавить getchar(); после scanf(); . Спасибо за вашу помощь, хотя

Ответ №4:

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

изменить

 scanf("%c", amp;newr);
 

Для

 scanf("n%c", amp;newr);
 

и теперь ваша программа будет работать так, как вы хотите!