Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Ataulfo7 en 8 Abril 2015, 17:55 pm



Título: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Ataulfo7 en 8 Abril 2015, 17:55 pm
Hola buenas, soy nuevo en el foro, ya que he indagando por internet en busca de soluciones a un problema de programación en C e visto muchas veces este foro, pero no encontré la solución...
Me piden que compare dos cadenas sin usar <string.h>, y que si son iguales de un 0, si la primera cadena es mayor que la segunda de un 1, y viceversa de un -1, pero lo único que me dan para hacerlo es esto:

Código
  1. int Compara (char s1[], char s2[]){
  2. int i;
  3. for(i=0;(s1 [i]==s2[i]) &&(s1 [i] != '/0') && (s2[i] != '/0') ; i++);
  4. return (s1[i]-s2[i]);
  5. }
  6.  
Seria necesario el uso de apuntadores?? Es que estoy intentando de todo, pero no me saleee :S, si alguien me puede ayudar... Gracias de antemano! ^^


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: ivancea96 en 8 Abril 2015, 18:30 pm
¿Cómo que te dan eso para hacerlo? Esa función es casi igual a lo que describes que hay que hacer. ¿Qué más necesitas?


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Ataulfo7 en 8 Abril 2015, 18:39 pm
A la hora de crear el main, y ponerme a crear las cadenas de caracteres para poder compararlas, me quedo pillado y no se como seguir. Es decir para que las dos cadenas de caracteres que creé, se comparen con ese código y salga el resultado...   :-\


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: ivancea96 en 8 Abril 2015, 18:44 pm
Código
  1. #include <stdio.h>
  2.  
  3. int Compara (char s1[], char s2[]){
  4.    int i;
  5.    for(i=0;(s1 [i]==s2[i]) &&(s1 [i] != '\0') && (s2[i] != '\0') ; i++);
  6.    return (s1[i]-s2[i]);
  7. }
  8.  
  9. int main(){
  10.    char a[] = "Cadena 1",
  11.         b[] = "Cadena 2";
  12.    printf("%d", Compara(a,b));
  13. }
  14.  


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Ataulfo7 en 8 Abril 2015, 18:55 pm
El main era muy similar al que yo hacia, solo que no estaba bien jaja, Muchas gracias por tu ayuda!


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: ivancea96 en 8 Abril 2015, 19:00 pm
si son iguales de un 0, si la primera cadena es mayor que la segunda de un 1, y viceversa de un -1

Cabe decir que esa función no returna "1 y -1", sino que retorna la diferencia entre los primeros caracteres diferentes encontrados.


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Ataulfo7 en 8 Abril 2015, 19:35 pm
Ya vi que lo que hace es restar la diferencia de números, pero no importa ya que eso ahora vere como arreglarlo, lo único en lo que no caia era en hacer para que me leyera las dos cadenas.  :silbar:
Gracias!


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Miseryk en 8 Abril 2015, 21:39 pm
Te dejan usar strcmp o strcmpi?


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: ivancea96 en 8 Abril 2015, 21:41 pm
Te dejan usar strcmp o strcmpi?

Me piden que compare dos cadenas sin usar <string.h>


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: rir3760 en 9 Abril 2015, 04:10 am
Me piden que compare dos cadenas sin usar <string.h>, y que si son iguales de un 0, si la primera cadena es mayor que la segunda de un 1, y viceversa de un -1
Dos comentarios:

* En la condición del bucle si los caracteres son iguales no es necesario verificar que ambos sean diferentes de '\0', basta con comparar solo uno (el que sea).

* Para retornar 1, 0 o -1 dependiendo si la primera cadena es mayor, igual o menor que la segunda basta con utilizar los operadores relaciones ">" y "<", de esta forma:
Código
  1. return (s1[i] > s2[i]) - (s1[i] < s2[i]);

Un saludo


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Ataulfo7 en 9 Abril 2015, 10:17 am
Ahora sii, jajaja, muchas gracias, es que estoy aprendiendo C y aun soy un poco novato con todo esto, me sirvio de mucho!  ;-) ;-)


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Miseryk en 9 Abril 2015, 17:32 pm


Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. cout << strcmpi("asd", "ASD") << endl;
  8.  
  9. cin.get();
  10.  
  11. return 0;
  12. }
  13.  


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: ivancea96 en 9 Abril 2015, 17:47 pm
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. cout << strcmpi("asd", "ASD") << endl;
  8.  
  9. cin.get();
  10.  
  11. return 0;
  12. }
  13.  

Incluso si strcmpi() fuera una función estándar, no es lo mismo que strcmp(). Y aquí se trata de comparar cadenas asecas.


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Miseryk en 9 Abril 2015, 17:52 pm
Incluso si strcmpi() fuera una función estándar, no es lo mismo que strcmp(). Y aquí se trata de comparar cadenas asecas.

Código
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5. std::cout << strcmp("asd", "ASD") << std::endl;
  6.  
  7. std::cin.get();
  8.  
  9. return 0;
  10. }
  11.  

así?


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: ivancea96 en 9 Abril 2015, 18:02 pm
strcmp() es de la librería string.h. Además, recuerda que es C.


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: ecfisa en 9 Abril 2015, 19:07 pm
Hola.

Otra forma puede ser:
Código
  1. int cmpstr( char s1[], char s2[] ) {
  2.  int i;
  3.  
  4.  for( i=0; s1[i] == s2[i]; i++ )
  5.    if ( s1[i] == '\0' ) return 0;
  6.  return  s1[i] - s2[i] ;
  7. }
  8.  
o también:
Código
  1. int cmpstr( char* a, char* b ) {
  2.  
  3.  for( ; *a == *b; a++, b++ )
  4.    if ( *a == '\0') return 0;
  5.  
  6.  return *a - *b;
  7. }
  8.  

Saludos .


Título: Re: [C] Comparar 2 cadenas sin usar <string.h>
Publicado por: Miseryk en 9 Abril 2015, 19:22 pm
O de esta forma (también la dejo para algún curioso que esté en este tema)

Código
  1. #include <Windows.h>
  2. #include <iostream>
  3.  
  4. typedef int (*Mystrcmp)(const char * _Str1, const char * _Str2);
  5. Mystrcmp M_strcmp;
  6.  
  7. int main()
  8. {
  9. M_strcmp = (Mystrcmp)GetProcAddress(GetModuleHandle("NTDLL.DLL"), "strcmp");
  10.  
  11. std::cout << M_strcmp("ASD", "ASD") << std::endl;
  12.  
  13. std::cin.get();
  14.  
  15. return 0;
  16. }
  17.