使用 Switch C++ 从用户那里获取输入
Getting input from user with Switch C++
我有一个系统,用户可以输入任意数量的输入 s/he 并进行一些计算。
这里是实现这个任务的代码:
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;
Adding debugging print code 你的开关的默认情况清楚地显示了发生了什么:
// ...
default:
cout << "unexpected: " << int(op) << endl;
continue;
// ...
unexpected: 10
小数 10
是在 std::cin
.
上使用 operator>>
进行格式化输入后仍在输入缓冲区中的换行符 \n
要更正此问题,您可以 ignore 流中的剩余字符(想一想当您请求时用户未输入数字时会发生什么),直到并包括下一个换行符,在您之后格式化输入:
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
或者使用格式化输入(它自己进行跳过):
cin >> op;
虽然您还需要处理文件结束条件,但您当前的代码无法做到这一点,正如您在上面的示例 运行 中看到的那样。
我有一个系统,用户可以输入任意数量的输入 s/he 并进行一些计算。
这里是实现这个任务的代码:
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;
Adding debugging print code 你的开关的默认情况清楚地显示了发生了什么:
// ...
default:
cout << "unexpected: " << int(op) << endl;
continue;
// ...
unexpected: 10
小数 10
是在 std::cin
.
operator>>
进行格式化输入后仍在输入缓冲区中的换行符 \n
要更正此问题,您可以 ignore 流中的剩余字符(想一想当您请求时用户未输入数字时会发生什么),直到并包括下一个换行符,在您之后格式化输入:
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
或者使用格式化输入(它自己进行跳过):
cin >> op;
虽然您还需要处理文件结束条件,但您当前的代码无法做到这一点,正如您在上面的示例 运行 中看到的那样。