Comparar valores String o Char [C++]

Iniciado por zikotik, 15 Noviembre 2014, 06:35 AM

0 Miembros y 2 Visitantes están viendo este tema.

zikotik

Hace unos días estaba haciendo una apliación en la que necesitaba en cierta parte del proceso, comparar una variable tipo string con una variable tipo char tanto en tamaño como en valor, pero no debía usar sentencias for ni while. Así y entonces, desarrollé esta pequeña función que quizá le pueda ser útil a aquellos que recién empiezan.

Código (cpp) [Seleccionar]
#include <cstring>

bool strchk(string a, string b){
if(a.size() == b.size() && a == b){
return 1;
} return 0;
}


La forma de uso sería la siguiente...

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
using namespace std;

bool strchk(string a, string b){
if(a.size() == b.size() && a == b){
return 1;
} return 0;
}

int main(int argc, char *argv[]){
if(strchk(argv[1], argv[2]) == 1){
cout << "Son iguales";
} else {
cout << "Son desiguales";
}
}


En una consola de comandos se ejecutaría de la siguiente manera...

Código (dos) [Seleccionar]
app.exe texto texto
Son iguales

app.exe texto palabra
Son desiguales


Si modificamos un poco el main, podemos usarlo para crear un sistema de inicio de sesión (por ejemplo).

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
using namespace std;

bool strchk(string a, string b){
if(a.size() == b.size() && a == b){
return 1;
} return 0;
}

int main(int argc, char *argv[]){
char pwd[9] = "1a2b3c4d";
if(strchk(argv[1], pwd) == 1){
cout << "La clave es correcta";
} else {
cout << "La clave es incorrecta";
}
}

rir3760

En tu programa cuando se llama a la función "strchk" sus argumentos (las cadenas "a la C") se utilizan para inicializar los parámetros correspondientes (objetos de la clase string). Eso lleva a que la función no es necesaria ya que se pueden crear objetos anónimos de dicho tipo realizando la comparación directamente.

Un ejemplo para explicarlo mejor:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

int main(int argc, char *argv[])
{
   if (string(argv[1]) == string(argv[2]))
      cout << "Son iguales" << endl;
   else
      cout << "Son desiguales" << endl;
   
   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

zikotik

El problema es que cuando quise hacerlo de manera directa, el compilador me tiraba error y no me dejaba compilarlo, entonces tuve que hacer de manera obligada, la función "strchk" (utilizo devcpp).

rir3760

¿A que te refieres con "cuando quise hacerlo de manera directa, el compilador me tiraba error"?

Por cierto no es necesario incluir el encabezado <cstring>, en su lugar debes incluir <string> para tener acceso a la clase del mismo nombre.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

zikotik

A veces cuando quiero hacer algún código, el compilador me tira error, entonces tengo que buscar una manera alterna de hacer las cosas. Debe ser un error de instalación de las librerías o algo así posiblemente.

zShackra

Cita de: zikotik en 16 Noviembre 2014, 02:58 AM
A veces cuando quiero hacer algún código, el compilador me tira error, entonces tengo que buscar una manera alterna de hacer las cosas. Debe ser un error de instalación de las librerías o algo así posiblemente.

Hola, ¿le has dado una oportunidad a Qt Creator, Visual Studio o Code::Blocks?...

zikotik

Probé el Visual Studio y me resultó incómodo, el Qt Creator no lo tenía conocido y acerca del Code::Blocks, oí muchas notas positivas al respecto, pero nunca lo probé.

zShackra

#7
Cita de: zikotik en 16 Noviembre 2014, 04:29 AM
Probé el Visual Studio y me resultó incómodo, el Qt Creator no lo tenía conocido y acerca del Code::Blocks, oí muchas notas positivas al respecto, pero nunca lo probé.

Pues bueno, el Visual Studio por incómodo que sea, tiene el mejor depurador que he probado en sistemas NT, además de ser un entorno muy pero muy completo...

Code::Blocks es muy ligero y viene casi completamente configurado, aunque usa MinGW como compilador (al igual que QtCreator y DevC++), honestamente no les veo nada malo a los tres IDE, Visual Studio usa el compilador de Microsoft y aún así desenvuelve un trabajo espectacular.

Te sugiero darle una oportunidad al menos a Code::Blocks, creo y sin temor a equivocarme, que esos problemas que tienes con DevC++ desaparecerían con IDE's más trabajados (sin quitarle su mérito a Orwell, pero nada como un proyecto desarrollado por una comunidad y/o empresa).

zikotik

Qué ironía, empezó siendo un aporte, y terminó siendo una solución fomentada.
Borré el DevCpp, instalé el Code::Blocks y no tuve más problemas al compilar.

Gracias por tu solución zShackra!

zShackra

#9
Cita de: zikotik en 16 Noviembre 2014, 12:43 PM
Qué ironía, empezó siendo un aporte, y terminó siendo una solución fomentada.
Borré el DevCpp, instalé el Code::Blocks y no tuve más problemas al compilar.

Gracias por tu solución zShackra!

Me alegra que te haya servido de algo... DevC++ es un IDE bastante deficiente.