Páginas: [1] 2
|
 |
|
Autor
|
Tema: gets (strings) no lo entiendo muy bien, ayuda plz (Leído 629 veces)
|
Kasswed
Colaborador
Conectado
Mensajes: 4.248
|
Pues he pasado el uso de scanf en las cadenas de texto, y lo entiendo de maravilla. Todo muy bien (strcpy, strcat etc etc) todo perfecto, hasta que he llegado a "gets"... Y peus, en el curso de Gorka Urrutia esto es lo que pone de explicación:Almacena lo que vamos tecleando en la variable buffer hasta que pulsamos ENTER. Si se ha almacenado algún caracter en buffer le añade un '\0' al final y devuelve un puntero a su dirección. Si no se ha almacenado ninguno devuelve un puntero NULL. y luego este ejemplo:#include <stdio.h> #include <string.h>
int main() { char cadena[30]; char *p;
printf( "Escribe una palabra: " ); fflush( stdout ); p = gets( cadena ); if (p) printf( "He guardado: \"%s\" \n", cadena ); else printf( "No he guardado nada!\n" ); } El ejemplo no lo entiendo, o sea... nada... no entiendo casi nada... Pero lo que es la explicación tmp la entiendo... ¿Qué quiere decir con NULL? No lo pillo...
??? ??? ???
|
|
|
|
« Última modificación: 16 Septiembre 2005, 23:09 por kasswed »
|
En línea
|
Le dije monta que te llevo al Sol, me dijo "qué tontería, arderás", le dije que no pensaba ir de día y se reía...
|
|
|
|
Cobac
|
ahi hay dos cosas explicadas, el buffer del teclado (que trae más de un quebradero de cabeza y tienes que hacer el fflush...) y el puntero. lo que hace esque cuando apretas enter el puntero vale la primera dirección de memoria de la frase (y los caracteres están seguidos,como si fuera un array... no se si me explico...) y le añade un \0 final porque es la marca que se emplea en los strings p = gets( cadena ); gets devuelve el puntero del primer carácter (no hace falta que pongas p = gets(cadena); si quieres guardar un string con poner gets(cadena); ya te vale) if (p) printf( "He guardado: \"%s\" \n", cadena ); si p es cierto (osea si no es null) te muestra ese printf, y si fuera null saltaría al else (recordemos que p sería null sino se hubiera guardado ningun carácter espero haberme explicado correctamente y para cualquier duda ya sabes  salu2
|
|
|
|
|
En línea
|
PIV 2533 @ 2720Mhz | 512MB DRR333 @ 358 | 160 Gb + 40 Gb Seagate Barracuda
En la Edad Media la Iglesia robaba con los diezmos. En el siglo XXI la SGAE roba con sus cánones.
|
|
|
viruss1362
Desconectado
Mensajes: 189
|
Yo si kieres usar el puntero p, yo lo haria asi, por que de la otra forma no se para que lo usas... #include <stdio.h> #include <string.h>
int main() { char cadena[30]; char *p; printf( "Escribe una palabra: " ); /* limpiamos, yo uso siempre stdin.. nunca he usado stdout ¿en que se diferencian? */ fflush( stdin );
/* apuntamos a la cadena, seria igual que p=&cadena[0]; */ p = cadena; /* usamos gets, para que tb pille los espacios en la cadena */ gets(p); if (p) printf( "He guardado: \"%s\" \n", p); else printf( "No he guardado nada!\n" ); }
|
|
|
|
|
En línea
|
Más vale parecer un idiota con la boca cerrada, que abrir la boca y demostrar que lo eres
|
|
|
Kasswed
Colaborador
Conectado
Mensajes: 4.248
|
Mas o menos...
Pero, lo que no entiendo por k tienes k añadir un puntero... no tienes ya un string? Con ese no se puede trabajar? O sea... no se si me explico yo ahora, solo haria falta el string para trabajar, o sea, k el puntero no haria falta :S:S:Sk kilombo, me estoy yo haciendo un lio mientras escribo...
A ver si he entendido...
p = gets(cadena)
p (puntero) apunta a cadena, por lo tanto esto es como lo de los arrays apuntados no? K ya tienes la direccion en memoria del string no?
y con gets(cadena) lo k se hace es igual k con scanf pero guardando una frase no? :S:Ssi p es cierto (osea si no es null) te muestra ese printf, y si fuera null saltaría al else (recordemos que p sería null sino se hubiera guardado ningun carácter Por lo tanto NULL es cuando presionas ENTER pero no metes ningún dato? Po lo tanto no se guarda automaticamente el \0 y todo se va al carajo no?
Bueno, a ver si mas o menos lo voy entendiendo.. porque todo me va muy bien hasta k llegan los punteros....
|
|
|
|
« Última modificación: 16 Septiembre 2005, 23:10 por kasswed »
|
En línea
|
Le dije monta que te llevo al Sol, me dijo "qué tontería, arderás", le dije que no pensaba ir de día y se reía...
|
|
|
viruss1362
Desconectado
Mensajes: 189
|
una pregunta, en el programa que has puesto, el original #include <stdio.h> #include <string.h>
int main() { char cadena[30]; char *p;
printf( "Escribe una palabra: " ); fflush( stdout ); p = gets( cadena ); if (p) printf( "He guardado: \"%s\" \n", cadena ); else printf( "No he guardado nada!\n" ); } Si ponemos enter directamente se considera un caraceter? podrias hacerlo de la siguiente manera, para que el enter no contara... #include <stdio.h> #include <string.h>
int main() { char cadena[30]; char *p; int i;
printf( "Escribe una palabra: " ); /* limpiamos, yo uso siempre stdin.. nunca he usado stdout ¿en que se diferencian? */ fflush( stdin );
/* apuntamos a la cadena, seria igual que p=&cadena[0]; */ p = cadena;
gets(p); for(i=1;i<30;i++) { if (*(p + i)=='\0') { printf( "He guardado: \"%s\" \n", p); exit(0); } } printf( "No he guardado nada!\n" ); }
|
|
|
|
|
En línea
|
Más vale parecer un idiota con la boca cerrada, que abrir la boca y demostrar que lo eres
|
|
|
|
Cobac
|
un string es un puntero al primer elemento (y la marca final es el '\0') osea que lo de p=gets(cadena); es una tontería hacerlo (desde mi punto de vista) con hacer gets(cadena); ya vale, y esto lo que hace es ir guardando consecutivamente carácter por carácter y al final pone un \0, y al ponerle esa marca final se puede tratar como un string, pero lo que en verdad es un string son X posiciones de memoría seguidas que guardan caracteres y el final es el \0... salu2 
|
|
|
|
|
En línea
|
PIV 2533 @ 2720Mhz | 512MB DRR333 @ 358 | 160 Gb + 40 Gb Seagate Barracuda
En la Edad Media la Iglesia robaba con los diezmos. En el siglo XXI la SGAE roba con sus cánones.
|
|
|
Kasswed
Colaborador
Conectado
Mensajes: 4.248
|
Ok, ahora más o menos lo pillo.
Thx thx
Saludos!
|
|
|
|
« Última modificación: 16 Septiembre 2005, 23:10 por kasswed »
|
En línea
|
Le dije monta que te llevo al Sol, me dijo "qué tontería, arderás", le dije que no pensaba ir de día y se reía...
|
|
|
sch3m4
Colaborador
Desconectado
Mensajes: 1.516
Nihil est in intelectu quod prius not fuerit insen
|
si usas fflush(stdin); estás limpiando el buffer de entrada de datos (el teclado) y si usas fflush(stdout); limpias el de salida. Es incluso mejor, usar flushall(); que lo limpia todo
|
|
|
|
|
En línea
|
|
|
|
Kasswed
Colaborador
Conectado
Mensajes: 4.248
|
Una cosa, todos conicidís en que hacer:p=gets(cadena); No sirve para nada, pero es que si hago:gets(cadena); No me devuelve datos!! Es decir, que por huevos tengo que poner p=gets(cadena);
Por k pasa eso? Será porque lo hago desde linux o k? ??? ???
Saludos!
|
|
|
|
« Última modificación: 16 Septiembre 2005, 23:11 por kasswed »
|
En línea
|
Le dije monta que te llevo al Sol, me dijo "qué tontería, arderás", le dije que no pensaba ir de día y se reía...
|
|
|
sch3m4
Colaborador
Desconectado
Mensajes: 1.516
Nihil est in intelectu quod prius not fuerit insen
|
sí que te devuelve, lo que ocurre es que no es en el puntero "p" sino en la variable "cadena". Haz esto: ... fflush(stdin); printf("Introduce una string: "); gets(cadena); puts(cadena); ...
|
|
|
|
|
En línea
|
|
|
|
Kasswed
Colaborador
Conectado
Mensajes: 4.248
|
Me han surgido varias dudas después de intentar hacer un programa usando strings, para ver si ya por fin comprendía to el rollo... Y el caso es que creo que lo estaba haciendo bien hasta que lo he compilado y me ha tirado error en el famoso gets... Luego tengo otra duda con el goto, es decir, se puede ir hacia atrás en unprograma? con goto? Bueno, mejor os pongo el ejemplo y me decís que he hecho mal :S#include <stdio.h> #include <string.h> int main() { primero: /*Aki defino esto, pa hacer luego goto*/ char nombreC[80];/*de momento aki yame tira un error antes de char, o sea, en "primero:" y otro error más k no comprendo*/ char calle[90]; char telefono[9]; char ciudad[20]; char codigoP[5]; char *p1; printf("Introduzca su nombre y sus dos apellidos: "); fflush(stdout); p1=gets(nombreC);/*el famoso gets, tiene tres errores... lo he probado de todas las formas que decí y me sigue dando error*/ printf(" \nIntroduzca su calle: "); scanf("%s", calle); printf("\nIntroduzca su teléfono: "); scanf("%s", telefono); printf("\nIntroduzca su ciudad: "); scanf("%s", ciudad); printf("Introduzca su código postal: "); scanf("%s", codigoP); if (p1) { int erroneo; printf("Sus datos son:\n\n"); printf("Nombre: %s", nombreC); printf("\nCalle: %s", calle); printf("\nTeléfono: %s", telefono); printf("\nCiudad: %s", ciudad); printf("\nCódigo postal: %s", codigoP); printf("\n\nPor favor, presione ENTER si los datos son correctos, sino el numero 1:\n"); /*No sabia coo hacerlo asi k lo hice asi :P*/ scanf("%i", erroneo); if (erroneo=1) { goto primero; /*si el usuario dice k es erroneo voy otra vez arriba para que reinserte los datos*/ } } else printf("Ha habido un fallo en alguno de los datos, por favor reinténtelo"); getchar(); } Pues eso es todo...
|
|
|
|
« Última modificación: 16 Septiembre 2005, 23:11 por kasswed »
|
En línea
|
Le dije monta que te llevo al Sol, me dijo "qué tontería, arderás", le dije que no pensaba ir de día y se reía...
|
|
|
Casidiablo
Colaborador
Desconectado
Mensajes: 2.800
Más inteligente que el simio promedio
|
Pues lo compilé en Dev C, y no genera erroes y... Pues que te digo yo, es mejor si colocas el codigo donde se capturan los datos en una función, así cada vez que quieras capturar datos solo la invocas. Y te vas metiendo de paso en la Programación Estructurada... ahi te pongo un ejemplo #include <stdio.h> #include <string.h> #include <stdlib.h> char nombreC[80]; char calle[90]; char telefono[9]; char ciudad[20]; char codigoP[5]; char *p1; void captura() { system("cls"); printf("Introduzca su nombre y sus dos apellidos: "); fflush(stdout); p1=gets(nombreC); printf(" \nIntroduzca su calle: "); scanf("%s", calle); printf("\nIntroduzca su teléfono: "); scanf("%s", telefono); printf("\nIntroduzca su ciudad: "); scanf("%s", ciudad); printf("Introduzca su código postal: "); scanf("%s", codigoP); } int main() {
captura(); if (p1) { int erroneo; printf("Sus datos son:\n\n"); printf("Nombre: %s", nombreC); printf("\nCalle: %s", calle); printf("\nTeléfono: %s", telefono); printf("\nCiudad: %s", ciudad); printf("\nCódigo postal: %s", codigoP); printf("\n\nPor favor, presione ENTER si los datos son correctos, sino el numero 1:\n"); scanf("%i", erroneo); if (erroneo=1) { captura(); } } else printf("Ha habido un fallo en alguno de los datos, por favor reinténtelo"); getchar(); } Corre perfectamente en DEV Saludos...
|
|
|
|
|
En línea
|
Masturba tu cerebro y eyacularán tus ideas...


Visita mi blog:

|
|
|
Kasswed
Colaborador
Conectado
Mensajes: 4.248
|
Jejeje, es verdad, en Dev C++ lo compila de maravilla, no se por k en Anjuta no :S Me tendre que poner a programar en Win o usar otro programa :S
Con respecto a la función si, llevas razón jeje, no se me había ocurrido hacerlo con una función. Thx.
Saludos!
|
|
|
|
« Última modificación: 16 Septiembre 2005, 23:11 por kasswed »
|
En línea
|
Le dije monta que te llevo al Sol, me dijo "qué tontería, arderás", le dije que no pensaba ir de día y se reía...
|
|
|
sch3m4
Colaborador
Desconectado
Mensajes: 1.516
Nihil est in intelectu quod prius not fuerit insen
|
también podrías usar un bucle do while, para que repita lo que quiera hasta que el usuario introduzca 1
|
|
|
|
|
En línea
|
|
|
|
Fletch
Desconectado
Mensajes: 5
|
Hola Bueno tengo un pequeño problema con el gets(), realmente no se a que se deba. Quisiera saber si alguien me puede explicar que es lo que pasa, si lo estoy usando mal y si es asi ¿Cual seria la manera correcta de utilizarlo?, o se puede utilizar indistintamente con el scanf, ¿Cual seria ventaja de usar uno sobre el otro?.
Bueno lo que pasa con el programa es que quiero leer un valor entero previamente con el scanf() y posteriormente al intentar leer con el gets() se salta la sentencia de gets().
Aqui dejo el programa, ojala me puedan ayudar, gracias anticipadas.
#include <stdio.h> #include <conio.h>
int main() { char oracion[81]; int i; printf("Escribe un numero entero: "); scanf("%i",&i); printf( "Escribe una oracion:\n"); gets(oracion); printf( "\nHas escrito: \"%s\"\n", oracion ); getch();
return 0; }
En este segundo programa pasa lo mismo solo que cuando entra al ciclo for en caso de que n sea mayor a 1 (n>1) se salta el primer gets();
Gracias.
#include <stdio.h> #include <conio.h>
main() { char nombre[10]; int n; printf ("Numero de Veces: " ); scanf("%i",&n); for (int i = 0; i < n; i++) { printf("\nIntroduce tu nombre: "); scanf("%s",nombre); printf("Bienvenido a C, %s",nombre); } getch(); }
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1] 2
|
|
|
|