elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda sobre fgets() en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre fgets() en c  (Leído 4,910 veces)
lgamerm

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Duda sobre fgets() en c
« en: 14 Octubre 2016, 00:06 am »

Yo estoy aprendiendo a progrmar en c creo que ya soy de un nivel medio XD, pero hay un problema que tengo y no se si ustedes me la puedan resolver o explicarme que es lo que pasa, aqui tengo un codigo en el cual tienes que escribir "circulo" "cuadrado" y "triangulo" dependiendo cual palabra teclees el programa te dira una caracteristica de esa figura. Pues el problema viene porque con fgets guardo la palabra que escribe el usuario pero aunque sea correcta el programa no entra en ningun if, si lo hago con scanf todo correcto pero con fgets no, alguien me podria decir si es un fallo de fgets o yo me estoy equivocando.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main(){
  5.    char a[10];
  6.  
  7.    printf("Escribe una figuroa geometrica: ");
  8.    fgets(a, 10, stdin);//si esto lo cambio con scanf("%s", &a); todo iria bien pero con     //fgets no
  9.  
  10.    if(strcmpi(a, "Cuadrado") == 0){
  11.        printf("Tiene 4 lados\n");
  12.    }
  13.    if(strcmpi(a, "Triangulo") == 0){
  14.        printf("Tiene tres lados\n");
  15.    }
  16.    if(strcmpi(a, "Circulo") == 0){
  17.        printf("Es redondo\n");
  18.    }
  19.  
  20.    system("pause");
  21.    return 0;
  22. }

 :-( :-( :-( :-( :-( :-( :-( :-( :-( :-( :-(



Mod: Los códigos deben ir en etiquetas GeSHi


« Última modificación: 29 Octubre 2016, 00:30 am por lgamerm » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayudenme con una duda en c
« Respuesta #1 en: 14 Octubre 2016, 00:39 am »

fgets también recoge el caracter '\n' como parte de la cadena introducida. Por eso, al compararlo con las palabras que le das a strcmpi no son iguales. Antes de dárselas debes cambiar el '\n' por '\0'.


En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Ayudenme con una duda en c
« Respuesta #2 en: 16 Octubre 2016, 16:16 pm »

Es TAL CUAL te explicó @MAFUS, mira como podria quedar:

Código:
#include<stdio.h>
#include<string.h>

int main(){
    char a[10];

    printf("Escribe una figuroa geometrica: ");       
    fgets(a, 10, stdin);

while (a[0]!='\n')
{
    if(strcmpi(a,"Cuadrado\n") == 0){
        printf("Tiene 4 lados\n");
    }else
    if(strcmpi(a, "Triangulo\n") == 0){
        printf("Tiene tres lados\n");
    }else
    if(strcmpi(a, "Circulo\n") == 0){
        printf("Es redondo\n");
    }else
    printf("Figura no reconcida!\n");

printf("Escribe una figuroa geometrica: ");   
    fgets(a, 10, stdin);    
}

    getchar();
    return 0;
}

Con dos ENTER consecutivos sale.
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
lgamerm

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Ayudenme con una duda en c
« Respuesta #3 en: 18 Octubre 2016, 01:01 am »

fgets también recoge el caracter '\n' como parte de la cadena introducida. Por eso, al compararlo con las palabras que le das a strcmpi no son iguales. Antes de dárselas debes cambiar el '\n' por '\0'.
Muchisimas gracias, luego que encuentre alguna otra duda la pondre XD grax.



Es TAL CUAL te explicó @MAFUS, mira como podria quedar:

Código:
#include<stdio.h>
#include<string.h>

int main(){
    char a[10];

    printf("Escribe una figuroa geometrica: ");       
    fgets(a, 10, stdin);

while (a[0]!='\n')
{
    if(strcmpi(a,"Cuadrado\n") == 0){
        printf("Tiene 4 lados\n");
    }else
    if(strcmpi(a, "Triangulo\n") == 0){
        printf("Tiene tres lados\n");
    }else
    if(strcmpi(a, "Circulo\n") == 0){
        printf("Es redondo\n");
    }else
    printf("Figura no reconcida!\n");

printf("Escribe una figuroa geometrica: ");   
    fgets(a, 10, stdin);    
}

    getchar();
    return 0;
}

Con dos ENTER consecutivos sale.
Gracias tambien, ya probe el codigo y todo correcto esepto que debi aumentar el arreglo a 11, pero esta bien el concepto GRACIAS  ;-)
« Última modificación: 26 Octubre 2016, 16:11 pm por Eternal Idol » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Ayudenme con una duda en c
« Respuesta #4 en: 18 Octubre 2016, 14:54 pm »

Hola a todos, que tengan un muy buen día. -
Voy a disentir con mi profesor MAFUS, no siempre fgets recoge el enter, la siguiente imagen es el fiel reflejo del comportamiento de esta función según el caso. -   



Si se pide memoria para una cadena de 10 caracteres el comportamiento es el siguiente, si ingresas 8 o menos caracteres fgets incluirá '\n' y '\o' si ingresas desde 9 hasta lo que te parezca fgets pondrá en el último carácter el final de cadena y el salto de línea quedara en el buffer del teclado. - 

Una muy buena referencia para aprender sobre fgets.
http://foro.elhacker.net/hprogramacion_cc/comportamiento_de_la_funcion_fgetslenguaje_c-t449973.0.html;msg2063042#msg2063042

Saludos.

En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayudenme con una duda en c
« Respuesta #5 en: 18 Octubre 2016, 16:06 pm »

Cierto, si la cadena es más larga que la cantidad de bytes que debe recoger fgets lo que resta de ella se queda en el buffer del archivo.
En línea

geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Ayudenme con una duda en c
« Respuesta #6 en: 18 Octubre 2016, 17:45 pm »

Yo para eliminar el molesto salto de linea utilizo strcspn()

Código
  1. buffer[strcspn(buffer, "\n")] = '\0';

Cuenta el numero de caracteres hasta encontrar el primer '\n' reemplazándolo por '\0'.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Ayudenme con una duda en c
« Respuesta #7 en: 18 Octubre 2016, 19:11 pm »

Hola.
Yo efectuó un paso más, si strchr encuentra el salto de línea significa que el buffer del teclado está vacío y lo reemplaza por '\0', de lo contrario limpio el buffer del teclado para que no haya conflicto por ej. en un bucle al efectuar un nuevo ingreso. -

Código
  1. char cadena[MAX_CARACTERES]={'\0'}, *p=NULL;
  2. unsigned int ch=0;
  3.  
  4. fgets(cadena,  MAX_CARACTERES, stdin);
  5. if((p=strchr(cadena, '\n'))){
  6. *p='\0';
  7. }else{
  8. while((ch = getchar()) !='\n' && ch!=EOF);
  9. }

lgamerm con todo respeto te voy a efectuar una sugerencia, yo cambiaría el enunciado de tu hilo, seguramente te será de mucha ayuda lo que te enseñen en este foro, también habrá otros que busquen en internet sobre la función fgets y de la manera que está planteado les será muy difícil de lograr con el título:Ayudenme con una duda en c, una sugerencia.

Saludos.
« Última modificación: 18 Octubre 2016, 19:24 pm por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
lgamerm

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Ayudenme con una duda en c
« Respuesta #8 en: 26 Octubre 2016, 06:34 am »

Wuau XD son de mucha ayuda ya estare molestando cuando tenga otra duda XD, no pense que hubiera tanto apoyo en este foro  :o
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con buffer utilizado para leer con fgets()
Programación C/C++
Gabilan81 1 2,535 Último mensaje 25 Septiembre 2010, 22:48 pm
por Ca0s
Problema con fgets
Programación C/C++
P.AGCD 3 3,622 Último mensaje 14 Julio 2011, 20:41 pm
por kiriost
Duda con fgets
Programación C/C++
dalberto9410 4 2,770 Último mensaje 27 Marzo 2013, 07:27 am
por dalberto9410
¿ Por que fgets me funciona así ?
Programación C/C++
snake_linux 2 1,609 Último mensaje 26 Agosto 2015, 19:30 pm
por snake_linux
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines