Estoy tratando de hacer una clase de cadena personalizada. Atrapado en un problema donde necesito comparar por estructura a una cadena constante
Ejemplo
typedef struct{ char *val; } STRING; int func (STRING* compare){ if ( compare == "a string" ){ return 1; return 0; }
Necesitas usar strcmp. Para seguir con la devolución de 1 si es igual:
int func (STRING* compare){ if ( strcmp(compare, "a string" ) == 0) return 1; return 0; }
Cuando se trata de struct
en C, ya que no tiene características orientadas a objetos, es bueno encapsular el comportamiento o las operaciones en dichos struct
dentro de los métodos.
Dado que su tipo de STRING
contiene un puntero que creo que debería ser propiedad de la instancia, entonces podría proporcionar 3 métodos para administrar la asignación, la desclasificación y la comparación de objetos de STRING
, por ejemplo:
#include #include #include #include typedef struct { char* val; } STRING; STRING string_alloc(const char* val) { STRING string; string.val = malloc(strlen(val)+1); strcpy(string.val, val); return string; } void string_free(STRING* string) { free(string->val); } bool string_compare(const STRING* str1, const STRING* str2) { return strcmp(str1->val, str2->val) == 0; } int main(void) { STRING string = string_alloc("foo"); STRING string2 = string_alloc("foo"); printf("Are equal: %s\n", string_compare(&string, &string2) ? "true" : "false"); string_free(&string); string_free(&string2); return 0; }
De esta manera, puede encapsular el comportamiento de comparación dentro de un método y modificarlo si necesita alterar la estructura de la struct
(por ejemplo, agregar campos, eliminar campos) sin tocar nada más del código.
typedef struct{ char *val; } STRING; int cmp(const STRING *a) { return strcmp(a->val, "a string"); }
Necesitas strcmp
para la comparación de cadenas. == compara direcciones.