Pergunta

Esta pergunta já tem uma resposta aqui:

Este é o meu programa principal,

int main () {

    string command;
    cin>>command;

    if(command == "keyword")
    {
        string str, str2, str3, str4;

        cout << "Enter first name: ";
        getline (cin,str);

        cout << "Enter last name: ";
        getline (cin,str2);

        cout << "Enter age: ";
        getline (cin,str3);

        cout<<"Enter country: ";
        getline (cin,str4);

        cout << "Thank you, " << str <<" "<<str2 <<" "<<str3<<" "<<str4<< ".\n";
    }
}

Quando a palavra -chave é inserida, o programa sai imediatamente:

Digite o primeiro nome: digite o sobrenome:

ignorando completamente a capacidade de inserir o primeiro nome.

Foi útil?

Solução

string command;
cin>>command;

depois disso, apenas coma o fim da linha

string restOfLine;
getline(cin, restOfLine);

Caso contrário, o ' n' na linha em que você entra com o comando não é consumido e o próximo ReadLine lê apenas isso. Hth

Outras dicas

cin >> command não extrai o personagem da nova linha ('\n') a partir do fluxo de entrada; Ainda está lá quando você liga getline(). Portanto, você precisa de uma chamada extra -dummy para getline() (ou ignore()) para lidar com isso.

Conforme mencionado por outros, o problema é que, ao ler o comando, você está deixando o fim do caractere da linha no buffer. Além da alternativa proposta por @armen tsirunyan, você pode usar outras duas abordagens:

  • Usar std::istream::ignore por isso: cin.ignore( 1024, '\n' ); (Supondo que as linhas não tenham maior que 1024 caracteres de largura.

  • Apenas substitua cin >> command com getline( cin, command ).

Nenhuma alternativa requer a criação de uma sequência extra, a primeira é mais fraca (no caso de longas filas), a segunda alternativa modifica a semântica, pois agora toda a primeira linha (não apenas a primeira palavra) é processada como o comando, mas esta Pode ser bom, pois permite executar uma verificação de entrada mais rígida (o comando é escrito conforme necessário na primeira palavra e não há opções extras na linha de comando.

Se você tiver um conjunto diferente de comandos e alguns podem precisar de um argumento, pode ler a linha de comando em uma passagem e depois ler o comando e os argumentos a partir daí:

std::string commandline;
std::vector<std::string> parsed_command;
getline( cin, commandline );
std::istringstream cmdin( commandline );
std::copy( std::istream_iterator<std::string>(cmdin), std::istream_iterator(),
           std::back_inserter( parsed_command ) );
// Here parsed_command is a vector of word tokens from the first line: 
// parsed_command[0] is the command, parsed_command[1] ... are the arguments
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top