将struct与C

时间:2016-05-25 23:56:39

标签: c

我正在尝试创建自定义字符串类。坚持我需要通过struct比较常量字符串

的问题

实施例

    typedef struct{
      char *val;
    } STRING;

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

3 个答案:

答案 0 :(得分:4)

您需要使用strcmp。如果相等则保持返回1:

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

答案 1 :(得分:2)

在C中处理struct时,由于您没有面向对象的功能,因此将这些行为或操作封装在此类struct内部方法中是件好事。

由于您的STRING类型包含我认为应该由实例拥有的指针,因此您可以提供3种方法来管理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的结构(例如添加字段,删除字段)而不触及代码中的任何其他内容,则可以更改它。

答案 2 :(得分:1)

typedef struct{
    char *val;
} STRING;

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

您需要strcmp进行字符串比较。 ==比较地址。