0

在回答我之前,我目前正在学习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 的警告:

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

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

编辑:当前的答案使我陷入无限循环,这不是我想看到的结果。我希望看到的结果是,如果用户输入了无效值,它将再次将用户重定向到用户当前所在的函数,并且代码只能运行一次。(意味着不是无限循环)

4

7 回答 7

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 -> language -> 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
    }
}
于 2013-08-13T14:27:36.610 回答
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标准禁止的 who,并使您的函数递归。
于 2013-08-13T14:29:37.930 回答
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;
    }
}

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

于 2013-11-30T20:14:20.273 回答
0

我会写这样的东西

do //forever
{
    int choice = 0;
    std::cout << "1 for cookie!";        
    std::cin >> choice;
    if (choice == 1)
    {
        choice1();
        break;
    }
} while (true)
于 2013-08-13T15:02:09.683 回答
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,因为如果我不使用它,程序会“认为”这不是 1并引导用户使用else语句。

于 2013-08-25T08:47:00.943 回答
0

你真的不想main从另一个函数调用。在 C 中它在技术上是允许的,在 C++ 中它是“未定义的行为”,因此您应该避免这样做。

解决方案是在 main 中围绕语言调用放置一个循环:

int main()
{
    int result = 0;
    do
    {
       result = language();
    } while(result != 0); 
}

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

于 2013-08-13T14:33:18.353 回答
0

使用函数原型,在 main 之前的某个地方,编写类似这样的代码:

void language();

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

于 2013-08-13T14:35:49.620 回答