elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:48  


Tema destacado: Sigue las noticias más importantes de elhacker.net en ttwitter!

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Comparando cadenas
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Comparando cadenas  (Leído 1,040 veces)
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Comparando cadenas
« Respuesta #15 en: 24 Enero 2012, 22:38 »

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


En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Comparando cadenas
« Respuesta #16 en: 24 Enero 2012, 23:38 »

El código es:

Código
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(){
 
   char nombre[10][20], aux[20];
int i;
   //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");
   gets(nombre[i]);
   }
 
 
 
   //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");
   gets(aux);
   if((strcmp(nombre[0],aux)||
   strcmp(nombre[1],aux)||
   strcmp(nombre[2],aux)||
   strcmp(nombre[3],aux)||
   strcmp(nombre[4],aux)||
   strcmp(nombre[5],aux)||
   strcmp(nombre[6],aux)||
   strcmp(nombre[7],aux)||
   strcmp(nombre[8],aux)||
   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(aux, "fin")!=0));
 
   system("pause");
   return 0;
 
}
 

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

Gracias


En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Comparando cadenas
« Respuesta #17 en: 24 Enero 2012, 23:47 »

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?
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Comparando cadenas
« Respuesta #18 en: 25 Enero 2012, 17:56 »

Ahora tengo esto:

Código
/*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], aux[20];
int i;
   //aux es el nombre que comprobaremos si esta en la lista o no
 
   //damos un valor a 10 nombres
 
   for (i=0;i<10;i++){
   printf("Introduce un nombre");
   gets(nombre[i]);
   }
 
 
 
   //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");
   gets(aux);
   for (i=0;i<10;i++){
   if((strcmp(nombre[i],aux)==0)){
                                   printf("El nombre se encuentra entre los anteriores\n");
                                   break;
}    
   else printf("El nombre no se encuentra entre los anteriores\n");
   break;
}
   }
   while((strcmp(aux, "fin")!=0));
 
   system("pause");
   return 0;
 
}
 

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.
En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Comparando cadenas
« Respuesta #19 en: 25 Enero 2012, 18:55 »

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.
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
armizh

Desconectado Desconectado

Mensajes: 182

His brain caught in a hole...


Ver Perfil WWW
Re: Comparando cadenas
« Respuesta #20 en: 25 Enero 2012, 20:33 »

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
int salir = 0;
char pregunta[3];
 
//Mientras salir sea 0 seguimos con el bucle
while(salir==0) {
   //Comparamos nombre[i] y aux
   switch(strcmp(nombre[i],aux)){
       case 0: //En caso de que haya correspondencia
           printf("El nombre se encuentra entre los anteriores\n");
           salir++;
           break;
       default:
           i++;
           break;
   }
   while(i==10) {
       //Si es 's' lo repite, cualquier otra cosa termina el bucle
       printf("Desea volver a buscar? [s/*]");
       gets(pregunta);
       switch(strcmp(pregunta,"s") {
           case 0:
               salir=0;
               i=0;
               break;
           default:
               salir++;
               break;
       }
   }
}
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.
En línea

Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código
git clone https://github.com/armizh/Hamster
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.392


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Comparando cadenas
« Respuesta #21 en: 25 Enero 2012, 21:00 »

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.
« Última modificación: 25 Enero 2012, 21:16 por Eternal Idol » En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Comparando Cortafuegos (firewalls)
Seguridad
Cuantico 7 9,640 Último mensaje 17 Septiembre 2004, 23:32
por Th3_Cr0w
Leer Antes de postear, Comparando Codigos:d
Análisis y Diseño de Malware
Ann 2.0 1 699 Último mensaje 22 Septiembre 2007, 14:03
por Huemulito
Blind Search, comparando motores de búsqueda
Noticias
wolfbcn 0 181 Último mensaje 8 Junio 2009, 23:02
por wolfbcn
Comparando resultados[c]
Programación C/C++
Mini_Nauta 2 1,538 Último mensaje 10 Diciembre 2010, 02:55
por Mini_Nauta
[Solucionado] Comparando 2 arrays
PHP
aaronduran2 2 451 Último mensaje 11 Febrero 2012, 08:09
por aaronduran2
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines