使用Switch c++从用户获取输入
Getting input from user with 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时,系统不会询问开始,结束或速度。
对于如何解决这个问题有什么想法吗?
我相当确定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){
//...
程序运行正常
您正在混合使用std::cin
和stdin
。你应该坚持用其中一个。而不是
op = std::getchar();
使用 op = cin.get();
你应该移动这些行:
int temp;
while ( (temp = std::getchar()) != 'n' && temp != EOF );
在switch
块结束后,这确保您使用temp = cin.get()
由于使用operator>>()
读取数据,未使用的换行字符留在输入流中,如:
cin >> fuel_rate;
将调试打印代码添加到交换机的默认情况下,可以清楚地显示发生了什么:
// ...
default:
cout << "unexpected: " << int(op) << endl;
continue;
// ...
意想不到的:10
十进制10
是在std::cin
上使用operator>>
进行格式化输入后仍在输入缓冲区中的换行n
。
要纠正这个问题,可以忽略流中的剩余字符(想想当用户请求数字时没有输入数字时会发生什么),直到下一个换行字符,在完成格式化输入后:
cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
或者使用格式化的输入(它会自动跳过):
cin >> op;
尽管您还需要处理文件结束条件,但正如您在上面运行的示例中看到的那样,当前代码无法做到这一点。
相关文章:
- 如何从用户那里获取输入并将其存储在向量中?
- 代码在执行之前终止,并且没有从用户那里获取输入
- 从用户获取输入/输出
- TFLite 隔离错误,通过获取C++输入和输出
- 如何使 std::istream 从键盘获取输入(如 std::cin)?
- 使用 qt 或 c++ 从桌面获取输入和输出
- 您如何在C++中不断获取输入?
- 从源代码本身C++获取输入
- 函数,从问题中获取输入,并在主函数中使用该输入
- 当我们声明 cin 为 int 并从 cin 中获取输入并在 cout 中打印 cin 时会发生什么?
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- 从用户获取输入
- 我需要编写一个代码,从用户那里获取输入(句子)并停止在@处
- C 程序在获取输入[控制台应用程序]时跳过行
- 我在C++从函数中的用户获取输入、添加到数组和打印该数组时遇到问题
- 从用户那里获取输入,直到他输入一个数字
- 如何使用数组获取输入,并将其存储在record.h类的主类中的变量中
- getline 语句未获取输入
- 用户定义的功能用于竞争编程中,以获取输入