Como faço para impedir o programa de pular o getLine? [duplicado
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.
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
comgetline( 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