2016-05-25 7 views
2

私はカスタム文字列クラスを作成しようとしています。私は文字列定数構造体をCで定数と比較

typedef struct{ 
     char *val; 
    } STRING; 

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

'strcmp(比較 - > val、"文字列 ")== 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

2つの文字列が等しい場合、 'strcmp'は0を返すので、実際にはこれはOPが望むものとは逆です。 – Jack

+0

@Jack OPのポストはその時点であいまいですが、正しいと思われます。 – chux

2

あなたがオブジェクト指向の機能を持っていないので、Cにstructを扱う、それは、そのようなstruct内側の方法での動作や操作をカプセル化するために良いことです。

あなたSTRINGタイプは、私は、あなたが例えば、割り当て、decallocationとSTRINGオブジェクトの比較を管理するための3つの方法を提供することができインスタンスによって所有されなければならないと思いポインタが含まれているためこのように

#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の構造を変更する必要がある場合(たとえば、フィールドの追加、フィールドの削除など)、そのメソッドを変更することができます。