#c
#c
Вопрос:
Я работал над проектом колледжа. Я хочу, чтобы пользователь вводил Y / N, если он хочет продолжить или нет, поэтому я написал следующий код
repeat:
pr=0;
q=0;
res=0;
printf("nEnter the serial number of product you wish to purchase: ");
scanf("%d",amp;pr);
printf("Quantity: ");
scanf("%d",amp;q);
billing(pr,q);
printf("Continue Shopping? (y/n) ");
scanf("%d",amp;res);
if(res=='y')
goto repeat;
else
return 0;
}
Проблема заключается в том, что ввод y выполняет оператор else. Я попытался заменить y на 1,2,3 …. и это работает, но я хочу, чтобы он работал с Y или y или yes .
Комментарии:
1. Просто введите
121
scanf()
послеprintf("Continue Shopping? (y/n) ");
.2. Пожалуйста, не злоупотребляйте
goto
оператором3. scanf(«%c»,amp;res);
4. @arun483: Что за маньяк учит о
goto
beforefor
или[do] while
?5. @OrkhanAlikhanov
scanf(" %c",amp;res);
с пробелом в противном случае будет считыватьсяnewline
оставшееся в буфере.
Ответ №1:
В этой строке ошибка
scanf("%d",amp;res);
Это должно быть
scanf(" %c",amp;res);
Заполнители форматирования для символа %c
не %d
Комментарии:
1. для этого я также должен определить «char res;» ?
2. @arun483 Лучше всегда явно определять свои переменные в нужном вам типе.
3. Да, вы должны.
4. Пожалуйста, поставьте a
space
перед форматом%c
, так какscanf(" %c",amp;res);
в противном случае этот ответ будет считыватьnewline
то, что все еще было в буфере. Исправлена одна ошибка, но введена другая.5. Кроме того,
res
должно быть achar
. Этот ответ не будет работать, если OP объявленres
какint
.
Ответ №2:
scanf("%d",amp;res);
должно быть
scanf(" %c",amp;res);
Как предложено несколькими пользователями, do while следует использовать поверх goto, поэтому лучший код будет
do{
pr=0;
q=0;
printf("nEnter the serial number of product you wish to purchase: ");
scanf("%d",amp;pr);
printf("Quantity: ");
scanf("%d",amp;q);
billing(pr,q);
printf("Continue Shopping? (y/n) ");
scanf(" %c",amp;res);
}
while(*res == 'Y' || *res == 'y');
return 0;
}
Также должен быть объявлен res char res;
Комментарии:
1. Даунвотер действительно должен был объяснить свой даунвотер. Это неверно :
while(*res == 'Y' || *res == 'y');
. Предполагаетсяres
, что оно объявлено так, какchar res;
и должно бытьwhile(res == 'Y' || res == 'y');
. (Нет*
передres
).2. На самом деле вы ничего не добавляете, выбирая do … во время перехода. Это все еще структурированная программа. Goto разрушает структуру только при переходе в блок или из него.
3. В этом случае
do..while
блок полностью оправдан. Особенно в сочетании с правильным отступом, это сделает более очевидным, какая часть кода зацикливается, и легко увидеть, какое условие используется для продолжения цикла.4. @MalcolmMcLean Он добавляет лучшую практику. Я не из тех бешеных людей, выступающих против goto; Я думаю
goto
, что имеет свое место, и когда это подходящий механизм управления, его следует использовать. Но его никогда не следует выбирать в качестве механизма цикла, если для этого нет веской причины, и за мой 30-летний опыт программирования я видел ровно один такой алгоритм. Это редкий день, когда замена ado
,while
илиfor
сgoto
имеет смысл.