Autor
|
Tema: Comparando cadenas (Leído 11,258 veces)
|
DickGumshoe
|
Hola. Estoy haciendo un problema que dice lo siguiente: Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que se teclee “fin”. Yo tengo esto: /*Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que se teclee “fin”.*/ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char n1[20], n2[20], n3[20], n4[20], n5[20], n6[20], n7[20], n8[20], n9[20], n10[20], n11[20]; char n12[20]={"fin"}; printf("Introduce un nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); printf("Introduce otro nombre"); do{ printf("Introduce un nombre para comprobar si se encuentra entre los anteriores"); strstr(n10 ,n11 ))==0) printf("El nombre se encuentra entre los anteriores\n"); else printf("El nombre no se encuentra entre los anteriores\n"); } while(n11!=n12); return 0; }
Lo que me hace es que me reconoce si la primera palabra introducida (n1) es igual que la última (n11), pero con las demás no hace nada. Además, al poner "fin", no finaliza el programa. ¿Alguien podría decirme cuál es mi problema? Muchísimas gracias. Saludos.
|
|
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Well, si te fijas la funcion strstr devuelve 0 si no encuentra una instancia en el puntero indicado de lo contrario devuelve un puntero a la instancia pero veo que haces una comparacion con el 0 osea esta diciendo que escriba que hay una instancia si el valor es 0 y en las comparaciones el valor es distinto de cero si encuentra una instancia ( si es correcto) entonces bueno lo que quiero decir es que estas haciendo lo contrario de lo que queres que haga, si es distinto de cero entonces te va a mostrar que no hay instancia sabiendo que si hay lo que podes hacer es usar el operador !=
tambien poder simplicar eso de obtener nombres haciendo un bucle
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
El programa tiene errores básicos, se mantiene el mismo consejo que en tu otro tema: consigue material de referencia de calidad. Como ya se comento deberías utilizar un bucle para verificar si existe una coincidencia y también evitar el uso de la función "gets", utilizar un array de arrays de caracteres para evitar tantas variables, etc. Por ultimo no hay consistencia en las comparaciones, primero utilizas strcmp, después strstr y por ultimo: char n10[20], n11[20]; /* ... */ do { /* ... */ }while (n11! = n12);
Si bien es valido (en el sentido de respetar la sintaxis del lenguaje) no hace lo esperado ya que esta comparando las direcciones en memoria de los objetos (los arrays "n11" y "n12") y siendo objetos distintos tienen distintas direcciones. Para compararlas hay que utilizar strcmp. Para darte una idea, para obtener diez nombres eliminando el '\n' que almacena fgets puedes utilizar: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUM_NOMBRES 10 #define CHARS_NOMBRE 20 int main(void) { char nombre[NUM_NOMBRES][CHARS_NOMBRE]; int i; char *p; int ch; for (i = 0; i < NUM_NOMBRES; i++){ fgets(nombre [i ], CHARS_NOMBRE , stdin ); /* Buscamos el '\n' y lo eliminamos */ if ((p = strchr(nombre [i ], '\n')) != NULL ) *p = '\0'; else /* Linea demasiado larga, eliminamos el resto */ while ((ch = getchar()) != EOF && ch != '\n') ; } for (i = 0; i < NUM_NOMBRES; i++) printf("Nombre %d: %s\n", i + 1, nombre [i ]); return EXIT_SUCCESS; }
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
|
|
|
DickGumshoe
|
Bueno, acabo de hacer que al insertar "fin" se cierre el programa poniendo: while((strcmp(n11 , "fin")!=0));
Por otra parte, RHL, he puesto ahora do{ printf("Introduce un nombre para comprobar si se encuentra entre los anteriores"); strcmp(n10 ,n11 ))!=0) printf("El nombre se encuentra entre los anteriores\n"); else printf("El nombre no se encuentra entre los anteriores\n");
en vez de si es igual a 0. El resultado ahora es que todo lo que inserto se encuentra entre los anteriores... También, rir3760, creo que al final del manual que estoy siguiendo dan técnicas más avanzadas. Quizá por ahora pueda hacer algo parecido a lo que estoy haciendo, y cuando llegue a las técnicas, corregir el programa (porque con tantas funciones, me he perdido un poco...). Bueno, muchas gracias a los dos. Voy a seguir intentando que me salga. Saludos. EDITO: Para reducir el código, trato de hacer esto: do{ for (i=0;i<=10;i++){ printf("Introduce un nombre"); } } while(n1!=n1[9][20]);
Pero da errores. Así, solo tendría que meter una variable, tal y como dice rir3760. Gracias. Saludos.
|
|
« Última modificación: 22 Enero 2012, 12:21 pm por DickGumshoe »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
EDITO: Para reducir el código, trato de hacer esto: do{ for (i=0;i<=10;i++){ printf("Introduce un nombre"); } } while(n1!=n1[9][20]);
Pero da errores. Así, solo tendría que meter una variable, tal y como dice rir3760. Si declaras el array de esta forma: char n1[10][20];
Primero: no cuesta nada darle un nombre descriptivo al array, por ejemplo "nombre", así cuando utilizas "nombre[7]" ... La función gets espera la dirección del primer elemento del array, para obtenerla basta con utilizar "nombre[X]" donde "X" es el indice dentro del rango valido. Se puede decir mas pero serian suposiciones, mejor publica el código fuente completo para revisarlo. 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
|
|
|
DickGumshoe
|
Bueno, he editado mi código fuente con nombres más descriptivos y con comentarios. /*Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que se teclee “fin”.*/ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char nombre[10][20], i, aux; //aux es el nombre que comprobaremos si esta en la lista o no //damos un valor a 10 nombres --> ERROR do{ for (i=0;i<=10;i++){ printf("Introduce un nombre"); } } while(nombre!=nombre[9][20]); //ERROR, todo lo que comparo sale como que se encuentra entre los anteriores do{ printf("Introduce un nombre para comprobar si se encuentra entre los anteriores"); if((strcmp(nombre [0][20],aux )|| strcmp(nombre [9][20],aux ))!=0) printf("El nombre se encuentra entre los anteriores\n"); else printf("El nombre no se encuentra entre los anteriores\n"); } while((strcmp(n11 , "fin")!=0)); return 0; }
Por lo que parece, el error está en que en gets no puedo poner
Aunque no estoy seguro. Muchísimas gracias. Saludos.
|
|
|
En línea
|
|
|
|
satu
Desconectado
Mensajes: 301
Siempre aprendiendo
|
Hola Por lo que parece, el error está en que en gets no puedo poner
Aunque no estoy seguro. No puedes, si te fijas, al poner nombre[ i][20] estás accediendo a un carácter, pero en cada nombre[ i] hay un char[20], por lo tanto debes poner:
Lo mismo pasa con todos los strcmp(), por eso te falla. Debes poner: etc...
Además no es recomendable el uso de gets(), utiliza mejor fgets() Saludos
|
|
|
En línea
|
Breakbeat como forma de vida
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
Busca un libro o revisa si el que estas leyendo mas adelante ya usa nombres de variables explicitas o que venga codigo o cuesiones de buena practica. #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char szNombres[10][20], // Array de PAlabras (cada una de 20 letras) i, // Indice Contador. szLine[20]; // PAlabra q buscar en el array... //damos un valor a 10 nombres --> ERROR for (i = 0; i < 10; i++) { printf("Introduce un nombre para el elemento: %d\n", i ); fgets(szNombres [i ], 20, stdin ); } while(1) { printf("Introduce un nombre para comprobar si se encuentra entre los anteriores\n"); fgets(szLine , 20, stdin ); if (!strcmp(szLine , "fin\n")) // si no se le pone \n y szLine = fin retornara strcmp 1... break; // Exit do... for (i = 0; i < 10; ++i) { if (!strcmp(szNombres [i ], szLine )) { printf("Cadena encontrada en el indice: %d\n", i ); break; // Exit For... } } } printf("Programa terminado\n"); return EXIT_SUCCESS; }
Dulces Lunas!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
DickGumshoe
|
Incluso quitando el [20] del final, me da errores. Ahora tengo este código: int main(){ char nombre[10][20], i, aux; //aux es el nombre que comprobaremos si esta en la lista o no //damos un valor a 10 nombres --> ERROR for (i=0;i<=10;i++){ printf("Introduce un nombre"); } //ERROR, todo lo que comparo sale como que se encuentra entre los anteriores do{ printf("Introduce un nombre para comprobar si se encuentra entre los anteriores"); strcmp(nombre [9],aux ))!=0) printf("El nombre se encuentra entre los anteriores\n"); else printf("El nombre no se encuentra entre los anteriores\n"); } while((strcmp(n11 , "fin")!=0)); return 0; }
Los errores que me da el compilador están todos en el do-while. Son: 27 invalid conversion from `char' to `char*'
27 initializing argument 1 of `char* gets(char*)'
28 invalid conversion from `char' to `const char*'
28 initializing argument 2 of `int strcmp(const char*, const char*)'
Hay más, pero son exactamente iguales (para cada comparación me da esos errores que acabo de poner). Muchas gracias. Saludos.
|
|
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
yo dejo una, devuelve true si es igual de lo contrario false: bool AFUNC(void* op1,void* op2) { __asm { push edx push ecx push ebx push edi push esi mov edi,op1 mov esi,op2 mov eax,0x1 l: mov dl,byte ptr[edi] mov bl,byte ptr[esi] cmp dl,0 jne c cmp bl,0 je f c: cmp dl,bl jne n inc esi inc edi jmp l n: mov eax,0x0 f: pop esi pop edi pop ebx pop ecx pop edx } }
|
|
|
En línea
|
|
|
|
|
|