comparacion de cadenas

Iniciado por m@o_614, 16 Febrero 2012, 23:09 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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??

#include <stdio.h>
#include <stdlib.h>
#define MAX_PERSONAS 3
#define NOMBRE 20
#define EDAD 20
#define ESTATURA 2

int main()
{
    int i;
    char nombre[NOMBRE],buscarNombre[NOMBRE];
    int edad[EDAD];
    float estatura[ESTATURA];
    printf("Dame los datos de 10 persona:\n");
    for(i=0;i<MAX_PERSONAS;i++)
    {
        printf("Dame el nombre de la persona:\n");
        scanf("%s",&nombre[i]);
        printf("Dame la edad de la persona\n");
        scanf("%d",&edad[i]);
        printf("Dame la estatura:\n");
        scanf("%f",&estatura[i]);
        system("cls");
    }
    printf("Dame el nombre de la persona que deseas buscar:\n");
    scanf("%s",&buscarNombre[i]);
    for(i=0;i<MAX_PERSONAS;i++)
    {
        if(strncmp(buscarNombre,nombre,NOMBRE)!=0)
        {
            printf("Dame la edad de la persona\n");
            scanf("%d",&edad[i]);
            printf("Dame la estatura:\n");
            scanf("%f",&estatura[i]);
        }
        else
           printf("No existe\n");
    }
    return 0;
}


de antemano gracias

x64core

Error:
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:
CitarReturns 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.


if(strncmp(buscarNombre,nombre,NOMBRE) == 0)
{
found...
}





bdoX

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.


#include <stdio.h>
#include <stdlib.h>
#include <string.h> //sirve para llamar a strcmp ó srtncmp
#define MAX_PERSONAS 3
#define NOMBRE 20
#define EDAD MAX_PERSONAS
#define ESTATURA MAX_PERSONAS

int main ()
{
    int i;
    char nombre[MAX_PERSONAS][NOMBRE],buscarNombre[NOMBRE];
    int edad[EDAD];
    float estatura[ESTATURA];
    printf("Dame los datos de 10 persona\n\n");
    for(i=0;i<MAX_PERSONAS;i++)
    {
        printf("%d) Dame el nombre de la persona: ", (i + 1));
        setbuf (stdin, NULL);//limpia el buffer
        scanf("%[^\n]",nombre[i]);//almacena hasta los espacios
        printf("Dame la edad de la persona: ");
        setbuf (stdin, NULL);//limpia el buffer
        scanf("%d",&edad[i]);
        printf("Dame la estatura: ");
        setbuf (stdin, NULL);//limpia el buffer
        scanf("%f",&estatura[i]);
        system("cls");
    }
    printf("Dame el nombre de la persona que deseas buscar: ");
    scanf("%s", buscarNombre);
   
    for(i=0;i<MAX_PERSONAS;i++)
    {
        if(strcmp(buscarNombre,nombre[i]) == 0)
        {
            printf ( "%d) El Nombre buscado si existe y es \n", (i + 1) );
            printf ( "Nombre: %s\n", nombre[i] );
            printf ( "Edad: %d\n", edad[i] );
            printf ( "Estatura: %0.2f\n", estatura[i] );
           
            i = (MAX_PERSONAS);
        }
    }
   
    if ( i == MAX_PERSONAS )
        printf ( "El Nombre buscado no existe\n" );
   
    setbuf (stdin, NULL);
    getchar ();
   
    return 0;
}



saludos!

rir3760

Hay que tener cuidado con esto:
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
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

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


bdoX

Cita de: 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

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

rir3760

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
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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PERSONAS 2
#define NOMBRE 20
#define EDAD 2
#define ESTATURA 2

int main()
{
    int i;
    char nombre[NOMBRE][MAX_PERSONAS],nombreBuscado[NOMBRE];
    float estatura[MAX_PERSONAS];
    int edad[MAX_PERSONAS];
    printf("Dame los datos de 10 personas\n\n");
    for(i=0;i<MAX_PERSONAS;i++)
    {
        printf("Dame el nombre de la persona:\n");
        scanf("%s",&nombre[NOMBRE][i]);
        printf("Dame la edad de la persona:\n");
        scanf("%d",&edad[i]);
        printf("Dame la estatura de la persona:\n");
        scanf("%f",&estatura[i]);
        system("cls");
    }
    printf("Dame el nombre de la persona que deseas buscar:\n");
    scanf("%s",nombreBuscado);
    for(i=0;i<MAX_PERSONAS;i++)
    {
        if(strcmp(nombreBuscado,nombre[NOMBRE][i])==0)
        {
            printf("Los datos de %s son:\n",nombreBuscado);
            printf("Edad: %d\n",edad[i]);
            printf("Estatura: %f\n",estatura[i]);
        }
        else
           printf("No existe\n");
    }

    return 0;
}


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:(

bdoX

#8
Todo parece indicar que no viste bien el codigo que te postié.


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.


if(strcmp(nombreBuscado,nombre[i])==0)


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

saludos!

rir3760

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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_PERSONAS  2
#define LONG_NOMBRE  20

int main(void)
{
   char nombre[MAX_PERSONAS][LONG_NOMBRE];
   char nombreBuscado[LONG_NOMBRE];
   float estatura[MAX_PERSONAS];
   int edad[MAX_PERSONAS];
   int i;
   
   /* ... */
   
   return 0;
}


Un saludo
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