#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);
и теперь ваша программа будет работать так, как вы хотите!