使用返回String1 - String2 == 0进行相等性检查是否安全?

0 c c++

我刚刚创建了这个函数,通过减去它们的Integer值来检查两个字符串之间的相等性

int EQ(const char* CString1, const char* CString2)
{
    return CString1 - CString2 == 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否是检查char*字符串的安全方法

它不适用于数组,因为它们有不同的整数,所以我为此创建了其他函数

int EQA(const char* CString1, const char* CString2){
    if(CString1 == NULL || CString2 == NULL)
        return 0;
    int i = strlen(CString1);
    if(i != strlen(CString2))
        return 0;
    while(i>=0){
        if(CString1[i] != CString2[i])
            return 0;
        --i;
    }
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我没有尝试过多地优化我的第二个功能

但是在检查时char*,我为什么要使用EQA()strcmp()结束EQ()

第一个EQ()是非常,比我以前使用的任何其他标准功能
所以,我真的很喜欢使用它

我在其他机器上测试它并且它工作但整数值char* 不同,也
注意到这些整数取决于在代码中首先声明哪个变量,但是如果它们具有相同的字符串使得此函数完美地工作则它是相同的整数,所以它不依赖编译器

为什么不同的整数?,它仍然安全吗?

编辑:一些答案专注于调试我的第二个例子,而不是回答我的问题,所以我编辑了它.

hac*_*cks 8

字典上相等的两个字符串并不意味着它们存储在相同的存储位置.减去他们的地址以进行比较可能会产生一些错误的结果.如果两个指针不指向同一个数组的元素或者一个超过数组的最后一个元素的指针,则指针减法是没有意义的.
我建议使用标准函数strcmp进行词典字符串比较.


Joh*_*136 5

没有.

您可以在内存中的两个不同位置拥有相同字符串的两个副本,但您的方法会说它们不同.

char *s1 = "Hello";
char *s2 = strdup(s1);
printf("%d\n", strcmp(s1, s2)); /* prints 0 */
printf("%d\n", s1-s2); /* does not print 0 */
Run Code Online (Sandbox Code Playgroud)

另外,你的EQA功能非常糟糕:EQA("Hello", "h")要在CString2指针之前访问内存.还要考虑一下如果CString2为NULL?

你确定这个while(i>0 && --i)检查位置0吗?我想它会说"Hello"和"Jello"是一样的......(确认.位置0未检查)


use*_*738 5

6.5.6p9(从C标准 - N1570 )

当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异.结果的大小是实现定义的,其类型(有符号整数类型)是标头中定义的ptrdiff_t.

还有来自标准的: -

...如果表达式PQ指向,分别,元件x[i]x[j]同一阵列对象的x,表达P - Q具有值 i?j; 否则,行为未定义.

鉴于标准的这一部分,这是不对的.(您无法确保它们指向上述相同阵列的相同位置或不同位置)当您的代码不符合上述标准时,您的代码有未定义的行为.

你也无法检查两个字符串的相等性( nul终止char数组)减去它们的地址 - 它如何检查地址中的内容是否相等?它不能.标准没有提供任何东西 - 在这种情况下你可以用它来比较字符串的内容.strcmp