到达void函数结束会产生意外结果

时间:2014-02-09 08:54:50

标签: c++

我编写了一个简单的程序来管理名称列表(程序的一部分如下)。我期望函数“choice()”结束并返回main() - 从而结束程序 - 当用户对变量“option”的输入为4.但是,choice()往往会重复几次即使将4分配给“选项”,例如:

Would you like to:
    (1) - Add name(s) to the list
    (2) - Remove name(s) from the list
    (3) - View the list
    (4) - Exit the program
(type 1, 2, 3, or 4): 4


Exiting Program...


Would you like to:
    (1) - Add name(s) to the list
    (2) - Remove name(s) from the list
    (3) - View the list
    (4) - Exit the program
(type 1, 2, 3, or 4): 4


Exiting Program...

ryan$ _

如果没有整个程序,您认为可能导致问题的原因是什么?很抱歉,如果没有足够的信息来推荐。

你可以看到我在第四个if语句的结尾处注释了“exit(0)”,其中choice()应该到达它的结尾并返回到main()。我宁愿避免这种说法,但这是我目前唯一可以解决的问题。谢谢你的帮助。

-Ryan

int main()
{
     cout << endl 
          << "WELCOME TO THE NAME LIST PROGRAM" << endl
          << "--------------------------------" << endl;

    choice();

    return 0;
}


void choice()
{
    string option = "0";

    cout << "\nWould you like to:"             << endl
     << "\t(1) - Add name(s) to the list"      << endl
     << "\t(2) - Remove name(s) from the list" << endl
     << "\t(3) - View the list"                << endl
     << "\t(4) - Exit the program"             << endl
     << "(type 1, 2, 3, or 4): ";

    getline(cin,option);

    while( option != "1" && option != "2" &&
           option != "3" && option != "4"  )
    {
        cout << "\nInvalid input, reenter: ";
        getline(cin,option);
    }

    if(option == "1")
    {
        appendNames();
        choice();
    }
    else if(option == "2")
    {
        string flag = "menu";
        removeNames(flag);
        choice();
    }

    else if(option == "3")
    {
        viewNames();
        choice();
    }

    else if(option == "4")
    {
        cout << "\n\nExiting Program...\n\n";
        // exit(0);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为问题来自对某个功能如何运作的误解。假设您有一个显示您姓名的功能:

void showName()
{
    cout << "Ryan" << endl;
}

现在说你要重复10次。在您特定的编程方式中,您可能会执行以下操作:

void showName(int times)
{
    cout << "Ryan" << endl;

    if ( times > 0 ) {
        showName( --times );
    }

    return;
}

int main()
{
    showName( 10 );
}

这种编程方式称为递归,但我确信你已经偶然达到了这种方式。递归在某些情况下很方便,但它不是做简单事情的常用方法,比如重复一些事情。让我们看看实际程序调用该函数10次:

void showName()
{
    cout << "Ryan" << endl;
}

int main()
{
    for(int i = 0; i < 10; ++i) {
        showName();
    }
}

每次调用函数showName()(被调用者)时,它都必须返回给调用者。如果您执行示例中显示的内容:

if( option == "1" )
{
    appendNames();
    choice();
}

然后,您实际上正在调用choice()次,因为用户选择了除4(退出)之外的任何其他选项。这解释了为什么您必须致电exit( 0 )才能立即生效。

总结一下,你的程序应该是:

int main()
{
     cout << endl 
          << "WELCOME TO THE NAME LIST PROGRAM" << endl
          << "--------------------------------" << endl;

    while( !choice() );

    return 0;
}


bool choice()
{
    bool toret = false;
    string option = "0";

    cout << "\nWould you like to:"             << endl
     << "\t(1) - Add name(s) to the list"      << endl
     << "\t(2) - Remove name(s) from the list" << endl
     << "\t(3) - View the list"                << endl
     << "\t(4) - Exit the program"             << endl
     << "(type 1, 2, 3, or 4): ";

    getline(cin,option);

    while( option != "1" && option != "2" &&
           option != "3" && option != "4"  )
    {
        cout << "\nInvalid input, reenter: ";
        getline(cin,option);
    }

    if(option == "1")
    {
        appendNames();
    }
    else if(option == "2")
    {
        removeNames();
    }

    else if(option == "3")
    {
        viewNames();
    }

    else if(option == "4")
    {
        cout << "\n\nExiting Program...\n\n";
        toret = true;
    }

    return toret;
}

希望这有帮助。

答案 1 :(得分:0)

问题出在你的while循环中。用户必须继续输入输入,直到输入的输入无效。

while( option != "1" && option != "2" &&
       option != "3" && option != "4"  )
{
    cout << "\nInvalid input, reenter: ";
    getline(cin,option);
}

更改循环条件或移动循环内的所有内容应该可以解决问题。 希望有所帮助。 :)

P.S:如果您要在While循环中移动所有内容,请确保为退出选项添加break;