c++ - 防止 CIN 上的多个输入
问题描述
相关信息:这是一个 Visual Studio C++ 控制台应用程序
当我遇到问题时,我正在做一些基本的 C++ 以保持新鲜感。这是我的整个cpp
文件:
#include <iostream>
#include <string>
double CelsiusToFahrenheit(double);
double FahrenheitToCelsius(double);
void GetUserInput();
int main() {
GetUserInput();
}
double CelsiusToFahrenheit(double celsiusNum) {
return ((celsiusNum * (9.0 / 5.0)) + 32.0);
}
double FahrenheitToCelsius(double fahrenheitNum) {
return ((fahrenheitNum - 32.0) * (5.0/9.0));
}
void GetUserInput() {
char uiChoice;
double uiNumber;
std::cout << "Please Select an Option: " << std::endl;
std::cout << "Enter C for Celsius to Fahrenheit conversion, Enter F for Fahrenheit to Celsius conversion: ";
std::cin >> uiChoice;
if (uiChoice == 'C') {
std::cout << "Please enter the degrees in Celsius: ";
std::cin >> uiNumber;
std::cout << std::endl << uiNumber << " degrees C in Fahrenheit is " << CelsiusToFahrenheit(uiNumber) << " degrees F." << std::endl;
}
else if (uiChoice == 'F') {
std::cout << "Please enter the degrees in Fahrenheit: ";
std::cin >> uiNumber;
std::cout << std::endl << uiNumber << " degrees F in Celsius is " << FahrenheitToCelsius(uiNumber) << " degrees C." << std::endl;
}
else {
std::cout << "Invalid choice, please try again." << std::endl;
GetUserInput();
}
return;
}
在里面GetUserInput()
,当运行 line 时std::cin >> uiChoice;
,如果用户输入超过 1 个字符,我会多次执行该else
语句。
示例输出:
我想知道,我怎么能
a) 防止多重输入
b) 输入多个输入时仅触发一次 else
还
我尝试过初始化uiChoice
为字符串并使用compare()
,但结果......很奇怪?该函数的一个示例:
void GetUserInput() {
std::string uiChoice;
double uiNumber;
std::cout << "Please Select an Option: " << std::endl;
std::cout << "Enter C for Celsius to Fahrenheit conversion, Enter F for Fahrenheit to Celsius conversion: ";
std::cin >> uiChoice;
if (uiChoice.compare("C")) {
std::cout << "Please enter the degrees in Celsius: ";
std::cin >> uiNumber;
std::cout << std::endl << uiNumber << " degrees C in Fahrenheit is " << CelsiusToFahrenheit(uiNumber) << " degrees F." << std::endl;
}
else if (uiChoice.compare("F")) {
std::cout << "Please enter the degrees in Fahrenheit: ";
std::cin >> uiNumber;
std::cout << std::endl << uiNumber << " degrees F in Celsius is " << FahrenheitToCelsius(uiNumber) << " degrees C." << std::endl;
}
else {
std::cout << "Invalid choice, please try again." << std::endl;
GetUserInput();
}
return;
}
在以下输出中,您可以看到输入的任何字符都将满足if (uiChoice.compare("C"))
.
输出:
我没有太多使用该compare()
功能的经验,所以这很可能是我解释compare()
错误的用途。
编辑:
更新GetUserInput()
为std::getline()
void GetUserInput() {
std::string uiChoice;
double uiNumber;
std::cout << "Please Select an Option: " << std::endl;
std::cout << "Enter C for Celsius to Fahrenheit conversion, Enter F for Fahrenheit to Celsius conversion: ";
std::getline(std::cin, uiChoice);
if (uiChoice.compare("C")) {
std::cout << "Please enter the degrees in Celsius: ";
std::cin >> uiNumber;
std::cout << std::endl << uiNumber << " degrees C in Fahrenheit is " << CelsiusToFahrenheit(uiNumber) << " degrees F." << std::endl;
}
else if (uiChoice.compare("F")) {
std::cout << "Please enter the degrees in Fahrenheit: ";
std::cin >> uiNumber;
std::cout << std::endl << uiNumber << " degrees F in Celsius is " << FahrenheitToCelsius(uiNumber) << " degrees C." << std::endl;
}
else {
std::cout << "Invalid choice, please try again." << std::endl;
GetUserInput();
}
return;
}
输出:
解决方案
你误解了compare
方法。做你想做的事情的简单方法是使用==
if (uiChoice == "C") {
并且已经说过getline
是您其他问题的答案。但是请在getline
与阅读数字混合使用时阅读这个非常重要的问题>>
为什么 std::getline() 在格式化提取后跳过输入?
这个问题首先引起了所有人的注意。
推荐阅读
- c - 警告 C4047:“=”:“int”的间接级别与“int *”不同
- mysql - MYSQL Select 命令进入 S3 存储桶错误
- java - MyBatis MapperScannerConfigurer 从类路径扫描基础包
- php - PHP拆分数据范围以仅获得块免费
- javascript - 如何使用 Nuxt 正确加载 js 文件?奇怪的行为
- xml - XPath $ 和花括号是什么意思?
- php - 变量在 if 语句外部而不在其内部起作用
- android-emulator - Detox 框架可以在模拟器/模拟器上拍照吗?
- sql-server - 从查询构建视图
- node.js - http POST 未到达后端