首页 > 解决方案 > 防止 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;
}

输出:

第三个输出示例

标签: c++visual-c++

解决方案


你误解了compare方法。做你想做的事情的简单方法是使用==

if (uiChoice == "C") {

并且已经说过getline是您其他问题的答案。但是请在getline与阅读数字混合使用时阅读这个非常重要的问题>>

为什么 std::getline() 在格式化提取后跳过输入?

这个问题首先引起了所有人的注意。


推荐阅读