• Miércoles 6 de Noviembre de 2024, 02:41

Autor Tema:  Re: gets(cadena) de otra manera  (Leído 4756 veces)

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« en: Sábado 30 de Agosto de 2003, 13:46 »
0
Hola , q tal? llevo un rato pensando como puedo conseguir lo mismo que usando gets(cadena) pero sin usar gets. Quiero introducir una cadena con espacios. Lo mas cerca que me he quedao es esto:

char cadena[40];
int i=0;

do
{
cadena[ i ] =getchar();
i++;
}while (cadena[i-1] != 'n');
printf ("%sn", cadena);

pero muchas veces me salen caracteres extraños al final...
Se podria hacer con scanf??
Gracias

Astor

  • Miembro MUY activo
  • ***
  • Mensajes: 112
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #1 en: Sábado 30 de Agosto de 2003, 21:04 »
0
lo que podrias hacer para evitar caracteres extraños (suponiendo que solo quieras letras y numeros) es filtrar todo lo que no este en el rango ascii que te interesa (con un simple if y no incrementar "i")

Si no podes usar fgets, con stdin como parametro de entrada.
Scanf corta al encontrar un espacio (0x20) con lo cual no cre te sirva.

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #2 en: Domingo 31 de Agosto de 2003, 00:25 »
0
scanf corta cuando se introduce un espacio, pero yo habia pensado en algo como hacer scanf pero con caracteres solo, en vez de con la cadena. Algo asi:

int i;
char cadena[20];

for (i=0; i<20; i++)
scanf ("%c" &cadena[ i ];

Esto tambien guardaria la cadena con espacios,no? O eso no se puede hacer? es que no se porque pero el gets solo funciona si lo pongo arriba del programa, nada maz empezarlo, si lo pongo por abajo se lo salta... Se podria hacer lo de arriba y decirle que pare cuando haya un n?? Gracias

Astor

  • Miembro MUY activo
  • ***
  • Mensajes: 112
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #3 en: Domingo 31 de Agosto de 2003, 03:30 »
0
No entiendo que es lo que queres hacer.
Si usas scanf %d vas a tener que apretar enter por cada caracter...

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #4 en: Domingo 31 de Agosto de 2003, 13:08 »
0
Es verdad, no habia caido en eso, gracias

chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: gets(cadena) de otra manera
« Respuesta #5 en: Lunes 1 de Septiembre de 2003, 09:27 »
0
No se si en el codigo que tienes falta algo, pero los caracteres extraños al final se deben a que falta el de fin de cadena.
Tu array de cadena tiene 40 caracteres sin inicializar y luego vas leyendo hasta el n. El resto siguen sin inicializar. Cuando leas el n debes poner un justo encima o en el caracter siguiente (dependiendo de si quieres o no conservar el n).

char cadena[40];
int i=0;

do
{
cadena[ i ] =getchar();
i++;
}while (cadena[i-1] != 'n');
cadena[i-i] = '';   /*Poner el de fin de cadena */
printf ("%sn", cadena);

Otra opcion es que inicialices la cadena con todo antes de usarla.

Se bueno.

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #6 en: Martes 2 de Septiembre de 2003, 13:47 »
0
Gracias, tiene bastante logica

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: gets(cadena) de otra manera
« Respuesta #7 en: Miércoles 3 de Septiembre de 2003, 14:39 »
0
Con la funcion kbhit puedes hacer tu propio gets, es una funcion muy eficiente porque es de bajo nivel, sin embargo si quieres algor realmente eficiente deberas utilizar assembler..

pregunta..
lo haces porque tienes problemas con linux?

Juank
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #8 en: Domingo 28 de Septiembre de 2003, 09:53 »
0
Hola, q tal? Pues mira, estoy en windows, y el problema es el siguiente. Cuando por ejemplo uso gets al principio de un programa no pasa nada:
 
Código: Text
  1.  
  2. #include <stdio.h>
  3. int main ()
  4. {
  5.   char cadena[30],palabra[10];
  6.   printf ("escribe una frase: ");
  7.   gets(cadena);
  8.   printf ("escribe una palabra: ");
  9.   scanf ("%s", &palabra);
  10. }
  11.  
  12.  
Esto funciona.
Pero si necesito usar gets mas abajo en el programa me deja de funcionar y cuando ejecuto el programa es como si se saltara esa intruccion, igual me paso con getchar por ejemplo.... Entonces si pongo esto ya no me funciona.
 
Código: Text
  1.  
  2. #include <stdio.h>
  3. int main ()
  4. {
  5.   char cadena[30],palabra[10];
  6.   printf ("escribe una palabra: ");
  7.   scanf ("%s", &palabra);
  8.   printf ("escribe una frase: ");
  9.   gets(cadena);
  10. }
  11.  
  12.  
Al ejecutar esto me pide la palabra, la escribo, sale lo de escribe un frase y el programa termina, o pasa a la siguiente instruccion... Por que pasa esto? es mi compilador? me falta incluir algo mas en los #includes? Si no lo puedo solucionar... hay otra forma de almacenar frases con espacios?
Gracias

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #9 en: Domingo 28 de Septiembre de 2003, 09:57 »
0
Bueno, perdonar, vaya lio el post de arriba, no se que ha pasado pero se ha desordenado todo y no se editarlos en este foro. Los dos codigos primeros son el mismo y me funcionan, el que no funciona es el ultimo. gracias

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: gets(cadena) de otra manera
« Respuesta #10 en: Lunes 29 de Septiembre de 2003, 01:11 »
0
ya te lo corrgi, te habia faltado cerrar el tag de codigo al final...

Lo de el error, debes colocar la función gatc(); o la funcion getche();... preferiblemente cada vez que captures desde teclado, en general sucede despues de utilizar scanf();, estas funciones captuiran los buffer pendientes del teclado... y listo.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #11 en: Lunes 29 de Septiembre de 2003, 14:51 »
0
Hola, perdona , pero no te he entendido muy bien. Q tengo q hacer? usar getc y getche en lugar de gets? GRacias

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: gets(cadena) de otra manera
« Respuesta #12 en: Lunes 29 de Septiembre de 2003, 15:07 »
0
lo que debes usar uno de los dos despues de utilizar scanf o incluso despues de utilizar gets(aunque esto ultimo es poco probable), para que capture el buffer que queda pendiente despues de utilizar scanf y presionar enter.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #13 en: Martes 30 de Septiembre de 2003, 18:59 »
0
Te refieres a esto?
 
Código: Text
  1.  
  2. #include <stdio.h>
  3. int main ()
  4. {
  5.   char cadena[30],palabra[10];
  6.   printf ("escribe una palabra: ");
  7.   scanf ("%s", &palabra);
  8.   getche();
  9.   printf ("escribe una frase: ");
  10.   gets(cadena);
  11. }
  12.  
  13.  

Esto tampoco funciona...

desorden

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #14 en: Miércoles 1 de Octubre de 2003, 01:37 »
0
Una manera sencilla de simular gets(cadena_con_espacios)  es:
 
Código: Text
  1.  
  2. scanf("%[^n]", cadena_con_espacios);
  3.  
  4.  

Un saludo...
desorden

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #15 en: Miércoles 1 de Octubre de 2003, 09:27 »
0
Muchas gracias, no sabia esa forma, lo malo es que sigue teniendo el mismo problema que gets. Si lo pongo antes de un scanf me funciona bien, pero si lo pongo despues de un scan se lo salta, aunque ponga un getche() delante...

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: gets(cadena) de otra manera
« Respuesta #16 en: Miércoles 1 de Octubre de 2003, 14:12 »
0
no coloques un getche() , coloca mejor un getc();
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

desorden

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #17 en: Miércoles 1 de Octubre de 2003, 14:22 »
0
Una solución:
 
Código: Text
  1.  
  2. scanf("%sn", palabra);
  3. scanf("%[^n]", cadena);
  4.  
  5.  
Otra:
 
Código: Text
  1.  
  2. scanf("%s", palabra);
  3. getchar();
  4. scanf("%[^n]", cadena);
  5.  
  6.  
Un saludo...
desorden

joaquinrg

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #18 en: Miércoles 1 de Octubre de 2003, 16:37 »
0
Muchas gracias, la segunda solucion me funciona

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #19 en: Domingo 9 de Noviembre de 2003, 16:23 »
0
¿Has probado a vaciar el buffer de entrada de datos?
A veces uno introduce algo que no es leido, se queda en el buffer de entrada de datos y cuando se desea leer algo distinto se introduce lo que había quedado en el buffer.
Solución: vaciar el buffer de entrada de datos estandard cada vez que leas con scanf:

scanf("%s",&atos);
fflush(stdin);

de la librería conio.h o stdin.h (no recuerdo en cual)
Espero que te funcione ahora...
No hay tonto más molesto que el ingenioso.

mabrev

  • Miembro MUY activo
  • ***
  • Mensajes: 126
    • Ver Perfil
Re: gets(cadena) de otra manera
« Respuesta #20 en: Lunes 10 de Noviembre de 2003, 14:35 »
0
Hola:

   Yo también tuve problemas al utilizar scanf y gets en un mismo programa. Creo que el problema reside en que el scanf deja el caracter de retorno de carro en el buffer, con lo que al llamar a gets lo lee y continua, sin dar oportunidad de introducir lo que se desea realmente. Así que el problema se soluciona poniendo un getc o un gets detrás del scanf para que consuma el retorno de carro que queda pendiente.

Saludos

wagner

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
gets(cadena) de otra manera
« Respuesta #21 en: Lunes 24 de Noviembre de 2003, 17:07 »
0
:good:hola que tal esto te puede ayudar, puedes optener toda una linea con getline, y luego irla cortando poco a poco especificando hasta donde ´puedes hacerlo con el strtok, en realidad esto se hace asi.

abrir el archivo.
char *lin,*sublin;
lin=getline("nombre_archivo","n");
sublin=strtok(lin," ");//el espacio es el separador de la cadena hasta donde la quieres obtener
while(sublin!=NULL)
{
    sublin=strtok(NULL," ")
    if(sublin!=NULL)
    {
          //lo que necitas ´procesar con la subcadena
     
     }


}