Foros del Web » Programación para mayores de 30 ;) » Programación General »

leer cadena de carácteres por teclado en C++

Estas en el tema de leer cadena de carácteres por teclado en C++ en el foro de Programación General en Foros del Web. Hola a todos tengo un problema con los strings, y es cuando introduzco una cadena de carácteres por teclado. cuando escribo una cadena seguida sin ...
  #1 (permalink)  
Antiguo 12/03/2005, 14:33
 
Fecha de Ingreso: noviembre-2003
Ubicación: Valencia
Mensajes: 131
Antigüedad: 21 años
Puntos: 1
leer cadena de carácteres por teclado en C++

Hola a todos

tengo un problema con los strings, y es cuando introduzco una cadena de carácteres por teclado.

cuando escribo una cadena seguida sin espacio, lo lee perfectamente, pero el problema está cuando introduzco una cadena deecarácteres con espacio, entonces sólo lee los carácteres hasta el espacio en blanco, y no sé qué hacer para que pueda leer todo lo que escribo.
estoy probando programita simples para ver como funciona cada cosa, pero es que esto no sé proque no me sale bien, el código es el siguiente:
Cita:
#include<iostream>
#include <string>
using namespace std;

int main (void)
{
string s;
cin >> s;
cout << s;
system("PAUSE");
return 0;
}
espero vuestra ayuda, y siento hacer estas preguntas tontas, pero es que estoy empezando aún, y si no pregunto, nunca me aclararé las dudas que tengo

Os agradezco las respuestas por antemano.
Saludos y paz
  #2 (permalink)  
Antiguo 12/03/2005, 15:07
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Una forma de hacerlo sería esta:

Código:
#include <iostream>
#include <string>
using namespace std;

int main (void)
{
  string s;
  cin.getline((char*)s.c_str(), 256);
  cout << s.c_str();
  system("PAUSE");
  return 0;
}
cin lee (segun su estado y sus flags) numeros, caracteres (un byte) y cadenas, por esa razón tiene una función llamada getline que podemos usar para leer una linea completa (incluyendo varias palabras).

cout permite empujar un array de caracteres y en ese caso escribe todo lo que haya en el, si le pasas un string escribira sola la primera cadena.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 12/03/2005, 16:12
 
Fecha de Ingreso: noviembre-2003
Ubicación: Valencia
Mensajes: 131
Antigüedad: 21 años
Puntos: 1
Muchas gracias por la aclaración

pero resulta que este código, no me muestra nada en la salida (pantalla)

lo que pasa es que estoy intentando implementar una función de búsqueda en un vector. Este vector, contiene como datos cadenas dee carácteres, y la los datos de entrada al vector son, el mismo vector, el número de elementos del vector, y la cadena de carácteres a buscar.
el código que he implementado es el siguiente:

Cita:
bool BuscarAutor (obra v[], int n, string x)
//v es el vector que contiene los datos
//n es el número de elementos en el vector
//x es el dato buscado
{
int izq, der, cen;
bool enc = false;
izq = 0;
der = n;
der = der - 1;
cen = (izq + der) / 2;
/*
* Mientras no se encuentre el elemento
* y existan más de dos elementos en el subvector continúa
* la búsqueda
*/
while ( (izq <= der) && (v[cen] != x) )
{
if (x < v[cen])
der = cen - 1;
else
izq = cen + 1;
cen = (izq + der) / 2;
}
/*
* Se puede salir del bucle por haber encontrado el
* elemento o por haber llegado a un subvector de un solo elemento
*/
if (izq > der)
enc = false;
else
enc = true;
return enc;

}//BuscarAutor
estoy usando el método de búsqueda binaria, pero el problema es que no me encuentra el nombre que yo busco, y siempre me devuelve el valor del elemento anterior.

espero no molestar tanto, y muchísimas gracias por la ayuda.

Saludos y Paz

Última edición por achiqalquds; 12/03/2005 a las 16:13
  #4 (permalink)  
Antiguo 12/03/2005, 17:03
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Si das más información sobre el código (como por ejemplo la definición de obra) tal vez pueda ayudarte.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 12/03/2005, 18:44
 
Fecha de Ingreso: noviembre-2003
Ubicación: Valencia
Mensajes: 131
Antigüedad: 21 años
Puntos: 1
Saludos

Cita:
Iniciado por Eternal Idol
Si das más información sobre el código (como por ejemplo la definición de obra) tal vez pueda ayudarte.
Ah si, se me olvidó decirlo, obra es una estructura de datos, que tiene dos registros de tipo string, uno llamado autor y otro titulo.
en realidad, la búsqueda y las comparaciones en el código se realiza con v[i].autor, cuando ejecuto el programa, y le doy datos correctos, siempre me devuelve el dato anterior, por ejemplo, si el dato que estoy buscando se encuentra en v[i].autor, me devuelve v[i-1].autor, pero la función siempre me devuelve false.

no sé si es necesario poner todo el código fuente aquí.
muchísimas gracias por la ayuda.
Saludos y Paz
  #6 (permalink)  
Antiguo 13/03/2005, 05:17
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Yo lo haría mas o menos así:

Código:
int BuscarAutor (obra v[], int n, string x)
//v es el vector que contiene los datos 
//n es el número de elementos en el vector
//x es el dato buscado
{
  for (int i = 0; i < n; i++)
  {
    if ( (v[i].autor == x) )
    {
      return i;
    }
  }
  return -1;
}//BuscarAutor
La función devuelve int, si no lo encuentra devuelve -1 y si lo encuentra la posición en el array.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 13/03/2005, 06:35
 
Fecha de Ingreso: noviembre-2003
Ubicación: Valencia
Mensajes: 131
Antigüedad: 21 años
Puntos: 1
Saludos.

Bueno sí, yo también lo haría de esta misma forma, creo que este algoritmo se llama búsqueda secuencial, pero lo que se me pide en el ejercicio es usar el algoritmo de búsqueda binaria, ya que el vector tendrá más de 11000 elementos, y hay que elejir un método mejor de búsqueda, ya que se sabe que este vector estará ordenado.

la verdad es que yo veo que la función está muy bien implementada, no encuentro que es lo que puede fallar.

pero de todas formas, muchas gracias.
  #8 (permalink)  
Antiguo 13/03/2005, 08:04
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
A mi me parece que esto: while ( (izq <= der) && (v[cen] != x) ) no tiene ningún sentido a menos que obra sea en realidad una clase y tengas implementado el operador != en la misma, lo mismo aca: if (x < v[cen]).

VC++ no compila ninguna de las dos lineas, pero podrías cambiarlas por:

Código:
while ( (izq <= der) && (v[cen].autor != x) )
{
  if (x < v[cen].autor)
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 13/03/2005 a las 08:19
  #9 (permalink)  
Antiguo 13/03/2005, 08:41
 
Fecha de Ingreso: noviembre-2003
Ubicación: Valencia
Mensajes: 131
Antigüedad: 21 años
Puntos: 1
no no, obra no es ningúna clase,

si te parece bien, por favor, visita esta página donde he colgado el código entero que he hecho, así entenderás lo que quiero hacer:

biblioteca.cpp.txt

el fichero usado está tambien en la web:
datos.txt

los he colgado ahi, para que el mensaje no sea pesado

ahi verás que es lo que quiero hacer:

1. se lee el fichero, y se guarda en un vector.
2. se ordena el vector según el algoritmo elegido
3. después se intenta buscar un autor (aquí donde no me funciona)
4. luego se intenta buscar por título, usando otro tipo de algoritmos

este ejercicio pretende que se familiarize con los distintos métodos de ordenación y búsqueda

agradezco muchísimo tu ayuda amigo.

saludos y paz
  #10 (permalink)  
Antiguo 13/03/2005, 10:34
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
cin >> autor; solo pone la primera palabra con lo cual estas perdiendo parte del nombre, la busqueda jamás funcionará así.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 13/03/2005, 10:51
 
Fecha de Ingreso: noviembre-2003
Ubicación: Valencia
Mensajes: 131
Antigüedad: 21 años
Puntos: 1
vale, eso ya lo veo, jejejej

pero no sé cómo hacer para solucionarlo, me he quedado parado ahi
  #12 (permalink)  
Antiguo 13/03/2005, 11:00
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Donde se consigue accion, en vez de cin >> accion; esto:

Código:
cin.get(accion);
cin.ignore(1);
donde se consigue autor en vez de cin >> autor; esto:

Código:
getline(cin, autor, '\n');
Así me está funcionando bien.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #13 (permalink)  
Antiguo 13/03/2005, 11:52
 
Fecha de Ingreso: noviembre-2003
Ubicación: Valencia
Mensajes: 131
Antigüedad: 21 años
Puntos: 1
Funciona perfectamente

muchísimas gracias

pero podrías explicarme un poco (si tienes tiempo y ganas claro, jejej) cómo lo has conseguido? cual es la diferencia entre esta secuencia y otra? podrías hablarme un poco de estas dos funciones y sus datos de entrada? me refiero a ignore() y getline()

porque ya sabes, la idea es aprender, no buscar código hecho, y como dice el refran: "no me des un pez, sino, enseñame cómo pescar" jejejej

muchas gracias de nuevo.
Saludos y paz
  #14 (permalink)  
Antiguo 13/03/2005, 14:35
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
De nadas.

La primer diferencia es que en vez de empujar una variable (cin >> accion;) pedimos un caracter solo (cin.get(accion);) y después nos saltamos el \n con ignore, después en vez de empujar una variable (cin >> autor;) que solo consigue una palabra hacemos un getline que consigue toda la linea (permitiendonos escribir Shaw, Bernard por ejemplo).

Para llegar a este código especifico estuve probando bastante, porque si hacia un cin >> accion; y después un cin.getline((char*)autor.c_str(), 256); ni siquiera se detenía a leer la linea (según comprobe con un par de pruebas el problema era el cin >> accion;) y encontré en una página web una recomenación sobre hacer ignores que justamente se saltan una cantidad de caracteres o también puede usar como parámetro (opcional) un caracter (\n por ejemplo). Después seguía fallando en la busqueda y vi que dentro del objeto string no se asignaba bien el _MySize por lo que seguí buscando en google y vi otra forma de leer una linea que es getline() donde se especifica el stream de entrada, la cadena y el terminador de linea. Con estas modificaciones me funcionó finalmente.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 13/03/2005 a las 14:38
  #15 (permalink)  
Antiguo 21/08/2008, 07:57
 
Fecha de Ingreso: octubre-2007
Mensajes: 4
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: leer cadena de carácteres por teclado en C++

[B]me podes pasar la biblioteca.cpp lo antes posible a [email protected] muchasa gracias/B]
  #16 (permalink)  
Antiguo 06/12/2009, 11:01
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 15 años, 2 meses
Puntos: 13
Respuesta: leer cadena de carácteres por teclado en C++

Tambien podias usar gets(string) de la libreria stdio.h
  #17 (permalink)  
Antiguo 06/12/2009, 11:07
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Respuesta: leer cadena de carácteres por teclado en C++

Cita:
Iniciado por mhax Ver Mensaje
Tambien podias usar gets(string) de la libreria stdio.h
Fijate que el hilo es del 2005. Ahora si, al tema, no podes usar asi directamente gets (recibe como parametro un puntero a char) con un objeto string y ademas es una funcion insegura que no permite especificar el tamaño del buffer, es preferible usar fgets (con stdin) en todo caso.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 22:05.