Como c ++ interpreta 6e (ou qualquer número com e) como uma entrada?

Sep 17 2020

Ao executar este código e inserir 6e ou qualquer outro dígito com e, o programa não o reconhece e termina no estado else. O que eu estou fazendo errado aqui?

#include "../std_lib_facilities.h"

int main() {
    cout << "Please enter amount of money followed by the currency name:" 
        + "y for yen, p for pound or e for euro, like 3.40e. \n"
        << "This app will convert it to dollars. \n";
    double amount;
    char currency = ' ';
    double dollars;
    cin >> amount >> currency;

    cout<<"amount:  "<< amount <<"\n";
    cout<<"currency :" << currency<<"\n";

    if (currency == 'y'){
        cout <<amount<<"Yuan = "<< amount * 0.15<<" dollars";
    }
    else if (currency == 'e') {
        cout << amount << "Euro = " << amount * 1.18 << " dollars";
    }
    else if (currency == 'p') {
        cout << amount << "Pounds = " << amount * 1.29<< " dollars";
    }
    else {
        dollars = 0;
        cout << "Unknown currency\n";
    }
}

Respostas

3 rustyx Sep 17 2020 at 17:02

operator >> lê elementos separados por espaços em branco (ou até um caractere não analisável).

6enão pode ser analisado como um double(mas eé um caractere válido para notação científica, portanto, é consumido) e cinentra em um estado de falha e todas as >>chamadas subsequentes falham.

Para cin >> amount >> currency;funcionar, a entrada deve ser semelhante a 6 e(ou 6e0e).

Se você 6etambém quiser trabalhar como uma entrada, precisará lê-lo como uma string (ou ler a linha inteira com getline) e analisá-lo você mesmo (por exemplo, extrair e o caractere de sufixo e, em seguida, analisar os dígitos restantes como a double).

Veja também esta pergunta semelhante: Leia o flutuante do fluxo de entrada sem o “E” .