Funcion Busca Cadenas C

Shalauras

Buenas, de nuevo m surge otra duda de esas que m tiro 2h y no consigo sacarlo, esta vez se trata de que le metes una cadena, y luego le metes otra, y las compara, si son iguales manda un mensaje, sino lo son pues manda otro mensaje.
Yo he hecho esto, pero siempre me dice que son iguales:
....

   (strtok(cad,cad2));

    if ((*cad == *cad2))
    {
        printf ("son iguales");
    }
    else
    {
        printf("no son iguales");
    }

....

PD: El ejercicio quedaria mejor cn punteros, por eso los use y no use arrays.

Gracias.

LOc0

http://www.conclase.net/c/librerias/funcion.php?fun=strcmp

Salu2 ;)

Shalauras

Loco gracias por tu aportacion, pero no es eso exactamente lo que pretendo buscar.

LOc0

Pues macho, como no te expliques mejor...

Salu2 ;)

smintcs

lo que te han puesto es como deberia hacerse, de todas maneras con punteros lo haras igual que con arrays

siempre puedes ir comparando letra a letra, pero supongo que eso es lo que hara la funcion que viene en strings

Shalauras

Al final junte punteros y arrays, me quedo tal que asi(x si a alguno le interesa)

int buscacadena(char *cad1, char *cad2)
{
int resultado,i=0,j=0,igual=0,cad22;

cad22=strlen(cad2);

while (cad1 != '\0')
{
if (cad1==cad2[j])
{
j++;
i++;
igual++;
}
if (cad1!=cad2[j])
{
j=0;
i++;
}
if (igual==cad22)
{
resultado = 1;
}
else
{
resultado = 0;
}
}
return resultado;


En la funcion principal pido las 2 cadenas, y si es 1, digo q se encuentra y si es 0 pues que no se encuentra.
Gracias a los q ayudaron.

SeRiaL_k

q manera d marear la perdiz :P, con strcmp se ace mas rapido

Shalauras

La verdad es que si #7 pero dijo que mejor no usar strcpy y strcmp xa ir variando el estilo... ¿podrias ponerlo aunque sea xa verlo? gracias!

dr_Rouman

#8

#include <stdio.h>
#include <string.h>

main()
{
char cadena1[30], cadena2[30];

printf("Introduce la primera cadena: ");
gets(cadena1);
printf("Introduce la segunda cadena: ");
gets(cadena2);

if((strcmp(cadena1, cadena2)))
	{
	printf("Las cadenas son distintas");
	}
else
	{
	printf("Las cadenas son iguales");
	}

return 0;
}

uso gets en vez de scanf porque gets pilla los espacios y scanf no ^^
strcmp devuelve 0 si son iguales, y un número positivo o negativo dependiendo de la precedencia lexicográfica. No me acuerdo exactmente como, pero se puede mirar en http://www.cppreference.com/

Un saludo!

shortyStyle

Vaya, conoces los punteros y no conocías las famosas strlen ni la strcmp? van de lujo :D, con eso y con una función encriptadora ya puedes hacer una protección con password, es muy útil.

Peyru

STRCMP(cadena1,cadena2) ¿¿¿¿¿¿¿¿????????

donde esta la complicacion

Shalauras

A ver, si conozco strcmp y el string copy y todo eso, pero es que lo queria hacer a mano, es decir sin copiar esas funciones. Por cierto #9 en tu caso si pones cadena1= pepejuan y cadena2= juan, dice que son distintos, y lo k pretendo es q busque en toda la cadena1 es decir, en el caso anterior deberia darlo cmo correcto, ya que "juan" pertenece a la cadena1.

Ahora tengo un nuevo problema.Si lo hago cmo puse arriba, poniendo cadena1=borjaalvaro cadena2=alvaro, dice que no se encuentra, xq hay 2 A consecutivas y no lo reconoce y salta, tras hacer unos cambios lo deje asi:

int buscacadena(char *cad1, char *cad2)
{
int resultado,i=0,j=0,igual=0,cad22;

cad22=strlen(cad2);

while ((cad1 != '\0') || (igual == cad22))
{
if (cad1==cad2[j])
{
j++;
i++;
igual++;
}
if ((cad1!=cad2[j]) && (igual == 0))
{
j=0;
i++;

    }
    if ((cad1[i]!=cad2[j]) && (igual > 0))
    {
            j=0;
            if (igual < cad22)
            {
            igual=0;
            }
            

    }
    if (igual==cad22)
    {
            resultado = 1;
    }
    else
    {
            resultado = 0;
    }

}
return resultado;

Pero ni aun asi me va.... A ver si alguien encuentra el fallo el xq no m lo reconoce... (tras hacer esos cambios, ya siempre me dice que no, a ver si alguno sabe la solucion.)
Gracias y un saludo a todos :)

JuAn4k4

int iguales( a,b)
char a;
char b;
{
if (a == b)
return 1;

return 0;
}

void strcmpBIS (cad1,cad2)
char *cad1, *cad2;
{ int loson=1; char s1,s2;

s1=cad1;
s2=cad2;

if ( strlen(s1) == strlen(s2) )
{
while (!( s1 == '\0' ) || loson)
{loson = iguales(
s1,*s2); s1++; s2++; }


}

}
if ( loson) {
printf(" Las cadenas son Iguales \n");
}
else
printf(" Las cadenas son distintas \n");
}

BlisZ

aprovechando este post, mi profesor dice que es mejor declarar una funcion antes de main y escribirla despues de este y si no lo hago quita puntos

hay alguna razon para escribir la funcion despues? yo no le veo sentido, si quiero cambiar algo lo tengo q cambiar en dos sitios y es un COÑAZO

smintcs

se referira a que pongas el prototipo, y en algunos compiladores es necesario porque si dentro del programa llamas a una funcion que no sabe cual es, lo normal es que pite

lo que tienes que hacer es poner arriba los prototipos estilo

int funcion (void);

y luego ya donde quieras pones la funcion entera

no es obligatorio pero algunos compiladores no lo compilaran si no lo haces

URI_

Más que nada es que un compilador compila linea a linea, de arriba a abajo, es por eso que si desde arriba de tu codigo llamas a una función que está mas abajo (por lo tanto no leida/compilada), no la encuentra y peta. Es por eso que en C el main acostumbra a ir al final, a no ser que pongas los prototipos arriba como han dicho arriba.

PD. Con un simple strcmp de dos cadenas tb te iria y te ahorrarias todas estas lineas de codigo :)

OhmaK

#14

Si pones el prototipo, da igual el orden en el que declares las funciones. Si no, si que importa. Ej:

int fun1() {
fun2();

};
int fun2() {

}
main {}

--> error;

int fun1();
int fun2();
main {};
int fun1(){
fun2();
}
int fun2(){}
-->compila

#1
salir=0;
for(i=0;i<strlen(A) && i<strlen(B) && !salir;i++) {
if(A!=B[j] || strlen(A) != strlen(B)) {salir++;}else{j++}
}
if(salir)
printf("IGUALES");
else
printf("DIFERENTES");

Igual q las soluciones antes dichas
Salu2

Shalauras

Mañana probare las solciones estas y os comentare que tal fueron, gracias por vuestra ayuda :) hoy intente ponerlo de nuevo con otra variante que me dijeron y nada, solo ocurre al poner dos cadenas, donde existen 2 letra iguales.
ej:
cadena1: borjaalvaro
cadena2: alvaro

Esa cadena me dice que no la encuentra a pesar de que alvaro este en cadena1, ya que al leer la primera A, igual++, y al leer la siguiente y no sr la L dice que no la encuentra, igual=0; y fial dl programa, deberia avanzar. Seguiremos trabajando :))

Gracias :)

LOc0

Cada vez que encuentres la primera letra de la cadena más pequeña en la cadena grande, entra en un bucle while que busque el resto de letras de la cadena pequeña. En cuanto falle en una, sales de ese bucle y continuas en el bucle principal.

En tu caso al llegar a la primera 'a' de borj[a]alvaro, te pondrías a buscar la 'l', la 'v', etc... borjalvaro (¡paras!)

Como la siguiente es una 'a', te sales del "mini-bucle", pasas a la siguiente letra en el bucle principal borja[a]lvaro y repites lo anterior. borjaavaro (sigues), borjaa(v)aro (sigues), etc...

Salu2 ;)

Shalauras

Loco es buena idea esa, voy a ver si la consigo implementar, es que no me queda del todo claro como implementar ese bucle dentro d la sentencia y que entre ahi al ver q son distintas, no se si me entiendes :P
gracias por la aportacion, ste programa ya pasa a ser algo personal...

Shalauras

Loco t voy a poner los bucles ke tengo puesto a ver si lo ves bien y dnd pondria ese minibucle, aun no vi dnd ponerlo(que me cuesta..)

cad22=strlen(cad2);
if (*cad1 <= *cad2)
{
    resultado = 0;
}

while (cad1 != '\0')
{
if (cad1==cad2[j])
{
j++;
i++;
igual++;
}
if (cad1!=cad2[j])
{
j=0;
//i=i-j+1;
i=i+1;
igual=0;
}
if (igual==cad22)
{
resultado = 1;
}
else
{
resultado = 0;
}
}
return resultado;

Shalauras

Bueno creo que ya lo acabe y con exito, al final basandome en lo que me dijo loco de crear un minibucle dentro d uno lo consegui, os dejo el codigo x si alguno staba intrigao(q seguro k no ... :P)
int buscacadena(char *cad1, char *cad2)
{
int resultado,i=0,j=0,igual=0,cad22;

cad22=strlen(cad2);

while ((cad1 != '\0') || (igual == cad22))
{
if (cad1==cad2[j])
{
j++;
i++;
igual++;
}
if (igual==cad22)
{
return 1;
}
else
{
resultado = 0;
}
if (cad1!=cad2[j])
{
i++;
igual=0;
j=0;
if (cad1[i-1] == cad2[j])
{
igual++;
i=i-1;
j=0;
}

    }

}
return resultado;

Usuarios habituales

  • Shalauras
  • LOc0
  • OhmaK
  • URI_
  • smintcs
  • JuAn4k4
  • shortyStyle