Hola de nuevo, mi nuevo problema es con la funcion que nombre en el titulo, y bueno el codigo es este:
#include<iostream>
using namespace std;
int main()
{
char str1[5], str2[5];
cout << "Introduce una frase: ";
cin.getline(str1, 5, '\n');
cout << "Tu frase es: " << str1;
cout << endl << "Ingrese otra frase: ";
cin.getline(str2, 5, '\n');
cout << endl << "Tu frase es: " << str2 << endl;
cin.get();
}
Como podran ver, el programa funcionara mal si el usuario introduce una cadena mayor a 4, y queria saber si me podrian ayudar con una solucion a eso.
Gracias
cambia el 5
cin.getline(str1, 5,'\n');
por el numero que creas conveniente idem
in.getline(str2, 5, '\n');
lo mismo en el vector char str1[5], str2[5];
=====
una opcion es usar string que son por decirlo asi vectores dinamicos donde la longitud la pone el usuario
no lo probe pero deberia ser mas o menos
#include<iostrem>
#35include<string>[
using manespace std,
int main()
{
string frase;
getline(cin, frase );
cout<<"la frase es " <<frase<<endl;
return 0;
}
La primera solucion que propones no la veo muy satisfactoria, es facil agregar
cin.getline(str1, 1000000000000,'\n');
pero se ve "anti-programador" tener eso asi xD.
Me gustaria una especie de codigo que pueda manejar ese exceso de la cadena.
Probare la segunda solucion.
la primer solucion es si queres un limite de palabras...ejemplo la contraseña es de 8 digitos
la segunda es si queres que el usuario escriba hasta cansarse :laugh:
Ok, pero la cuestion esta en que si el usuario no hace caso e introduce una cadena mayor al limite que le coloque, cómo haria para manejar esa situacion y no me de error.
una opción es usa la segunda solución, recorrerla con un while y dentro del while un for y mandarle un mensaje si se pasa, diciendo jodete el exceso de palabras no vale....o mejor para no ofenderlo decirle...che son 8 dígitos nada mas
Yo entiendo, aunque si tuvieses una forma de manejar la primera situacion me gustaria saber, como el gets(), que cuando le pasas por parametro el tamaño de la cadena y el usuario escribe de mas, la funcion solamente tomara hasta el maximo que le indicaste, aunque en este caso creo q hace lo mismo y cuando va al segundo cin.getline(), lo omite, y tampoco puedo hacer algo del tipo
while(getchar() != '\n');
antes del segundo cin.getline(), por eso quisiera saber una forma de poder solucionarlo de la forma en que lo presente, y sino, bueno tendre que hacerlo de la forma en que dijiste.
Como ya te comentaron lo mejor es utilizar instancias de la clase string, con ellas los pasos son:
1) Lees la linea completa mediante string::getline.
2) Verificas su tamaño (función miembro size) y si es mayor que el permitido descartas el exceso mediante la función string::erase (http://www.cplusplus.com/reference/string/string/erase/).
Por ejemplo:
string primera;
getline(cin, primera);
if (primera.size() > max_chars) // max_chars == maximo numero de caracteres
primera.erase(max_chars, string::npos);
Si por alguna razón debes utilizar arrays de caracteres para almacenar las lineas los pasos son:
1) Lees la linea mediante la función istream::get (http://www.cplusplus.com/reference/istream/istream/get/), su funcionamiento es idéntico a istream::getline pero con la diferencia que el carácter delimitador ('\n' a menos que se especifique otro) se queda en el bufer de la entrada estándar.
2) Descartas el resto de la linea (por lo menos el '\n') mediante la función istream::ignore (http://www.cplusplus.com/reference/istream/istream/ignore/?kw=istream%3A%3Aignore).
Por ejemplo:
const int max_chars = 5; // 4 caracteres mas el '\0'
// ...
char primera[max_chars];
cin.get(primera, max_chars);
cin.ignore(numeric_limits<int>::max(), '\n');
Un saludo
Muchas gracias, todas las soluciones fueron utiles, y la ultima del compañero rir3760 se acerca mas a lo que buscaba.
+1