#include <stdio.h>
void clearKeyboard(void){
while(getchar()!='\n');
}
void pause(void){
printf("Press <ENTER> to continue...");
clearKeyboard();
}
int getMenuChoice(void){
int choice;
printf("1- List all items\n");
printf("2- Search by SKU\n");
printf("0- Exit program\n> ");
scanf("%d", &choice);
return choice;
}
int getYesOrNo(void){
char ch;
int ret;
ch = 0;
ret = 0;
while(ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n')
{
scanf("%c", &ch);
clearKeyboard();
if (ch == 'Y' || ch == 'y'){
ret = 1;
return ret;
}
if (ch == 'N' || ch == 'n'){
ret = 0;
return ret;
}
else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'){
printf("Only (Y)es or (N)o are acceptable: ");
}
}
return ret;
}
int main(void){
int choice;
int temp = 0;
choice = 0;
printf("=== TEST MENU ===\n");
pause();
while(temp == 0){
choice = getMenuChoice();
if (choice != 0){
printf("*** not implemented ***\n");
}
else{
printf("Do you really want to quit? ");
temp = getYesOrNo();
}
}
printf("=== END OF MENU TEST ===\n");
return 0;
}
代码运行时,应打印测试菜单 我必须按回车继续
然后,它会显示多个打印语句(listall..search by ... exit)
因此,如果用户输入0,则询问您是否真的要退出,如果用户输入y,则应该退出
然而,问题是程序在询问“你真的想要退出吗?”之后再次询问用户不必要的问题“只有(Y)es或(N)o是否可以接受”。当我已经键入y其中是有效答案。
为什么?
p.s库是否存在
答案 0 :(得分:2)
Scanf(“%d”,&amp; choice);只消耗数字字符(也会在任何其他输入,iirc上崩溃)但不会消除\ r \ l或\ n字符,这些字符将在getYesOrNo函数中使用,如果我是正确的(有人请指正)。这就是为什么程序在询问你是否真的想要退出之后应该直接显示(y)es /(n)o提醒的原因。
这也是为什么添加clearKeyboard函数使其按预期工作的原因。
答案 1 :(得分:1)
该代码还存在其他一些问题(例如评论中提到的UB)。但是,这个
if (ch == 'Y' || ch == 'y'){
ret = 1;
return ret;
}
if (ch == 'N' || ch == 'n'){
ret = 0;
return ret;
}
else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'){
printf("Only (Y)es or (N)o are acceptable: ");
}
可能不是你想要的。第一个if
独立于之后出现的if - else
,因此即使第一个条件为真,也会评估之后的块。很可能你想要这个:
if (ch == 'Y' || ch == 'y'){
ret = 1;
return ret;
}
else if (ch == 'N' || ch == 'n'){
ret = 0;
return ret;
}
else {
printf("Only (Y)es or (N)o are acceptable: ");
}
条件ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n'
不是很有意义,因为角色总是不是Y或不是N,因此它总是正确的。
答案 2 :(得分:0)
您应该在%c
之前添加空格以自动跳过任何前导空格。在您的情况下,'\n'
始终存储在ch中,这就是else if (ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n')
始终为真的原因
scanf(" %c", &ch); //This is the modified statement