【问题标题】:how to give an example to disprove the usage of `==` for comparing `const char*`如何举一个例子来反驳使用 `==` 来比较 `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*

谢谢

【问题讨论】:

  • "我如何设计一个程序以显示 == 不适用于 const char" -- 很简单。如果你知道 const char * 不应该被比较,你就不要写代码来做这件事。

标签: c++


【解决方案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);

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

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多