tengo un problema con esta programa en el getline() este al introducirle mas de un caracter me mete en un bucle he probado a introducirle un cin.ignore o un cin.get() pero nada sigue teniendo problemas el getline(), alguien que sepa su funcionamiento y me explique que le pasa
Si en un programa se tiene (como es tu caso) un uso intercalado del operador ">>" y getline se presentaran problemas debido a que el operador ">>" solo consume los caracteres validos para la conversión en turno, el primer carácter invalido usualmente es el avance de linea o '\n'. A continuación la función getline procesa el carácter restante (el '\n') como una linea en blanco.
El mentado problema en la función main:
while( c != 'E'){
cin >> c; // Al menos el '\n' se mantiene en el bufer ...
switch(toupper(c)){
// ...
case 'B' :
cout<<"Nombre buscado: ";
getline(cin, n); // ... lee '\n' como una linea en blanco
buscar(n,nr,lista);
mostrar(nr,lista);
break;
case 'C' :
cout<<"Nombre del cliente que desea borrar: ";
getline(cin, n); // ... lee '\n' como una linea en blanco
Para solucionarlo debes descartar el resto de la linea justo después del uso de ">>" y antes de la llamada a getline, opciones para ello son las funciones ignore y sync, un ejemplo de la primera donde se utiliza un bucle para leer una linea y un carácter:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <limits>
using std::numeric_limits;
int main()
{
string linea;
char ch;
do {
cout << "Frase: ";
getline(cin, linea);
cout << "Continuar? (S/N) ";
cin >> ch;
cin.ignore(numeric_limits<int>::max(), '\n');
}while (ch == 's' || ch == 'S');
return 0;
}
Un saludo