在调用另一个函数后,Scanf()增加了

时间:2012-11-27 03:50:43

标签: c ubuntu scanf

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

我的主要代码如下:

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);,并且工作正常,但我不确定是否正确。

3 个答案:

答案 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()功能。因此,您需要再输入一个99main()函数中的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; &安培;程序退出。