我程序的主要功能显示一个开关菜单。当输入选项1时,调用一个“洗牌”一系列“卡片”的函数。在shuffling完成后,该函数通过调用main()将程序返回到开头,以便再次显示菜单。
我遇到的问题是菜单的选项4将混洗数组写入文件。但是当洗牌然后重新启动程序时,阵列数据会丢失,因此输出的文件都是垃圾。有没有办法重新启动main()而不会丢失数据?
我在课堂上,我可以使用的工具受到限制,所以只有最基本的代码才可以接受。基本上,我正在寻找类似goto但更安全的东西(顺便说一句,goto,在本课程中也被禁止)。
答案 0 :(得分:7)
对于C ++程序来说,调用自己的main
函数实际上并不是一个好主意。实际上,这会导致未定义的行为,这意味着您无法保证程序的行为。它可能会崩溃,或继续处理损坏的数据,或格式化您的硬盘等等(尽管最后一个不太可能)。
我认为这反映了您的计划如何运作的一个更基本的问题。如果您希望数据在函数之间保持不变,则需要将该数据放在不会被其他函数破坏的地方。例如,您可以将数据放入堆中,然后将指针传递给周围的数据。或者,您可以将其定义为main
中的局部变量,然后将其传递给函数,并在完成后返回这些函数。您还可以考虑制作表示数据的对象,然后将这些对象传递到不同的函数中。
如果没有看到您的代码,我怀疑我能否给出更具体的答案。在设计程序时,请记住数据流。想一想哪些数据需要去哪里以及如何去那里。
希望这有帮助!
答案 1 :(得分:2)
为什么要递归调用main
(顺便提一下,标准是禁止的)?只需使用循环(例如do
... while
)来重复需要重复的main
部分,保留不得重置的变量(及其初始化)在循环之外。
答案 2 :(得分:1)
不应以递归方式调用main()
函数。while()
函数中。
看一下这个例子:
#include <iostream>
#include <string>
using namespace std;
int main()
{
bool exitGame = false;
// Game Loop
while(!exitGame) {
// Display menu
cout << "Menu :" << endl;
cout << "- Shuffle : press 1" << endl;
cout << "- Option 2 : press 2" << endl;
cout << "- Option 3 : press 3" << endl;
cout << "- Exit : press 4" << endl;
cout << "Enter your choice : ";
// Get user input
string choosenValue;
cin >> choosenValue;
cout << endl;
// Process user input
if (choosenValue == "1") {
cout << "You selected 'Shuffle'." << endl;
// Do cool stuff here !
} else if (choosenValue == "2") {
cout << "You selected 'Option 2'." << endl;
// Do cool stuff here !
} else if (choosenValue == "3") {
cout << "You selected 'Option 3'." << endl;
// Do cool stuff here !
} else if (choosenValue == "4") {
cout << "You selected 'Exit'." << endl;
exitGame = true;
} else {
cout << "Wrong value." << endl;
}
cout << endl;
}
return EXIT_SUCCESS;
}
答案 3 :(得分:0)
将主体移动到另一个函数'myMain'并调用它而不是main。