0

我想创建几个接口。因此,接口的功能也很少。

我的主要代码如下:

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?我该如何解决?

解决了 :

return 0;将 main() 中的 更改为exit(0);,它工作正常,但我不确定这样做是否正确。

4

3 回答 3

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才能退出函数中的while循环main()。脱离控制后whilemain()将返回title1()并打印“即将从title1()返回”,然后控制返回到main()操作系统调用的函数。在main()函数中,您需要再输入一个99才能退出循环并退出程序。

调用堆栈看起来像

--------------
    main()
   --------
    title1()
   --------
    main()
--------------

要退出每个功能,您需要输入一个99

我强烈建议您使用像GDB这样的调试器来遍历您的程序并弄清楚到底发生了什么。

于 2012-11-27T04:48:54.860 回答
0

我认为它可以帮助你.....我试图解释你的代码是如何流动的......

当您启动或执行您的程序时,它首先按照定义进入 main() 函数->

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;
}

所以你需要为选择输入数据&你输入它为1所以while(choice!=99)变为true&它切换到title1()但主要的事情发生在这里....当你输入title()你有定义了另一个 int 选项,它是这个函数的本地变量,所以你再次输入值 99 并且它存储在这个变量中,因为它是本地的。现在它的 while(choice != 99) 变为 false 所以现在它再次调用 main() 并在此调用中再次 main 声明 int 选择也需要再次输入值所以你再次输入 99 然后它的 while(choice != 99)变为假,然后它调用 return 0; & 程序退出。

于 2012-11-27T04:49:38.770 回答
0

scanf()的 s 在您使用值的 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
        }
    }
}
于 2012-11-27T03:57:05.593 回答