从函数重定向到函数

时间:2013-08-13 14:26:36

标签: c++

在回答我之前,我现在正在学习C ++,并且只对C ++有一些了解。

以下是一个示例,用户将看到一种语言选择,用户必须在语言左侧键入数字才能选择它,否则它将再次返回选择。

所以我有一个想法:首先放置 main 函数,最后放置语言函数。但问题是因为功能在语言功能之前,所以功能找不到语言函数和结束程序(当然因为这个问题,我无法编译源代码。)

以下是示例代码:

int main() {
    language();                     // The main function redirect user to the language function
}

int language() {                    // The language() function 
    std::cout << "1 for cookie!";        
    std::cin >> choice;             // Ask user for choice
    if (choice == 1) {
        choice1();                  // If the choice is 1, user will be redirected to choice1() function
    } else {
        main()                      // Otherwise user will be redirected to main and of course, redirect to language() function again
    }
}

由于上述问题,我在重建项目时收到了Code :: Blocks IDE的警告:

  

错误:未在此范围内声明“语言”

是否有其他方法可以将用户从某个功能重定向到另一个功能?

编辑:当前的答案让我无限循环,这不是我想看到的结果。我希望看到的结果是,如果用户键入了无效值,它会将用户重定向到用户当前所在的功能,而代码必须仅运行ONCE 。 (意味着无限循环)

7 个答案:

答案 0 :(得分:5)

您需要在首次使用前声明功能。

另外,如上所述,根据标准,您不得在程序中使用main:

  

函数main不得在程序中使用。

所以,创建另一个函数并将当前工作封装在其中!

int language(); // DECLARATION

// You could also just define function before first usage:
void do_work()
{
    language();
}


int main() {
    do_work();                     // The main function redirect user to the language function
}

int language() {                    // The language() function DEFINITION
    std::cout << "1 for cookie!";        
    std::cin >> choice;             // Ask user for choice

    // If you enter the invalid input in cin (character for example)
    // you need to reset cin in order to allow user to enter new choice

    std::cin.clear(); 
    // don't forget to include <limits>
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');


    if (choice == 1) {
        choice1();                  // If the choice is 1, user will be redirected to choice1() function
    } else {
        do_work();                      // Otherwise user will be redirected to do_work and of course, redirect to language() function again
    }
}

注意:使用递归循环(特别是可能无限)(这里有间接的:do_work - &gt; language - &gt; do_work)可能很危险!请参阅其他答案以了解如何使用循环语句解决此问题!

编辑如果你想检查整行,而不仅仅是第一个字符,你可以将整行读成一个字符串,检查字符串是否有长度1(用户只输入一个字符) ,而且你可以使用第一个字符进行切换:

include <iostream>
#include <limits>
#include <cstdlib>
#include <string>

int language(); // DECLARATION

// You could also just define function before first usage:
void do_work()
{
    language();
}


int main() {
    do_work();                     // The main function redirect user to the language function
}

int language() {                    // The language() function DEFINITION
    std::string choice;
    std::cout << "1 for cookie!";

    std::getline(std::cin, choice);

    if (choice.length() == 1 && choice.at(0) == '1') {
       choice1();                 // If the choice is 1, user will be redirected to choice1() function
    } else {
        do_work();                      // Otherwise user will be redirected to do_work and of course, redirect to language() function again
    }
}

答案 1 :(得分:1)

你必须在调用之前放置函数的原型:

int language(); // Declare the function, it is the prototype of the function here

int main() {
    language();                     // The main function redirect user to the language function
}

int language() {                    // The language() function 
    std::cout << "1 for cookie!";        
    std::cin >> choice;             // Ask user for choice
    if (choice == 1) {
        choice1();                  // If the choice is 1, user will be redirected to choice1() function
    } else {
        // main(); // <- You cannot do this !!
        language(); // Use recursive code
    }
}

请注意,在下面的代码中:

  • 我在language();
  • 之前添加了函数main的原型
  • 我将调用更改为标准禁止的main,并使您的函数递归。

答案 2 :(得分:1)

由于我终于知道如何使用循环,我找到了一个更好更简单的解决方案,要求用户重复输入,直到判断为真。

int input;
std::cin << input;

switch(input) {
    case '1':
        // do something...
        break;
    default:
        break;
}

while (input != '1') {
    std::cin << input;

    switch(input) {
        case '1':
            // do something...
            break;
        default:
            break;
    }
}

我写了一段代码,在几次尝试后再次显示菜单,但在尝试一次后我删除了代码而不能再这样做了。上面的代码是类似的,没有计算用户尝试了多少次,但由于我的目标只是在用户输入有效值时重定向用户并且不会导致程序进入无限循环,上面的代码才能完美。 (我正在使用手机,所以我不知道上面的代码是否正常工作。)

答案 3 :(得分:0)

您真的不想从其他功能拨打main。在C语言中,它在技术上是允许的,在C ++中它是“未定义的行为”,因此你应该避免这样做。

解决方案是在main:

中围绕语言调用循环
int main()
{
    int result = 0;
    do
    {
       result = language();
    } while(result != 0); 
}

然后让你的language函数在“退出”时返回0,在它应该继续时返回非零。

答案 4 :(得分:0)

使用函数原型,在main之前的某处,编写类似于此的代码:

void language();

然后,您可以在编译文件中的任何位置编写函数代码。

答案 5 :(得分:0)

我会写这样的东西

do //forever
{
    int choice = 0;
    std::cout << "1 for cookie!";        
    std::cin >> choice;
    if (choice == 1)
    {
        choice1();
        break;
    }
} while (true)

答案 6 :(得分:0)

因此,当用户输入除数字以外的任何字符时,我找到了一种防止无限循环的解决方案。

int main() {
    language();                     // The main function redirect user to the language function
}

void language() {                    // The language() function 
    char choice;

    std::cout << "1 for cookie!";        
    std::cin >> choice;             // Ask user for choice
    if (choice == '1') {
        choice1();                  // If the choice is 1, user will be redirected to choice1() function
    } else {
        language()                      // Otherwise user will be redirected to main and of course, redirect to language() function again
    }
}

而且我发现我忘了为选择添加任何类型,抱歉...

if 语句中,我会使用'1'而不是 1 ,因为如果我不使用该程序将“认为”这是不是并引导用户其他声明。