【发布时间】:2015-06-07 14:12:48
【问题描述】:
我正在做一个需要显示一些菜单的项目,其中一些有子菜单。到目前为止,我已经创建了一个返回用户选择的字符的函数,问题是在菜单之间来回多次后返回值是垃圾,它与 cin 被刷新但我只是找不到必须清除的“点”...
我在不同的地方尝试了cin.clear();,结果好坏参半,我错过了什么?
输出:
#include <iostream>
#include <string>
#include <vector>
#include <exception>
#include <istream>
using namespace std;
char Menu() {
char ch;
//ch = NULL;
//cin.clear();
cout << "++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << "+ MAIN MENU +" << endl;
cout << "++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << "| 1. Enter a new contract. |" << endl;
cout << "| 2. Cancel an active conract. |" << endl;
cout << "| 3. Edit a cotract. |" << endl;
cout << "| 0. Exit |" << endl;
cout << "++++++++++++++++++++++++++++++++++++++++++++" << endl;
cin >> ch;
switch (ch) {
//cin.clear();
case '1':
return ch;
break;
case '2':
return ch;
break;
case '3':
//cin.clear();
cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << "+ -== Edit a cotract ==- +" << endl;
cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << " What would like to edit? |" << endl;
cout << " a) Cover amount. |" << endl;
cout << " b) Add a family memeber.(Applyes to Health insurances) |" << endl;
cout << " 0. Return |" << endl;
cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
cin >> ch;
if(ch == '0') {
//cin.clear();
Menu();
} else if((ch >= 'a') && (ch <= 'b')) {
return ch;
} else {
cout << "Wrong input ! ! !" << endl;
Menu();
return ch;
}
break;
case '0':
cout << "Exiting bye!" << endl;
break;
default:
cout << "Wrong input ! ! !" << endl;
Menu();
break;
}
}
int main() {
char choise;
choise = Menu();
cout << "selected: " << choise << endl;
system("PAUSE");
return 0;
}
【问题讨论】:
-
警告:控件可能到达非空函数[-Wreturn-type]的末尾
-
Dev-C++ 4.9.9.2 完全没有问题
-
@Peter 然后你不要在命令行上将
-Wall传递给 GCC。你实际上应该通过-Wall -Wextra -pedantic -
使这个函数递归是没有意义的,也是一个坏主意。这是因为调用 Menu() 并不会简单地跳到开头(就像 cough goto 那样),而是向堆栈添加了一个新的函数调用。当用户在那里选择 0 时,旧的函数调用会继续并在没有返回值的情况下退出函数,从而传递垃圾。
-
@ammoQ 我不知道,我以为我会用递归逃脱......
标签: c++ function recursion cin flush