Pergunta

Aqui está o meu programa até agora:

int main()
{
    char choice = 'D';
    string inputString;

    cout << "Please input a string." << endl;

    getline(cin, inputString);

    LetterCount letterCount(inputString);

    while(choice != 'E')
    {
        cout << "Please choose from the following: " << endl
            << "A) Count the number of vowels in the string." << endl
            << "B) Count the number of consonants in the string." << endl
            << "C) Count both the vowels and consonants in the string." << endl
            << "D) Enter another string." << endl << "E) Exit the program." << endl;

        cin >> choice;

        if(choice == 'A' || choice == 'a')
        {
            cout << "There are " << letterCount.vowelCount() << " vowels in this string." << endl;
        }
        else if(choice == 'B' || choice == 'b')
        {
            cout << "There are " << letterCount.consonantCount() << " consonants in this string." << endl;
        }
        else if(choice == 'C' || choice == 'c')
        {
            cout << "There are " << letterCount.vowelCount() << " vowels and " << letterCount.consonantCount()
                << " consonants in this string, for a total of " << (letterCount.vowelCount() + letterCount.consonantCount())
                << " letters." << endl;
        }
        else if(choice == 'D' || choice == 'd')
        {
            cout << "Please type in another string." << endl;

            getline(cin, inputString);

            letterCount.setInputString(inputString);
        }
        else
        {
            choice = 'E';
        }
    }
}

Estou apenas incluindo o principal, pois é o doador da questão aqui, tudo o mais funciona corretamente.

O problema surge quando eu uso a opção 'd' (insira uma nova string.) Assim que o Enter for atingido, o programa retorna diretamente para o prompt de escolha e define a variável de entrada de entrada como em branco (não a palavra em branco, mas nada nele )

O primeiro GetLine (CIN, InputString) funciona perfeitamente bem, o segundo é o doador do problema ... alguma sugestão?

Foi útil?

Solução

Eu acho que você tem que adicionar algo assim:std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');depois do seu cin >> choice

A razão para isso é que o usuário realmente inseriu 'd n', mas apenas 'd' se encaixa na variável de escolha, para que o ' n' entra no buffer da CIN. Quando você chama GetLine, GetLine vê que ' n' no buffer e retorna sem nada ...

Essa chamada acima removerá todos os ' n' que estão no buffer de CIN.

Está explicado muito bem aqui

Outra solução seria algo como:

char newline;
cin >> choice;
cin.get(newline);

Isso apenas removerá um único ' n' do buffer .. (já cin >> choice adicionou um \n)

Outras dicas

Não seria melhor você usar um estojo, como este?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//Initialize
void newString();
void menu();
void switchCases(choice);

//Variables
string inputString;
char choice;
LetterCount letterCount(inputString);


int main(){
    menu();
}

void newString(){
    cout << "Please type in another string." << endl;
    getline(cin, inputString);
    letterCount.setInputString(inputString);
}

void menu(){
    cout << "Please choose from the following: " << endl
    << "A) Count the number of vowels in the string." << endl
    << "B) Count the number of consonants in the string." << endl
    << "C) Count both the vowels and consonants in the string." << endl
    << "D) Enter another string." << endl << "E) Exit the program." << endl;
    cin >> choice;
        newString();
}



void switchCases(char choice){
    switch (choice){
        case 'A':
        case 'a':{
            cout << "There are " << letterCount.vowelCount() << " vowels in this string." << endl;
            break;}
        case 'B':
        case 'b':{
            cout << "There are " << letterCount.consonantCount() << " consonants in this string." << endl;
            break;}
        case 'C':
        case 'c':{
            cout << "There are " << letterCount.vowelCount() << " vowels and " << letterCount.consonantCount()
            << " consonants in this string, for a total of " << (letterCount.vowelCount() + letterCount.consonantCount())
            << " letters." << endl;
            break;}
        case 'Q':
        case 'q':{
            break;}
        default:
        case 'D':
        case 'd':{
            main();}
    }
}

Você não está usando o getLine corretamente. Tente usar um esqueleto como este ...

#include <iostream>
#include <iomanip>
#include <string>

using std::getline;
using std::string;
using std::cin;
using std::cout;
using std::endl;


const string instructions = "Please choose from the following:\nA) Count the number of vowels in the string.\nB) Count the number of consonants in the string.\nC) Count both the vowels and consonants in the string.\nD) Enter another string.\nE) Exit the program.\n";

int main()
{
    // print instructions
    cout << instructions;

    // input text
    string text;

    bool processing = true;

    // start loop
    while (processing && getline(cin, text) && !text.empty())
    {
        // switch on input character
        switch (text[0])
        {
            case 'A':
            case 'a':
            {
                cout << "Doin A stuff" << endl;;
                break;
            }
            case 'B': 
            case 'b':
            {
                cout << "Doin B stuff" << endl;;
                break;
            }
            case 'C': 
            case 'c':
            {
                cout << "Doin C stuff" << endl;;
                break;
            }   
            case 'D': 
            case 'd':
            {
                cout << "Doin D stuff" << endl;;
                break;
            }
            case 'E':
            case 'e':
            {
                cout << "Exiting..." << endl;;
                processing = false;
                continue;
                break;
            }
            default:
            {
                cout << "I have no idea what you entered" << endl;
                processing = false;
                continue;
                break;
            }
        }   


        // print instructions for next loop
        cout << endl << instructions;
    }

    return 0;
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top