【问题标题】:C: Pointer struction comparing doesn't work [duplicate]C:指针结构比较不起作用[重复]
【发布时间】:2020-12-16 22:33:39
【问题描述】:

我应该在不使用 strcmp() 的情况下将一个结构与另一个结构进行比较。但是每次双方的 firstName 相同时,它都不会进入 if 函数。我知道该函数在 printf 中获取名称 bc 我清楚地看到了名称。

typedef struct{
    char firstName[MAXC];
    char familyName[MAXC];
    char gender;
} TPerson;
....

int comparePeopleByFirstName(TPerson *a, TPerson *b){
    if(a->firstName == b->firstName){
        if(a->familyName < b->familyName){
            return 1;
        } else if (a->familyName > b->familyName){
            return -1;
        }
     }else if(a->firstName < b->firstName){
        return 1;
    } else if (a->firstName > b->firstName){
        return -1;
    }
    return 0;
}

【问题讨论】:

  • 如果不能使用strcmp,则需要比较字符串中的每个字符。 char * 上的 == 正在比较指针/地址而不是字符串字符。

标签: c struct compare


【解决方案1】:

在您的示例代码中,结构包含 arrays 作为成员,而不是指针。因此,绝不可能是(a != b) &amp;&amp; (a-&gt;firstName == b-&gt;firstname)a-&gt;firstNameb-&gt;firstname内容 是否匹配并不重要,因为您正在比较它们的第一个元素的 地址

您可以想象使用memcmp() 而不是strcmp() 来执行比较,前提是您不介意在任何字符串终止符之后比较数据。但也许那是作弊。

如果您不能使用任何库函数,那么您需要将charchar 与循环进行比较。例如,

_Bool equal = 0;

for (int i = 0; ; ++i) {
    if (a->firstName[i] != b->firstName[i]) {
       // unequal
       break;
    }

    if (a->firstName[i] == '\0') {
        // b->firstName[i] == '\0' too, else control would not reach this point
        equal = 1;
        break;
    }
}

假设正确终止的字符串。如果这不是一个安全的假设,那么您可以在循环的终止条件中添加对 i 的限制。

【讨论】:

  • Re“……前提是您也不介意比较任何字符串终止符之后的数据”:那行不通。如果字符串不同,它将正确返回“不相等”。但是,如果字符串相等且未填充整个数组,则如果空终止符后面的任何字节不同,它将返回“不相等”,这是不希望的。
  • @EricPostpischil,不清楚 OP 想要什么,上下文也不清楚。例如,如果它们可以依赖于在字符串末尾填充零的数组,或者如果数组内容首先不打算作为字符串进行比较,那么memcmp() 将是可行的。这就是我提出附带条件的原因。 OP 必须评估它们的用法是否与此一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2021-04-02
  • 1970-01-01
  • 2014-01-04
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多