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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  comparacion de cadenas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: comparacion de cadenas  (Leído 5,878 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
comparacion de cadenas
« 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


En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: comparacion de cadenas
« Respuesta #1 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...
}





En línea

bdoX

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: comparacion de cadenas
« Respuesta #2 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!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: comparacion de cadenas
« Respuesta #3 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: comparacion de cadenas
« Respuesta #4 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

En línea

bdoX

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: comparacion de cadenas
« Respuesta #5 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://es.wikipedia.org/wiki/Strcmp
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: comparacion de cadenas
« Respuesta #6 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: comparacion de cadenas
« Respuesta #7 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:(
En línea

bdoX

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: comparacion de cadenas
« Respuesta #8 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!
« Última modificación: 19 Febrero 2012, 00:54 am por bdoX » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: comparacion de cadenas
« Respuesta #9 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines