Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: barnix456 en 5 Mayo 2012, 17:38 pm



Título: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 17:38 pm
Hola a todos, me han dejado algunos ejercicios en #C y he resolvido la mayoría, pero me atore en este, creo que trata sobre comparar cadenas, me pide que use un ciclo WHILE de cierta forma que si se escribe la frase "abrete sesamo" el programa se cierra, pero si no el programa sigue pidiendo la frase para que se cumpla el ciclo y se cierre, y pues la verdad no se como comparar "LETRAS". Rápidamente a mi se me ha ocurrido algo asi:

Citar
#include <stdio.h>
int main()
{
   char a;
   
   printf ("Escribe la contraseña correcta \n");
   scanf ("%c", &a);
   b:
   while (a=="abrete sesamo\n");
   {
      exit(0);
   }
   goto b;
   
   return 0;
}


Pero no lleva nada de logica, Aunque se me ha ocurrido otra idea, hace unos dias hace unos dias, a qui mismo en el foro hice una pregunta sobre como hacer para poner una contraseña a un programa, osea que no se tipea la contraseña correcta no abre las opciones del programa y si, el usuario "EXEL"  me resolvio la duda de esta manera:

Citar
#include <stdio.h>
#include <string.h>
#define MAX_CHAR 100
 
int main ()
{
   char pass[MAX_CHAR];
 
   printf("Introduzca password: \n");
   fgets(pass,MAX_CHAR,stdin);
 
   if(strcmp(pass,"batman es mi vecino")==0)
   {
      printf ("Contraseña verdadera\n");
 
   }
   else
   {
      printf ("La contraseña es incorrecta\n");
   }
   return 0;
}

pero la verdad no entendi muy bien eso de "strcmp", pueden orientarme si puedo usar este miismo metodo, para mi duda y agregarla al ciclo WHILE.
GRACIAS


Título: Re: Intento comparar cadenas [novato]
Publicado por: STANHMAL en 5 Mayo 2012, 17:53 pm
Hola que tal,

bien strcmp lo que hace es una comparación de cadenas, y funciona enviando las 2 cadenas que necesitas comparar, de la siguiente forma :

strcmp( Cadena1, Cadena2 ), y esta te retorna un número, si retorna 0 quiere decir que las 2  cadenas son iguales, y si te retorna un número diferente de 0, es porque son diferentes.

Lo que tu estas haciendo esta mal, ya que creaste una variable de tipo carácter que solo puede almacenar un carácter, para almacenar más de un carácter, necesitas crear un vector, tal y como lo hizo EXEL, esto que hizo es que la variable que se crea pueda almacenar tantos caracteres como le hallas pedido dentro de [ ], es decir,

char pass[100];

pass, puede almacenar hasta un total de 100 caracteres, mientras que si la dejas:

char pass;

pass, puede almacenar un único carácter.

$4!u2


Título: Re: Intento comparar cadenas [novato]
Publicado por: Slava_TZD en 5 Mayo 2012, 17:56 pm
Código
  1. #include <string.h>
  2. #include <stdio.h>
  3. ...
  4. {
  5. char textointroducido[50];
  6. ...
  7.    while(strcmp(texteintroducido, "fin\n")!=0) {
  8. ...
  9.   }
  10. }
  11.  

Si estás interesado mira acá (http://foro.elhacker.net/programacion_cc/comparar_cadenas_sin_usar_strcmp-t308649.0.html), hay ejemplos en los que se crea una función específica para lo que tu pides.


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 18:00 pm
Hay ok, de esa forma es en la que funciona  strcmp realmente no lo sabia, entonces tengo que usar eso, dentro del ciclo, intentare aserlo, y en un rato posteo lo que llevo, igual como estoy empezando me atoro mucho en C, gracias  STANHMAL, se agradece... XD


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 18:10 pm
intente hacer algo y esto es lo que me ha salido:

Citar
#include <stdio.h>
#include <string.h>
#define MAX_CHAR 100

int main()
{
   char pas[MAX_CHAR];
   
   printf ("introduzca la frase correcta\n");
   fgets(pas,MAX_CHAR,stdin);
   
   while (strcmp(pas,"abrete sesamo")==0)
   {
      printf ("la frase es correcta\n");
      getchar();
      exit(0);
   }
   printf ("Frase no leida\n");
   getchar();
   
   return 0;
}

pero me marca error el exit dice lo siguiente:
ejer3.c:16:3: aviso: declaración implícita de la función ‘exit’ [-Wimplicit-function-declaration]

que estoy haciendo mal??


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 18:18 pm
Al fin me ha quedado:

Citar
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR 100

int main()
{
   char pas[MAX_CHAR];
   
   printf ("introduzca la frase correcta\n");
   fgets(pas,MAX_CHAR,stdin);
   
   while (strcmp(pas,"ola\n")==0)
   {
      printf ("la frase es correcta\n");
      getchar();
      exit(0);
   }
   printf ("Frase no leida\n");
   getchar();
   
   return 0;
}

me hacia falta agregar:
#include <stdlib.h>

Gracias, me ha servido de mucho su ayuda!! :)


Título: Re: Intento comparar cadenas [novato]
Publicado por: Slava_TZD en 5 Mayo 2012, 18:36 pm
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define MAX_CHAR 100
  5.  
  6. int main()
  7. {
  8.   char pas[MAX_CHAR];
  9.  
  10.   printf ("introduzca la frase correcta\n");
  11.   fgets(pas,MAX_CHAR,stdin);
  12.  
  13.   while (strcmp(pas,"ola\n")==0)
  14.   {
  15.      printf ("la frase es correcta\n");
  16.      getchar();
  17.      exit(0);
  18.   }
  19.   printf ("Frase no leida\n");
  20.   getchar();
  21.  
  22.   return 0;
  23. }

El while ahí no tiene sentido, si lo quieres hacer así lo que va ahí es un if. En tu primer mensaje decías que el programa debia seguir pidiendo frases, hasta que la frase fuese la correcta, el tuyo no hace eso.


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 18:42 pm
Ha si tienes razon, mira este si lo hace, creo, observalo y me comentas, ah y el while por que afuerzas quieren que use eso, por que bien solo seria un if-else, pero bueno

Citar
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR 100

int main()
{
   char pas[MAX_CHAR];
   
   a:
   printf ("introduzca la frase correcta\n");
   fgets(pas,MAX_CHAR,stdin);
   
   while (strcmp(pas,"ola\n")==0)
   {
      printf ("la frase es correcta\n");
      getchar();
      exit(0);
   }
   printf ("Frase no leida\n");
   getchar();
   goto a;
   
   return 0;
}


Título: Re: Intento comparar cadenas [novato]
Publicado por: STANHMAL en 5 Mayo 2012, 18:50 pm
...

 :xD olvida el goto, es mala practica de programación, de momento no se hace visible que es malo, puesto que son cosas sencillas, pero cuando son códigos realmente largos, se vuelve realmente molesto.

Mira esta otra forma.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX_CHAR 100
  5.  
  6. int main()
  7. {
  8.   char pas[MAX_CHAR];
  9.  
  10.   do{
  11.    printf ("introduzca la frase correcta\n");
  12.    fgets(pas,MAX_CHAR,stdin);
  13.  
  14.    if(strcmp(pas,"ola\n")!=0){  
  15.      printf ("la frase es incorrecta, intente nuevamente.\n");
  16.      getchar();
  17.    }
  18.  
  19.   }while (strcmp(pas,"ola\n")!=0);
  20.  
  21.   printf ("la frase es correcta.\n");
  22.   getchar();
  23.   return 0;
  24.  
  25. }
  26.  

$4!u2


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 18:54 pm
wuao!, se ve un poco raro a primera vista, pero analizandolo bien, se ve mas formal por asi decirlo, solo tengo una duda por que el:

do {

edito:
tambien esta mal, por que escribo la frase correcta "ola" y dice: frase incorrecta, y lo que deberia decir es que esta bien y salir, aparte el programa nunca se cierra, son siemples errores, intentare analizar ese nuevo modelo, eso es nuevo para mi... :)


Título: Re: Intento comparar cadenas [novato]
Publicado por: Slava_TZD en 5 Mayo 2012, 18:55 pm
Acortando código:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. main()
  5. {
  6.   char texto[100];  
  7.  
  8.   printf ("Introduzca la frase correcta: "); fgets(texto,sizeof(texto),stdin);
  9.   while(strcmp(texto,"hola\n")!=0) {
  10.   printf ("Error!\nIntroduzca la frase correcta: "); fgets(texto,sizeof(texto),stdin);
  11.   }
  12.   printf ("La frase es correcta.\n");
  13. }

Joder, que aburrido estoy XD

EDIT: ¿De que libro estás aprendiendo C?


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 19:00 pm
jajaja...  eso estuvo bueno, vamos eso nunca se me hubiera ocurrido, esta muy bueno eh!! lo mismo pero mas pequeño


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 19:03 pm
Realmente que es lo que hace esta linea:

fgets(texto,sizeof(texto),stdin);

EDITO:
Realmente de muchos libros, no solo de uno, llevo uno de análisis de algoritmos y dos de c:

1) Programacion.en.C.Metodologia.Algoritmos.y.Estructura.de.datos.Editorial.McGraw-Hill
2) Programacion en C Metodologia, Algoritmos y Estructurade datos [Luis Joyanes Aguilar & Ignacio Zahomero Martines]
3) Como.Programar.en.C.C.Plus.Plus.-.Deitel.Prentice-Hall
4) Lo que pueda aprender aqui en el foro


Título: Re: Intento comparar cadenas [novato]
Publicado por: exel en 5 Mayo 2012, 19:21 pm
La definicion de fgets() es la siguiente:

char *fgets(char *cadena, int n, FILE *stream);

"Basicamente dice: copiar una cadena de longitud menor a n que este en stream y guardarla en cadena"

...aunque te parezca un poco rara te explico en español lo que significa:

*stream es una fuente de donde se obtiene la cadena de caracteres, esta fuente debe ser un archivo. En tu caso stdin es un archivo donde se almacena lo que escribes por teclado, y se denomina buffer de entrada.

n es la cantidad de caracteres que quieres obtener como maximo de *stream. Comunmente, le asignamos a n la longitud de tu cadena.

cadena es el nombre de tu variable donde se debe almacenar lo que obtendas de *stream

... una restriccion que impone la funcion fgets() es la siguiente:

Citar
"Ningún carácter adicional es leído después del carácter de nueva línea ('\n') o después de un final de fichero (EOF)"


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 19:26 pm
:o pues a si que le entienda, no mucho tendre que practicar un poco mas sonbre esto, para que lo domine un poco, gracias EXEL


Título: Re: Intento comparar cadenas [novato]
Publicado por: exel en 5 Mayo 2012, 19:33 pm
Anteriormente dijiste esto:

edito:
tambien esta mal, por que escribo la frase correcta "ola" y dice: frase incorrecta, y lo que deberia decir es que esta bien y salir, aparte el programa nunca se cierra, son siemples errores, intentare analizar ese nuevo modelo, eso es nuevo para mi... :)

La respuesta es que quieres comparar la cadena obtenida con fgets() con la cadena "ola\n", pero, como dije anteriormente, fgets() no puede copiar el caracter '\n'. Por eso estaras comparando "ola" con "ola\n" y nunca lograras asertar.

Saludos


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 19:37 pm
Gracias, ese error no lo habia notado, pero bueno al final ya quedo! gracias de nuevo


Título: Re: Intento comparar cadenas [novato]
Publicado por: david_BS en 5 Mayo 2012, 20:18 pm
yo había hecho una función para comparar dos cadenas, te puede servir si deseás alguna comparación con el fin de realizar un ordenamiento alfabético por ejemplo.
http://foro.elhacker.net/programacion_cc/ejemplo_de_ordenamientos_basicos-t358139.0.html



Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 5 Mayo 2012, 20:48 pm
ok gracias... lo revisare, cualquier informacion es buena.. :)


Título: Re: Intento comparar cadenas [novato]
Publicado por: Rodrigosolari en 6 Mayo 2012, 02:25 am
amigo una ayuda en tu problema de comparar cadenas.....  espero que sea de tu ayuda

#include<iostream>

using namespace std;

int main(){
   char cadena1[100];
   char cadena2[100];
   bool rpt = true;
   int i=0;
   cout<<"Ingrese la primera Cadena de Texto"<<endl;
   gets(cadena1);
   cout<<"Ingrese la segunda Cadena de Texto"<<endl;
   gets(cadena2);
   cout<<endl<<"\t\t\t\tComparando"<<endl<<endl;
   do{
      if(cadena1[ i ]!=cadena2[ i ]){//borra los espacios entre la i y  [], pues si no  no me lo reconoce
         rpt = false;
         break;
      }
      i++;
   }while(cadena1[ i ]!='\0' || cadena2[ i ]!='\0' );//borra los espacios entre la i y  [], pues si no  no me lo reconoce
   if(rpt){
      cout<<"La cadena de Caracteres son Identicas:  ";
      cout<<"comparacion "<<cadena1<<" = "<<cadena2<<endl;
   }
   else
      cout<<"La cadena de Caracteres son diferentes:  "<<endl;
   system("pause");
}


Título: Re: Intento comparar cadenas [novato]
Publicado por: barnix456 en 7 Mayo 2012, 20:37 pm
Hola Rodrigosolari, es muy interesante lo que posteaste, he intentando correrlo en mi maquina, pero no puedo, me marca un error, con el #include <iostream> dice que no existe ese archivo o directorio, talvez es por mi compilador uso, geany, pero viendolo y analizandolo bien, si logro diferenciar en donde es que comparar las cadenas, entiendo bien las funciones if y while, gracias, amigo.