2015-09-25 110 views
0

我有一个系统,用户可以根据需要输入尽可能多的输入并进行一些计算。使用Switch C++获取用户输入

这里是实现这一任务的代码:

int main() { 
    char op = 's'; 
    float time=0, fuel_rate=0, start=0, end=0, pace=0; 


    while(op != 'x'){ 
     cout << "Please select: " << endl; 
     cout << "1 ---> A" << endl; 
     cout << "2 ---> B" << endl; 
     cout << "3 ---> Calculate" << endl; 
     cout << "x ---> Exit" << endl; 

     op = std::getchar(); 

     //remove the rest of the line from input stream 
     int temp; 
     while ((temp = std::getchar()) != '\n' && temp != EOF); 

     switch(op){ 
     case '1': 
      cout << "Enter time: "; 
      cin >> time; 
      cout << "Enter fuel rate: "; 
      cin >> fuel_rate; 
      break; 
     case '2': 
      cout << "Enter start: "; 
      cin >> start; 
      cout << "Enter end: "; 
      cin >> end; 
      cout << "Enter pace: "; 
      cin >> pace; 
      cout << "Enter fuel rate: "; 
      cin >> fuel_rate; 
      break; 
     case '3': 
      cout << "Total value"; 
      break; 
     case 'x': 
      return 0; 
     default: 
      continue; 
     } 
    } 
    return 0; 
} 

系统非常适用于第一个输入。示例控制台日志如下所示:

Please select: 
1 ---> A 
2 ---> B 
3 ---> Calculate 
x ---> Exit 
1 
Enter time: 2 
Enter fuel rate: 3 
Please select: 
1 ---> A 
2 ---> B 
3 ---> Calculate 
x ---> Exit 
2 
Please select: 
1 ---> A 
2 ---> B 
3 ---> Calculate 
x ---> Exit 

第一个用户进入操作1,系统询问时间和燃油率。当用户进入操作2时,系统不要求开始,结束或步调。

关于如何解决这个问题的任何想法?

回答

0

我相当肯定std::getchar()是你的大部分问题的原因。如果我改变你的代码使用方法:

cin >> op; 
switch (op) { 
//... 

程序运行得很好而不是

op = std::getchar(); 

//remove the rest of the line from input stream 
int temp; 
while ((temp = std::getchar()) != '\n' && temp != EOF); 

switch(op){ 
//... 

0

您正在混合使用std::cinstdin。你应该坚持一个。在switch块,这确保您使用temp = cin.get()

未消耗结束后

int temp; 
    while ((temp = std::getchar()) != '\n' && temp != EOF); 

:与其

op = std::getchar(); 

使用

op = cin.get(); 

您应该移动行因为你是我们,所以换行符留在输入流中荷兰国际集团operator>>()读取数据,如:

cin >> fuel_rate; 
0

Adding debugging print code到交换机的默认情况下,清楚地显示的内容是怎么回事:

// ... 
default: 
    cout << "unexpected: " << int(op) << endl; 
    continue; 
// ... 

意外:10

小数10是换行符\n,在使用进行格式化输入后,它仍在输入缓冲区中在std::cin

为了纠正这种情况,您可以在做格式化输入之后,从流中直到包括下一个换行符在内的剩余字符(想想在用户未输入数字时发生的情况)

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

或者使用格式化的输入(它自身跳过):

cin >> op; 

虽然你还需要照顾的文件条件的结束,当前您的代码不能做你请参阅示例在上面跑。