Pregunta

Esta pregunta ya tiene una respuesta aquí:

Este es mi 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";
    }
}

Cuando se ingresa la palabra clave, el programa genera inmediatamente:

Ingrese el nombre: Ingrese el apellido:

sin pasar por completo la capacidad de ingresar el primer nombre.

¿Fue útil?

Solución

string command;
cin>>command;

Después de esto, solo coma el final de la línea

string restOfLine;
getline(cin, restOfLine);

De lo contrario, el ' n' en la línea donde no se consume el comando y la siguiente línea de lectura lo lee solo. Hth

Otros consejos

cin >> command no extrae el personaje de Newline ('\n') de la secuencia de entrada; todavía está ahí cuando llamas getline(). Por lo tanto, necesita una llamada extraña extra para getline() (o ignore()) para lidiar con esto.

Como se mencionó por otros, el problema es que mientras lee el comando, está dejando el carácter del final de la línea en el búfer. Además de la alternativa propuesta por @armen tsirunyan, puede usar otros dos enfoques:

  • Usar std::istream::ignore para eso: cin.ignore( 1024, '\n' ); (Suponiendo que las líneas no serán mayores de 1024 caracteres de ancho.

  • Solo reemplazar cin >> command con getline( cin, command ).

Ninguna alternativa requiere crear una cadena adicional, la primera es más débil (en caso de líneas muy largas), la segunda alternativa modifica la semántica, ya que ahora toda la primera línea (no solo la primera palabra) se procesa como el comando, pero esto Puede estar bien, ya que le permite realizar una verificación de entrada más estricta (el comando se escribe según sea necesario en la primera palabra, y no hay opciones adicionales en la línea de comando.

Si tiene diferentes conjuntos de comandos y algunos podrían necesitar un argumento, puede leer la línea de comando en un pase y luego leer el comando y los argumentos desde allí:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top