Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DickGumshoe en 22 Enero 2012, 01:17 am



Título: Comparando cadenas
Publicado por: DickGumshoe en 22 Enero 2012, 01:17 am
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:

Código
  1. /*Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee
  2. un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá
  3. a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que
  4. se teclee “fin”.*/
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. int main(){
  11.  
  12.    char n1[20], n2[20], n3[20], n4[20], n5[20], n6[20], n7[20], n8[20], n9[20], n10[20], n11[20];
  13.    char n12[20]={"fin"};
  14.  
  15.    printf("Introduce un nombre");
  16.    gets(n1);
  17.    printf("Introduce otro nombre");
  18.    gets(n2);
  19.    printf("Introduce otro nombre");
  20.    gets(n3);
  21.    printf("Introduce otro nombre");
  22.    gets(n4);
  23.    printf("Introduce otro nombre");
  24.    gets(n5);
  25.    printf("Introduce otro nombre");
  26.    gets(n6);
  27.    printf("Introduce otro nombre");
  28.    gets(n7);
  29.    printf("Introduce otro nombre");
  30.    gets(n8);
  31.    printf("Introduce otro nombre");
  32.    gets(n9);
  33.    printf("Introduce otro nombre");
  34.    gets(n10);
  35.  
  36.  
  37.    do{
  38.    printf("Introduce un nombre para comprobar si se encuentra entre los anteriores");
  39.    gets(n11);
  40.    if((strcmp(n11,n1)||
  41.    strstr(n11,n2)||
  42.    strstr(n3,n11)||
  43.    strstr(n4,n11)||
  44.    strstr(n5,n11)||
  45.    strstr(n6,n11)||
  46.    strstr(n7,n11)||
  47.    strstr(n8,n11)||
  48.    strstr(n9,n11)||
  49.    strstr(n10,n11))==0) printf("El nombre se encuentra entre los anteriores\n");
  50.    else printf("El nombre no se encuentra entre los anteriores\n");
  51.  
  52.    }
  53.    while(n11!=n12);
  54.  
  55.    system("pause");
  56.    return 0;
  57.  
  58. }
  59.  
  60.  

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.


Título: Re: Comparando cadenas
Publicado por: x64core en 22 Enero 2012, 02:19 am
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


Título: Re: Comparando cadenas
Publicado por: rir3760 en 22 Enero 2012, 03:05 am
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:
Código
  1. char n10[20], n11[20];
  2.  
  3. /* ... */
  4.  
  5. do {
  6.  
  7. /* ... */
  8.  
  9. }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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NUM_NOMBRES   10
  6. #define CHARS_NOMBRE  20
  7.  
  8. int main(void)
  9. {
  10.   char nombre[NUM_NOMBRES][CHARS_NOMBRE];
  11.   int i;
  12.   char *p;
  13.   int ch;
  14.  
  15.   for (i = 0; i < NUM_NOMBRES; i++){
  16.      printf("Nombre %2d:", i + 1);
  17.      fflush(stdout);
  18.      fgets(nombre[i], CHARS_NOMBRE, stdin);
  19.  
  20.      /* Buscamos el '\n' y lo eliminamos */
  21.      if ((p = strchr(nombre[i], '\n')) != NULL)
  22.         *p = '\0';
  23.      else
  24.         /* Linea demasiado larga, eliminamos el resto */
  25.         while ((ch = getchar()) != EOF && ch != '\n')
  26.            ;
  27.   }
  28.  
  29.   for (i = 0; i < NUM_NOMBRES; i++)
  30.      printf("Nombre %d: %s\n", i + 1, nombre[i]);
  31.  
  32.   return EXIT_SUCCESS;
  33. }

Un saludo


Título: Re: Comparando cadenas
Publicado por: DickGumshoe en 22 Enero 2012, 11:45 am
Bueno, acabo de hacer que al insertar "fin" se cierre el programa poniendo:

Código
  1. while((strcmp(n11, "fin")!=0));

Por otra parte, RHL, he puesto ahora

Código
  1.  do{
  2.    printf("Introduce un nombre para comprobar si se encuentra entre los anteriores");
  3.    gets(n11);
  4.    if((strcmp(n1,n11)||
  5.    strcmp(n2,n11)||
  6.    strcmp(n3,n11)||
  7.    strcmp(n4,n11)||
  8.    strcmp(n5,n11)||
  9.    strcmp(n6,n11)||
  10.    strcmp(n7,n11)||
  11.    strcmp(n8,n11)||
  12.    strcmp(n9,n11)||
  13.    strcmp(n10,n11))!=0) printf("El nombre se encuentra entre los anteriores\n");
  14.    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:

Código
  1. do{
  2.    for (i=0;i<=10;i++){
  3.    printf("Introduce un nombre");
  4.    gets(n1[i][20]);
  5.    }
  6. }
  7.    while(n1!=n1[9][20]);

Pero da errores. Así, solo tendría que meter una variable, tal y como dice rir3760.

Gracias.

Saludos.


Título: Re: Comparando cadenas
Publicado por: rir3760 en 22 Enero 2012, 15:05 pm
EDITO:

Para reducir el código, trato de hacer esto:

Código
  1. do{
  2.    for (i=0;i<=10;i++){
  3.    printf("Introduce un nombre");
  4.    gets(n1[i][20]);
  5.    }
  6. }
  7.    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:
Código
  1. 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


Título: Re: Comparando cadenas
Publicado por: DickGumshoe en 22 Enero 2012, 18:01 pm
Bueno, he editado mi código fuente con nombres más descriptivos y con comentarios.

Código
  1. /*Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee
  2. un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá
  3. a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que
  4. se teclee “fin”.*/
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. int main(){
  11.  
  12.    char nombre[10][20], i, aux;
  13.    //aux es el nombre que comprobaremos si esta en la lista o no
  14.  
  15.    //damos un valor a 10 nombres --> ERROR
  16.    do{
  17.    for (i=0;i<=10;i++){
  18.    printf("Introduce un nombre");
  19.    gets(nombre[i][20]);
  20.    }
  21.    }
  22.    while(nombre!=nombre[9][20]);
  23.  
  24.  
  25.    //ERROR, todo lo que comparo sale como que se encuentra entre los anteriores
  26.    do{
  27.    printf("Introduce un nombre para comprobar si se encuentra entre los anteriores");
  28.    gets(aux);
  29.    if((strcmp(nombre[0][20],aux)||
  30.    strcmp(nombre[1][20],aux)||
  31.    strcmp(nombre[2][20],aux)||
  32.    strcmp(nombre[3][20],aux)||
  33.    strcmp(nombre[4][20],aux)||
  34.    strcmp(nombre[5][20],aux)||
  35.    strcmp(nombre[6][20],aux)||
  36.    strcmp(nombre[7][20],aux)||
  37.    strcmp(nombre[8][20],aux)||
  38.    strcmp(nombre[9][20],aux))!=0) printf("El nombre se encuentra entre los anteriores\n");
  39.    else printf("El nombre no se encuentra entre los anteriores\n");
  40.  
  41.    }
  42.    while((strcmp(n11, "fin")!=0));
  43.  
  44.    system("pause");
  45.    return 0;
  46.  
  47. }
  48.  


Por lo que parece, el error está en que en gets no puedo poner
Código
  1. gets(nombre[i][20]);
Aunque no estoy seguro.

Muchísimas gracias.

Saludos.


Título: Re: Comparando cadenas
Publicado por: satu en 22 Enero 2012, 19:05 pm
Hola

Citar
Por lo que parece, el error está en que en gets no puedo poner
Código
  1. gets(nombre[i][20]);
  2.  
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:
Código
  1. gets(nombre[i]);
  2.  

Lo mismo pasa con todos los strcmp(), por eso te falla. Debes poner:
Código
  1. strcmp(nombre[0], aux) ||
  2. strcmp(nombre[1], aux) ||
  3. strcmp(nombre[2], aux) ||
  4. etc...
  5.  

Además no es recomendable el uso de gets(), utiliza mejor fgets()

Saludos


Título: Re: Comparando cadenas
Publicado por: BlackZeroX en 22 Enero 2012, 19:34 pm
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.

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int main()
  7. {
  8.    char    szNombres[10][20],  //  Array de PAlabras (cada una de 20 letras)
  9.            i,                  //  Indice Contador.
  10.            szLine[20];         //  PAlabra q buscar en el array...
  11.  
  12.    //damos un valor a 10 nombres --> ERROR
  13.    for (i = 0; i < 10; i++)
  14.    {
  15.        printf("Introduce un nombre para el elemento: %d\n", i);
  16.        fgets(szNombres[i], 20, stdin);
  17.    }
  18.  
  19.    while(1)
  20.    {
  21.        printf("Introduce un nombre para comprobar si se encuentra entre los anteriores\n");
  22.        fgets(szLine, 20, stdin);
  23.  
  24.        if (!strcmp(szLine, "fin\n"))   //  si no se le pone \n  y szLine = fin retornara strcmp 1...
  25.            break;  //  Exit do...
  26.  
  27.        for (i = 0; i < 10; ++i)
  28.        {
  29.            if (!strcmp(szNombres[i], szLine))
  30.            {
  31.                printf("Cadena encontrada en el indice: %d\n", i);
  32.                break;  //  Exit For...
  33.            }
  34.        }
  35.    }
  36.    printf("Programa terminado\n");
  37.    getchar();
  38.  
  39.    return EXIT_SUCCESS;
  40. }
  41.  
  42.  

Dulces Lunas!¡.


Título: Re: Comparando cadenas
Publicado por: DickGumshoe en 23 Enero 2012, 22:40 pm
Incluso quitando el [20] del final, me da errores.

Ahora tengo este código:

Código
  1. int main(){
  2.  
  3.    char nombre[10][20], i, aux;
  4.    //aux es el nombre que comprobaremos si esta en la lista o no
  5.  
  6.    //damos un valor a 10 nombres --> ERROR
  7.  
  8.    for (i=0;i<=10;i++){
  9.    printf("Introduce un nombre");
  10.    gets(nombre[i]);
  11.    }
  12.  
  13.  
  14.  
  15.  
  16.    //ERROR, todo lo que comparo sale como que se encuentra entre los anteriores
  17.    do{
  18.    printf("Introduce un nombre para comprobar si se encuentra entre los anteriores");
  19.    gets(aux);
  20.    if((strcmp(nombre[0],aux)||
  21.    strcmp(nombre[1],aux)||
  22.    strcmp(nombre[2],aux)||
  23.    strcmp(nombre[3],aux)||
  24.    strcmp(nombre[4],aux)||
  25.    strcmp(nombre[5],aux)||
  26.    strcmp(nombre[6],aux)||
  27.    strcmp(nombre[7],aux)||
  28.    strcmp(nombre[8],aux)||
  29.    strcmp(nombre[9],aux))!=0) printf("El nombre se encuentra entre los anteriores\n");
  30.    else printf("El nombre no se encuentra entre los anteriores\n");
  31.  
  32.    }
  33.    while((strcmp(n11, "fin")!=0));
  34.  
  35.    system("pause");
  36.    return 0;
  37.  
  38. }
  39.  

Los errores que me da el compilador están todos en el do-while.

Son:

Código:
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.



Título: Re: Comparando cadenas
Publicado por: x64core en 23 Enero 2012, 23:45 pm
yo dejo una, devuelve true si es igual de lo contrario false:

Código
  1. bool AFUNC(void* op1,void* op2)
  2. {
  3. __asm
  4. {
  5. push edx
  6. push ecx
  7. push ebx
  8. push edi
  9. push esi
  10. mov edi,op1
  11. mov esi,op2
  12. mov eax,0x1
  13. l: mov dl,byte ptr[edi]
  14. mov bl,byte ptr[esi]
  15. cmp dl,0
  16. jne c
  17. cmp bl,0
  18. je f
  19. c: cmp dl,bl
  20. jne n
  21. inc esi
  22. inc edi
  23. jmp l
  24. n: mov eax,0x0
  25. f: pop esi
  26. pop edi
  27. pop ebx
  28. pop ecx
  29. pop edx
  30. }
  31. }


Título: Re: Comparando cadenas
Publicado por: armizh en 24 Enero 2012, 01:09 am
Incluso quitando el [20] del final, me da errores.

Ahora tengo este código:

Código
  1. char nombre[10][20], i, aux;
  2. system("pause");
Primero que todo, lee http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html). Te explica porque no utilizar ni gets() ni system("pause");
Por otro lado, i es un int por lo que debes declararlo como tal ademas de que aux lo estas declarando como "char" y no como "*char".
Por lo tanto debes declarar.
Código
  1. char nombre[10][20], *aux;
  2. int i;
Esos son los errores que yo he visto, no lo he analizado profundamente. Revisa el link que escribi antes, es de aqui mismo en el foro en los mensajes fijos.
Saludos


Título: Re: Comparando cadenas
Publicado por: satu en 24 Enero 2012, 10:59 am
Hola

Tienes 2 fallos:
Código
  1. char nombre[10][20], i, aux;
  2.  
  3. for (i=0;i<=10;i++)
  4.  

1- Tienes declarado aux como char, debes declararlo como: char aux[20];
2- En el for donde introduces los nombres te sobra el = en i<=10, debe ser i<10

Saludos


Título: Re: Comparando cadenas
Publicado por: armizh en 24 Enero 2012, 22:04 pm
Hola

Tienes 2 fallos:
Código
  1. char nombre[10][20], i, aux;
  2.  
  3. for (i=0;i<=10;i++)
  4.  

1- Tienes declarado aux como char, debes declararlo como: char aux[20];
2- En el for donde introduces los nombres te sobra el = en i<=10, debe ser i<10

Saludos
Como yo dije anteriormente, el aux debe ser una matriz o un puntero, queda a gusto de el, y el = en i<=10 no sobra, ya que i puede ser igual o menor a 10. Ademas debe corregir lo del system("pause") que es bastante desaconsejable.

Saludos


Título: Re: Comparando cadenas
Publicado por: Eternal Idol en 24 Enero 2012, 22:29 pm
Como yo dije anteriormente, el aux debe ser una matriz o un puntero, queda a gusto de el, y el = en i<=10 no sobra, ya que i puede ser igual o menor a 10. Ademas debe corregir lo del system("pause") que es bastante desaconsejable.

Saludos

Si reemplazara char por un puntero a char asi alegremente sin asignarle ningun valor cometeria un error ya que se lo esta pasando a gets (mejor todavia usar fgets con stdin). Tambien tiene razon satu y ya lo habia corregido BlackZeroX (Astaroth) el otro punto, el ultimo elemento de un array es su tamaño menos uno.


Título: Re: Comparando cadenas
Publicado por: DickGumshoe en 24 Enero 2012, 22:36 pm
Muchas gracias a todos.

Ahora me compila, pero al introducir los 10 nombres, dice: 10nombre.exe dejó de funcionar. Windows está buscando una solución al problema...

Gracias.

Saludos.


Título: Re: Comparando cadenas
Publicado por: Eternal Idol en 24 Enero 2012, 22:38 pm
Muchas gracias a todos.

Ahora me compila, pero al introducir los 10 nombres, dice: 10nombre.exe dejó de funcionar. Windows está buscando una solución al problema...

Gracias.

Saludos.

Vaya uno a saber que frankestein de codigo tendras ahora, ponelo pero antes relee el hilo completo y asegurate de que estas leyendo SOLO 10 elementos en el array (ese es su tamaño, no podes leer mas sino pasa lo que viste).


Título: Re: Comparando cadenas
Publicado por: DickGumshoe en 24 Enero 2012, 23:38 pm
El código es:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(){
  6.  
  7.    char nombre[10][20], aux[20];
  8. int i;
  9.    //aux es el nombre que comprobaremos si esta en la lista o no
  10.  
  11.    //damos un valor a 10 nombres --> ERROR
  12.  
  13.    for (i=0;i<10;i++){
  14.    printf("Introduce un nombre");
  15.    gets(nombre[i]);
  16.    }
  17.  
  18.  
  19.  
  20.    //ERROR, todo lo que comparo sale como que se encuentra entre los anteriores
  21.    do{
  22.    printf("Introduce un nombre para comprobar si se encuentra entre los anteriores");
  23.    gets(aux);
  24.    if((strcmp(nombre[0],aux)||
  25.    strcmp(nombre[1],aux)||
  26.    strcmp(nombre[2],aux)||
  27.    strcmp(nombre[3],aux)||
  28.    strcmp(nombre[4],aux)||
  29.    strcmp(nombre[5],aux)||
  30.    strcmp(nombre[6],aux)||
  31.    strcmp(nombre[7],aux)||
  32.    strcmp(nombre[8],aux)||
  33.    strcmp(nombre[9],aux))!=0) printf("El nombre se encuentra entre los anteriores\n");
  34.    else printf("El nombre no se encuentra entre los anteriores\n");
  35.  
  36.    }
  37.    while((strcmp(aux, "fin")!=0));
  38.  
  39.    system("pause");
  40.    return 0;
  41.  
  42. }
  43.  

Y ya no tengo ese problema. Ahora siempre dice que el nombre se ha encontrado entre los 10 primeros...

Gracias


Título: Re: Comparando cadenas
Publicado por: Eternal Idol en 24 Enero 2012, 23:47 pm
strcmp devuelve 0 cuando las cadenas comparadas son iguales.

¿Viste el codigo que te dejo BlackZeroX (Astaroth)? ¿No te parece un poco mas elegante la comparacion con un bucle?


Título: Re: Comparando cadenas
Publicado por: DickGumshoe en 25 Enero 2012, 17:56 pm
Ahora tengo esto:

Código
  1. /*Un programa que pida 10 nombres y los memorice. Después deberá pedir que se teclee
  2. un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá
  3. a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que
  4. se teclee “fin”.*/
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. int main(){
  11.  
  12.    char nombre[10][20], aux[20];
  13. int i;
  14.    //aux es el nombre que comprobaremos si esta en la lista o no
  15.  
  16.    //damos un valor a 10 nombres
  17.  
  18.    for (i=0;i<10;i++){
  19.    printf("Introduce un nombre");
  20.    gets(nombre[i]);
  21.    }
  22.  
  23.  
  24.  
  25.    //ERROR, todo lo que comparo sale como que se encuentra entre los anteriores
  26.    do{
  27.    printf("Introduce un nombre para comprobar si se encuentra entre los anteriores");
  28.    gets(aux);
  29.    for (i=0;i<10;i++){
  30.    if((strcmp(nombre[i],aux)==0)){
  31.                                    printf("El nombre se encuentra entre los anteriores\n");
  32.                                    break;
  33. }    
  34.    else printf("El nombre no se encuentra entre los anteriores\n");
  35.    break;
  36. }
  37.    }
  38.    while((strcmp(aux, "fin")!=0));
  39.  
  40.    system("pause");
  41.    return 0;
  42.  
  43. }
  44.  

Lo que he editado ha sido el bucle for del final, y ahora, introduzco diez nombres. Cuando pongo el que quiero comprobar:

- Si es el que he metido primero (el que equivale a nombre[0]), sale como que lo he introducido --> Correcto
- Todos los demás salen como que no los había introducido...

Gracias.

Saludos.


Título: Re: Comparando cadenas
Publicado por: Eternal Idol en 25 Enero 2012, 18:55 pm
Lee el codigo con atencion, publicar 200 mensajes con un solo problema no implica que te lo vayamos a solucionar nosotros. El bucle ese no tiene sentido, si solo funciona con el primer elemento es por algo. Tal vez si usas una identacion como la gente lo veas rapidamente.


Título: Re: Comparando cadenas
Publicado por: armizh en 25 Enero 2012, 20:33 pm
Pues la primera vez funciona y el resto no porque simplemente el for modifica el valor hasta 10 y luego tu no lo seteas a 0 para que vuelva a buscar en todo el puntero. Tu bucle for y el if...else son deficientes, necesitas mejorarlos. Si aun asi no funciona no estaria mal que probaras con un switch en vez de if.
Código
  1. int salir = 0;
  2. char pregunta[3];
  3.  
  4. //Mientras salir sea 0 seguimos con el bucle
  5. while(salir==0) {
  6.    //Comparamos nombre[i] y aux
  7.    switch(strcmp(nombre[i],aux)){
  8.        case 0: //En caso de que haya correspondencia
  9.            printf("El nombre se encuentra entre los anteriores\n");
  10.            salir++;
  11.            break;
  12.        default:
  13.            i++;
  14.            break;
  15.    }
  16.    while(i==10) {
  17.        //Si es 's' lo repite, cualquier otra cosa termina el bucle
  18.        printf("Desea volver a buscar? [s/*]");
  19.        gets(pregunta);
  20.        switch(strcmp(pregunta,"s") {
  21.            case 0:
  22.                salir=0;
  23.                i=0;
  24.                break;
  25.            default:
  26.                salir++;
  27.                break;
  28.        }
  29.    }
  30. }
Esto es lo que hubiese intentado yo en tu caso, aunk no lo he probado aun xd. Ciertamente este código no te avisa si estas equivocado, pero eso es lo minimo. Pues analizalo y crea tu propio algoritmo, esto es una idea de lo que mas o menos podrias hacer y recalco: no lo he probado.
Este codigo necesita de las declaraciones y el primer for. Un consejo: yo uso for solo cuando es necesario, si te produce problemas cambialo y usa otro bucle que te de mas libertades.
Saludos.


Título: Re: Comparando cadenas
Publicado por: Eternal Idol en 25 Enero 2012, 21:00 pm
Pues la primera vez funciona y el resto no porque simplemente el for modifica el valor hasta 10 y luego tu no lo seteas a 0 para que vuelva a buscar en todo el puntero.

No, no es asi ...  for (i=0;i<10;i++){

Funciona solamente cuando se busca el primer elemento del array, sea la primera o la decima vez que se busca.

Si aun asi no funciona no estaria mal que probaras con un switch en vez de if.

No tiene ningun sentido reemplazar el if por un switch cuando solo interesan uno o dos valores a comparar.

Un consejo: yo uso for solo cuando es necesario, si te produce problemas cambialo y usa otro bucle que te de mas libertades.

Justamente for es el bucle que mas libertad ofrece, hasta se puede omitir la inicializacion, la condicion y el incremento para tener un bucle infinito.

Por favor, asegurate de lo que vas a escribir, no es bueno que los que estan aprendiendo se confundan con conceptos erroneos.


DickGumshoe: usa mas la cabeza y menos las manos para escribir mensajes.