Taking char 'e' as input and comparison

Okay, so I'm doing an exercise in a book, converting different types of money into dollars. For some reason, when I enter “e” as input for the char variable and compare it with “e” in the if statement, the comparison does not work, however, if I replace it with a different letter, it will work fine. What a deal? Here is the code:

int main()
{
    const double yen_per_dollar = .013;
    const double pound_per_dollar = 1.55;
    const double euro_per_dollar = 1.29;

    double amount = 1;
    char unit = ' ';

    std::cout << "Please enter a amount followed by a unit (p, y, or e): ";
    std::cin >> amount >> unit;

    if (unit == 'y')
        std::cout << amount << " yen is $" << amount * yen_per_dollar << " dollars.\n";
    if (unit == 'p')
        if (amount == 1)
            std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n";
        else
            std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n";
    if (unit == 'e')
        if (amount == 1)
            std::cout << amount << " euro is $" << amount * euro_per_dollar << " dollars.\n";
        else
            std::cout << amount << " euros is $" << amount * euro_per_dollar << " dollars.\n";
    else 
        std::cout << "Sorry, that input isn't in the correct format." << std::endl;
    std::cin >> amount; // Keeps window open
}
+5
source share
2 answers

, . , . , , - num_get ( , ): , , .

, , , , .. , , - , (BTW, - ). :

#include <iostream>
#include <locale>
#include <string>
#include <tuple>
#include <map>
#include <ctype.h>

struct currency_get:
    std::num_get<char>
{
    iter_type do_get(iter_type it, iter_type end, std::ios_base&, std::ios_base::iostate& err, double& v) const
    {
        std::string input;
        for (; it != end && (*it == '.' || *it == '-' || *it == '+'
                             || isdigit(static_cast<unsigned char>(*it))); ++it)
        {
            input.push_back(*it);
        }
        errno = 0;
        if (input.empty())
        {
            err |= std::ios_base::failbit;
        }
        else
        {
            v = strtod(input.c_str(), 0);
        }

        return it;
    }
};

int main()
{
    typedef std::tuple<double, std::string, std::string> desc;
    std::map<char, desc> currencies;
    currencies['y'] = desc(0.013, "yen", "yen");
    currencies['p'] = desc(1.55, "pound", "pounds");
    currencies['e'] = desc(1.29, "euro", "euro");

    double amount(0);
    char   currency(' ');
    std::locale loc(std::locale(), new currency_get);
    std::cin.imbue(loc);

    if (std::cin >> amount >> currency)
    {
        std::map<char, desc>::const_iterator it(currencies.find(currency));
        if (it != currencies.end())
        {
            desc const& d(it->second);
            std::cout << amount << " " << (amount == 1? std::get<1>(d): std::get<2>(d)) << " is "
                      << (std::get<0>(d) * amount) << " dollar"
                      << (std::get<0>(d) * amount == 1? "": "s") << "\n";
        }
    }
    else
    {
        std::cout << "input failed\n";
    }
}
+2

:

1. - system("pause");, , Visual Studio, . 2. if else . ,

else if (unit == 'p') {
    if (amount == 1)
        std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n";
    else
        std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n";
}

, else . ", ", "e". , , . 3. return 0 int main.

4. , std , ,

using namespace std;

, , std namespace ,

cout << "Please enter a amount followed by a unit (p, y, or e): ";


5. e char integer/double .. . , cin, e . .

-1

All Articles