Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 16 Febrero 2012, 23:09 pm



Título: comparacion de cadenas
Publicado por: m@o_614 en 16 Febrero 2012, 23:09 pm
estoy haciendo este programa que me pide que le ingrese datos a 10 personas cualquiera, me pide nombre,edad y estatura. Pero una vez que se los ingreso me pide que le de un nombre cualquiera y este tiene que buscar que si se encuentre, pero tengo un error porque no me esta respetando el strncmp que le puse para comparar las dos cadenas :huh: alguien que me diga donde me estoy equivocando??

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX_PERSONAS 3
  4. #define NOMBRE 20
  5. #define EDAD 20
  6. #define ESTATURA 2
  7.  
  8. int main()
  9. {
  10.    int i;
  11.    char nombre[NOMBRE],buscarNombre[NOMBRE];
  12.    int edad[EDAD];
  13.    float estatura[ESTATURA];
  14.    printf("Dame los datos de 10 persona:\n");
  15.    for(i=0;i<MAX_PERSONAS;i++)
  16.    {
  17.        printf("Dame el nombre de la persona:\n");
  18.        scanf("%s",&nombre[i]);
  19.        printf("Dame la edad de la persona\n");
  20.        scanf("%d",&edad[i]);
  21.        printf("Dame la estatura:\n");
  22.        scanf("%f",&estatura[i]);
  23.        system("cls");
  24.    }
  25.    printf("Dame el nombre de la persona que deseas buscar:\n");
  26.    scanf("%s",&buscarNombre[i]);
  27.    for(i=0;i<MAX_PERSONAS;i++)
  28.    {
  29.        if(strncmp(buscarNombre,nombre,NOMBRE)!=0)
  30.        {
  31.            printf("Dame la edad de la persona\n");
  32.            scanf("%d",&edad[i]);
  33.            printf("Dame la estatura:\n");
  34.            scanf("%f",&estatura[i]);
  35.        }
  36.        else
  37.           printf("No existe\n");
  38.    }
  39.    return 0;
  40. }
  41.  

de antemano gracias


Título: Re: comparacion de cadenas
Publicado por: x64core en 17 Febrero 2012, 00:13 am
Error:
Código:
scanf("%s",&buscarNombre[i]);

la variable "i" queda con el valor que se incrementa en el bucle for, debes de establecerla en 0 ya que los arrays empiezan de cero
o usar otra variable , tambien:

return value strncmp:
Citar
Returns an integral value indicating the relationship between the strings:
A zero value indicates that the characters compared in both strings are all equal.
A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite.

Código:
 
if(strncmp(buscarNombre,nombre,NOMBRE) == 0)
{
 found...
}





Título: Re: comparacion de cadenas
Publicado por: bdoX en 17 Febrero 2012, 00:19 am
tienes que tratar los nombres con arreglos bidimencionales, en ves de usar strncmp, usé strcmp, acá de dejo el code, no es la gran cosa, puede mejorarse mucho este codigo pero es para que tengas una idea de como se hace.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h> //sirve para llamar a strcmp ó srtncmp
  4. #define MAX_PERSONAS 3
  5. #define NOMBRE 20
  6. #define EDAD MAX_PERSONAS
  7. #define ESTATURA MAX_PERSONAS
  8.  
  9. int main ()
  10. {
  11.    int i;
  12.    char nombre[MAX_PERSONAS][NOMBRE],buscarNombre[NOMBRE];
  13.    int edad[EDAD];
  14.    float estatura[ESTATURA];
  15.    printf("Dame los datos de 10 persona\n\n");
  16.    for(i=0;i<MAX_PERSONAS;i++)
  17.    {
  18.        printf("%d) Dame el nombre de la persona: ", (i + 1));
  19.        setbuf (stdin, NULL);//limpia el buffer
  20.        scanf("%[^\n]",nombre[i]);//almacena hasta los espacios
  21.        printf("Dame la edad de la persona: ");
  22.        setbuf (stdin, NULL);//limpia el buffer
  23.        scanf("%d",&edad[i]);
  24.        printf("Dame la estatura: ");
  25.        setbuf (stdin, NULL);//limpia el buffer
  26.        scanf("%f",&estatura[i]);
  27.        system("cls");
  28.    }
  29.    printf("Dame el nombre de la persona que deseas buscar: ");
  30.    scanf("%s", buscarNombre);
  31.  
  32.    for(i=0;i<MAX_PERSONAS;i++)
  33.    {
  34.        if(strcmp(buscarNombre,nombre[i]) == 0)
  35.        {
  36.            printf ( "%d) El Nombre buscado si existe y es \n", (i + 1) );
  37.            printf ( "Nombre: %s\n", nombre[i] );
  38.            printf ( "Edad: %d\n", edad[i] );
  39.            printf ( "Estatura: %0.2f\n", estatura[i] );
  40.  
  41.            i = (MAX_PERSONAS);
  42.        }
  43.    }
  44.  
  45.    if ( i == MAX_PERSONAS )
  46.        printf ( "El Nombre buscado no existe\n" );
  47.  
  48.    setbuf (stdin, NULL);
  49.    getchar ();
  50.  
  51.    return 0;
  52. }
  53.  
  54.  

saludos!


Título: Re: comparacion de cadenas
Publicado por: rir3760 en 17 Febrero 2012, 01:41 am
Hay que tener cuidado con esto:
Código
  1. setbuf (stdin, NULL);//limpia el buffer
Ya que no es correcto debido a que la llamada a "setbuf" debe realizarse antes de cualquier llamada a función que procese el stream y no es el caso (debido al bucle).

Para evitar problemas lo mejor es leer "stdin" por linea mediante la función "fgets" (o una propia).

Un saludo


Título: Re: comparacion de cadenas
Publicado por: m@o_614 en 18 Febrero 2012, 01:00 am
Es correcto que los argumentos de strcmp(cadena1,cadena2) tengan el ????
es que me marca un warning:

passing arg 1 of strcmp makes pointer from interger without a cast



Título: Re: comparacion de cadenas
Publicado por: bdoX en 18 Febrero 2012, 02:06 am
Es correcto que los argumentos de strcmp(cadena1,cadena2) tengan el ????
es que me marca un warning:

passing arg 1 of strcmp makes pointer from interger without a cast

http://www.cplusplus.com/reference/clibrary/cstring/strcmp/ (http://www.cplusplus.com/reference/clibrary/cstring/strcmp/)
http://es.wikipedia.org/wiki/Strcmp (http://es.wikipedia.org/wiki/Strcmp)


Título: Re: comparacion de cadenas
Publicado por: rir3760 en 18 Febrero 2012, 02:13 am
Las expresiones que se pasan como argumentos a la función "strcmp" pueden tener cualquier forma siempre y cuando el tipo del resultado sea "char *".

Si tienes un problema (como parece ser) con una llamada en particular publica el código fuente del programa.

Un saludo


Título: Re: comparacion de cadenas
Publicado por: m@o_614 en 18 Febrero 2012, 05:04 am
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_PERSONAS 2
  5. #define NOMBRE 20
  6. #define EDAD 2
  7. #define ESTATURA 2
  8.  
  9. int main()
  10. {
  11.    int i;
  12.    char nombre[NOMBRE][MAX_PERSONAS],nombreBuscado[NOMBRE];
  13.    float estatura[MAX_PERSONAS];
  14.    int edad[MAX_PERSONAS];
  15.    printf("Dame los datos de 10 personas\n\n");
  16.    for(i=0;i<MAX_PERSONAS;i++)
  17.    {
  18.        printf("Dame el nombre de la persona:\n");
  19.        scanf("%s",&nombre[NOMBRE][i]);
  20.        printf("Dame la edad de la persona:\n");
  21.        scanf("%d",&edad[i]);
  22.        printf("Dame la estatura de la persona:\n");
  23.        scanf("%f",&estatura[i]);
  24.        system("cls");
  25.    }
  26.    printf("Dame el nombre de la persona que deseas buscar:\n");
  27.    scanf("%s",nombreBuscado);
  28.    for(i=0;i<MAX_PERSONAS;i++)
  29.    {
  30.        if(strcmp(nombreBuscado,nombre[NOMBRE][i])==0)
  31.        {
  32.            printf("Los datos de %s son:\n",nombreBuscado);
  33.            printf("Edad: %d\n",edad[i]);
  34.            printf("Estatura: %f\n",estatura[i]);
  35.        }
  36.        else
  37.           printf("No existe\n");
  38.    }
  39.  
  40.    return 0;
  41. }

ya le hice todos los cambios que creí convenientes, la libreria string.h, declarar la variable nombre como matriz  n-n.

Y aun asi no compila correctamente:(


Título: Re: comparacion de cadenas
Publicado por: bdoX en 18 Febrero 2012, 19:26 pm
Todo parece indicar que no viste bien el codigo que te postié.

Código:
if(strcmp(nombreBuscado,nombre[NOMBRE][i])==0)

Eso está mal. Como ya te dijieron con anterioridad, strcmp() recibe un char *, no un caracter ni nada por el estilo.

Código:
if(strcmp(nombreBuscado,nombre[i])==0)

Debe quedar asi, para que puedas recorrer todos los nombres del array bidimencional.

saludos!


Título: Re: comparacion de cadenas
Publicado por: rir3760 en 19 Febrero 2012, 16:16 pm
También se debe cambiar la declaración del array de arrays y ya en eso modificar las macros para que cumplan su función.

Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_PERSONAS  2
  6. #define LONG_NOMBRE  20
  7.  
  8. int main(void)
  9. {
  10.   char nombre[MAX_PERSONAS][LONG_NOMBRE];
  11.   char nombreBuscado[LONG_NOMBRE];
  12.   float estatura[MAX_PERSONAS];
  13.   int edad[MAX_PERSONAS];
  14.   int i;
  15.  
  16.   /* ... */
  17.  
  18.   return 0;
  19. }

Un saludo


Título: Re: comparacion de cadenas
Publicado por: Sagrini en 19 Febrero 2012, 18:11 pm
Te dejo el code que he hecho para la ocasión ;) Dos detalles sobre mi código para dejarlo "top":
1. Búscate una forma de sustituir los scanf por otra función más segura y efectiva (¿qué tal fgets/fgets+atoi?)
2. Crea una función para ingresar los datos en un fichero.

Si tengo tiempo te añado la version 0.2 con estas mejoras jajaja

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define TAM 3
  4.  
  5. int main ()
  6. {
  7. printf ("Lister 0.1 : Sagrini 2012\n-----\n\n"); int i; char string [20];
  8. struct registro { char nombre [20]; int edad; float estatura; } registro [20];
  9.  
  10. for (i=0; i<TAM; i++)
  11. { printf ("Escriba el nombre %02d   : ", i+1); scanf ("%s", &registro [i].nombre);
  12. printf ("Escriba la edad        : "); scanf ("%d", &registro [i].edad);
  13. printf ("Escriba la estatura    : "); scanf ("%f", &registro [i].estatura);
  14. printf ("-----\n");
  15. }
  16.  
  17. printf ("\nEscriba el nombre a editar: "); scanf ("%s", &string);
  18. for (i=0; i<TAM; i++)
  19. { if (strcmp (string, registro [i].nombre) == 0)
  20. { printf ("Escriba la edad %02d        : ", i+1); scanf ("%d", &registro [i].edad);
  21. printf ("Escriba la estatura       : "); scanf ("%f", &registro [i].estatura);
  22. printf ("Everything OK ;)\n\n"); return 0;
  23. }
  24. }
  25.  
  26. printf ("Nombre no encontrado...\n\n");
  27. return 0;
  28. }
  29.