Programa está saltando sobre GetLine () sin tomar la entrada del usuario [duplicado]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
Este es un problema muy extraño, cuando mi programa pide al usuario para la dirección, en lugar de esperar a la entrada, parece saltarse la función getline () completamente
Answerinput:
cout << "would you like to add another entry to the archive? (Y/N):";
cin >> answer;
cout << endl;
cout << endl;
answer = toupper(answer);
switch(answer)
{
case 'Y':
Entrynumber++;
cout << "began record number " << Entrynumber << "+ 1." << endl;
cout << "Enter the last name of the person to be entered" << endl;
cin >> stringentry;
cout << endl;
stringlength = stringentry.length();
strcpy(Record[Entrynumber].Last_Name, stringentry.c_str());
Record[Entrynumber].Last_Name[stringlength] = '*';
cout << "Enter the first name of the person" << endl;
cin >> stringentry;
cout << endl;
stringlength = stringentry.length();
strcpy(Record[Entrynumber].First_Name, stringentry.c_str());
Record[Entrynumber].First_Name[stringlength] = '*';
cout << "Enter the SSN of the person" << endl;
cin >> Record[Entrynumber].SSN;
cout << endl;
cout << "Enter the age of the person" << endl;
cin >> Record[Entrynumber].Age;
cout << endl;
cout << "Enter the address of the person" << endl;
cin.getline(Record[Entrynumber].Address,70);
cout << endl;
stringentry = Record[Entrynumber].Address;
stringlength = stringentry.length();
Record[Entrynumber].Address[stringlength] = '*';
cout << "you entered:" << endl;
for(jim = 0 ; Record[Entrynumber].Last_Name[jim + 1] != '*' ; jim++)
{
cout << Record[Entrynumber].Last_Name[jim];
}
cout << ',' ;
for(jim = 0 ; Record[Entrynumber].First_Name[jim + 1] != '*' ; jim++)
{
cout << Record[Entrynumber].First_Name[jim];
}
cout << endl;
cout << Record[Entrynumber].SSN << endl;
cout << Record[Entrynumber].Age << endl;
for(jim = 0 ; Record[Entrynumber].Address[jim + 1] != '*' ; jim++)
{
cout << Record[Entrynumber].Address[jim];
}
cout << endl;
cout << endl;
goto Answerinput;
case 'N':
cout << "ok" << endl;
break;
default:
cout << "invalid answer" << endl;
goto Answerinput;
}
salida de la consola
would you like to add another entry to
the archive? (Y/N):Y
began record number 6+ 1.
Enter the last name of the person to be entered
John
Enter the first name of the person
John
Enter the SSN of the person 22222222
Enter the age of the person 22
Enter the address of the person
you entered:
Joh,Joh
22222222
22
*¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
//////////////22 more lines of'|'//////////////////////////////////////////////
...
¦¦¦¦¦¦¦¦l3-j
would you like to add another entry to the archive? (Y/N):
Tanto cin.getline () y getline () hacen lo mismo.
Estoy usando MVC ++ 2008.
Todos los campos de la matriz de registro son estructuras, Record [Entrynumber] .Address es una matriz de caracteres.
Solución
Cin es, probablemente, dejando el retorno de carro en el búfer que GetLine recupera. Trate
cin.ignore(1000, '\n');
cin.getline(Record[Entrynumber].Address,70);
El operador >> no elimina el carácter de nueva línea después de la recuperación de datos, pero ignora que conduce un espacio en blanco antes de la recuperación de datos, mientras que getline sólo recupera lo que está en allí, y elimina el '\ n' después de leer, ya que es aparte de la la línea que está 'haciendo'.
Otros consejos
En vista de que puede haber de entrada que queda en la memoria intermedia de la que su getline lee primero, me gustaría sugerir que se borre la memoria intermedia antes de tratar de introducir los siguientes datos:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');