如何举一个例子来反驳使用 `==` 来比较 `const char*`

Posted

技术标签:

【中文标题】如何举一个例子来反驳使用 `==` 来比较 `const char*`【英文标题】:how to give an example to disprove the usage of `==` for comparing `const char*` 【发布时间】:2016-03-03 22:43:39 【问题描述】:

基于: What is the proper function for comparing two C-style strings?

我知道 OP 是正确的。但是,我使用 g++ 4.1.2 尝试了以下操作。

#include <iostream>    
using namespace std;

int main()

        const char* str1 = "hello worldA";

        if (str1 == "hello worldr")
                std::cout << "hello world" << std::endl;
        else if ( str1 == "hello worldA" )
                std::cout << "hello worldA " << std::endl;
        else
                std::cout << "not " << std::endl;

        return 0;

#include <iostream>

using namespace std;

int main()

        const char* str1 = "hello worldA";
        const char* str2 = "hello worldA";

        if (str1 == str2)
                std::cout << "hello world" << std::endl;
        else
                std::cout << "not " << std::endl;

        return 0;


输出显示正确的比较结果。

问题>如何设计程序以显示== 不适用于const char*

谢谢

【问题讨论】:

***.com/questions/14911085/… "我如何设计一个程序以显示 == 不适用于 const char" -- 很简单。如果你知道 const char * 不应该被比较,你就不要写代码来做这件事。 【参考方案1】:
#include <iostream>
#include <string.h>

using namespace std;

int main()

    const char* str1 = "hello worldA";
    char strbuf[] = "hello worldA";

    const char* str2 = strbuf;

    if (str1 == str2)
            std::cout << "hello world" << std::endl;
    else
            std::cout << "not " << std::endl;

    if (strcmp(str1, str2) == 0)
            std::cout << "same contents" << std::endl;
    return 0;


输出是:

不是 相同的内容

由于一个指向一个常量而另一个不是,所以指针不可能相等。如果是,*strbuf='Q'; 会改变*str1 的值,显然这是错误的。

这可能是一种更好的展示方式:

#include <iostream>
#include <string.h>

using namespace std;

void compare(const char *str1, const char *str2)

    if (str1 == str2)
        std::cout << "== says equal" << std::endl;
    else
        std::cout << "== says uneqal" << std::endl;

    if (strcmp(str2, str1) == 0)
        std::cout << "strcmp says equal" << std::endl;
    else
        std::cout << "strcmp says unequal" << std::endl;


int main()

    const char* str1 = "hello worldA";
    char strbuf[] = "hello worldA";

    compare (str1, strbuf);

    return 0;

输出必须是:

== 说不平等 strcmp 表示相等

【讨论】:

您应该显式创建一个const char* 以指向str2,以便比较两个const char*s 而不是const char*char* 谢谢,现在已经改进了。【参考方案2】:

替代方案:

const char* str = "Hello\0Hello";
const char str2 = str+6;
std::cout << str << " =? " << str2 
          << std::boolalpha << " : " << (str == str2);

通过将两个相同的字符串彼此相邻,我们知道它们的地址是不相等的。

【讨论】:

以上是关于如何举一个例子来反驳使用 `==` 来比较 `const char*`的主要内容,如果未能解决你的问题,请参考以下文章

“举一个我亲身经历的例子”用英语怎么说?

举一个好例子说明java中啥情况下用过滤器,啥时候用拦截器,啥时候用侦听(没分了,但想知道真相)

GitHub - 不常用的功能

请大家举个例子:SPC、MSA、FMEA、QFD是啥意思?

为啥我不能在组件道具中使用内联函数?可以举个例子详细解释一下吗?失去所有状态是啥意思?

java中啥是堆和栈,如何应用,最好举个例子,并详细地说明一下,谢谢了