2016-05-25 2 views
2

Я пытаюсь создать собственный класс строк. Застрял на проблему, где мне нужно сравнить с помощью структуры с постоянной строкойСравните struct с константой в C

Пример

typedef struct{ 
     char *val; 
    } STRING; 

    int func (STRING* compare){ 
     if (compare == "a string"){ 
     return 1; 
     return 0; 
    } 
+0

'strcmp (compare-> val," a string ") == 0' – BLUEPIXY

+1

@Barmar' overload' + 'C' не вычисляет. – chux

ответ

3

Вам нужно использовать strcmp. Чтобы сохранить с возвратом 1, если равен:

int func (STRING* compare){ 
    if (strcmp(compare, "a string") == 0) 
    return 1; 
    return 0; 
} 
1
typedef struct{ 
    char *val; 
} STRING; 

int cmp(const STRING *a) 
{ 
    return strcmp(a->val, "a string"); 
} 

Вам нужно strcmp для сравнения строк. == сравнивает адреса.

+1

На самом деле это противоположность тому, что хотел OP, поскольку 'strcmp' возвращает 0, если две строки равны. – Jack

+0

@ Сообщение Jack OP неоднозначно в этот момент, но вы, скорее всего, правы. – chux

2

При работе с struct в C, так как вы не объектно-ориентированные функции, это хорошо, чтобы инкапсулировать поведение или операции на таких struct внутри методов.

С вашего STRING типа содержит указатель, который я думаю должен принадлежать, например, то вы могли бы предоставить 3 методы для управления распределения, decallocation и сравнение STRING объектов, например:

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

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; 
} 

Таким образом, вы можете инкапсулировать поведение сравнения внутри метода и изменить его, если вам нужно изменить структуру struct (например, добавление полей, удаление полей), не касаясь чего-либо еще кода.

Смежные вопросы