我想创建几个接口。因此,界面的功能也很少。
我的主要代码如下:
int main (void)
{
int choice;
scanf("%d", &choice);
while(choice != 99)
{
switch(choice)
{
case 1: title1(); break;
case 2 : title2(); break;
default : printf("Error");
}
scanf("%d", &choice); <-- edit
}
return 0;
}
至于其他功能:
void title1(void)
{
int choice;
scanf("%d", &choice);
while(choice != 99)
{
switch(choice)
{
case 1: titleA(); break;
case 2 : titleB(); break;
default : printf("Error");
}
scanf("%d", &choice); <-- edit
}
main();
}
void title2()
{
int choice;
scanf("%d", &choice);
while(choice != 99)
{
switch(choice)
{
case 1: titleC(); break;
case 2 : titleD(); break;
default : printf("Error");
}
scanf("%d", &choice); <-- edit
}
main();
}
该计划的输入示例如下:
1 then 99 then 99
但实际是:
1 then 99 then 99 then 99
需要额外99
才能退出该计划。
如果我这样输入:
1 then 99 then 2 then 99
我需要输入3次99
才能退出程序。
scanf
有什么问题?我该如何解决?
求助:
我将main()中的return 0;
更改为exit(0);
,并且工作正常,但我不确定是否正确。
答案 0 :(得分:0)
您的scanf()
位于使用该值的while循环之外 - (choice
未更新)。
您的所有方法都会调用main()
- 这是什么?
你可能想要一些更自包含的东西,如:
void title1(void)
{
int choice=0;
while(choice != 99)
{
scanf("%d", &choice);
switch(choice)
{
case 1: titleA(); break;
case 2: titleB(); break;
default: printf("Error");
break
}
}
}
答案 1 :(得分:0)
这很简单。您可以使用调试器来查看到底发生了什么。
编辑:为了更清晰,重写title1()。
void title2()
{
int choice;
scanf("%d", &choice);
while(choice != 99)
{
switch(choice)
{
case 1: titleC(); break;
case 2 : titleD(); break;
default : printf("Error");
}
scanf("%d", &choice);
}
main();
printf("About to return from title1()\n");//EDIT
return;//EDIT
}
让我们考虑第一个输入集。
1 then 99 then 99
在这种情况下,1
会将您带到title1()
。并且99
将您带出while
内的title1()
循环,再次呼叫main()
功能。因此,您需要再输入一个99
来main()
函数中的while循环。在您离开while
main()
控件后,将返回title1()
并且“即将从title1()返回”将被打印,然后控件返回main()
操作系统调用的函数。在main()
函数中,您需要再输入一个99
以退出循环并退出程序。
调用堆栈看起来像
--------------
main()
--------
title1()
--------
main()
--------------
要退出每项功能,您需要输入一个99
。
我强烈建议你使用像GDB之类的调试器来完成你的程序并弄清楚究竟发生了什么。
答案 2 :(得分:0)
我认为它可以帮到你.....我试图解释你的代码是如何流动的......
当你开始或执行你的程序时,它首先在main()函数中输入定义的&gt;
int main (void)
{
int choice;
scanf("%d", &choice);
while(choice != 99)
{
switch(choice)
{
case 1: title1(); break;
case 2 : title2(); break;
default : printf("Error");
}
scanf("%d", &choice); <-- edit
}
return 0;
}
所以你需要输入数据供选择&amp;你输入它为1,所以当(选择!= 99)变为真时&amp;它切换到title1()但主要的事情发生在这里....当你输入title()你已经定义了另一个int选择,它是本函数的本地,所以你再次输入值为99&amp;它存储在此变量中,因为它是本地的。现在它的while(选择!= 99)变为假,所以现在再次调用main()&amp;再次在这个调用main声明int选择,它还需要输入值,所以你再次输入99然后它(while!= 99)变为false&amp;然后它调用返回0; &安培;程序退出。