【问题标题】:pointer comparision with int type in c++ [duplicate]C++中与int类型的指针比较[重复]
【发布时间】:2021-09-02 23:40:04
【问题描述】:

我执行以下程序为:./aout w

#include<iostream>
using namespace std;

int main(int argc, char** argv)
{
    if (argv[1] == "w")
    {
        cout << "this was worked";
    }
    else
    {
        cout << "this did not worked";
    }
}

输出:this did not worked.
我尝试执行:if(&amp;argv[1] == "w") if(argv[1]=='w')

【问题讨论】:

  • argv[1] 是一个指针。 "w" 是一个衰减为指针的数组。两个指针永远都不会相等。对于 C 风格的以空字符结尾的字符串,您需要使用 std::strcmp。或者将其中一个字符串转换为std::string
  • 使用strncmp 进行char[]char* 比较。
  • 我通常将参数(省略第一个,因为它不是真正的参数)转换为字符串对象的向量,作为 main 中的第一件事。 auto args = vector&lt;string&gt;(argv+1, argv+argc); 在 C++ 中使用 args 更容易。
  • 为什么你认为你在比较一个指针和一个 int?你认为哪个表达式是 int 类型?
  • @Eljay 我建议使用一系列字符串视图来跳过不必要的动态分配。

标签: c++ argv


【解决方案1】:

线

if (argv[1] == "w")

等价于

char const* p1 = argv[1];
char const* p2 = "w";
if ( p1 == p2 )

即您正在比较两个指针,而不是指针指向的字符串。

您可以使用std::strcmp。不过,既然你用的是C++,不如用std::string

if (std::string(argv[1]) == "w")

如果你会使用 C++17,你也可以使用std::string_view

if (std::string_view(argv[1]) == "w")

【讨论】:

  • strcmp 不起作用它与 argv[1]=="w" 工作相同
  • 感谢`如果 (std::string(argv[1]) == "w")` 有效,std::string() 函数是否将 char** 更改为 char*
  • if (std::strcmp(argv[1], "w") == 0) 应该可以工作。
  • std::string(argv[1]) 构造一个std::string 对象。它不会将 char** 更改为 char*。这个问题让我觉得你应该花一些时间从good textbook 学习语言和标准库的基础知识。
【解决方案2】:

如果您使用相等运算符比较数组和指针,那么您就是在比较它们是同一个数组还是指向同一个对象。您不是在比较数组或指向元素的内容。由于argv[1] 指向与字符串字面量不同的数组,因此无论其内容如何,​​它们都比较不相等。

尝试执行:if(&amp;argv[1] == "w")

现在,您将char**const char* 进行比较(阵列衰减后)。比较不相关类型的指针没有多大意义。

if(argv[1]=='w').

现在,您将char*char 进行比较。比较指向 char 的指针没有多大意义。


要比较两个字符串的内容,一个好的解决方案是使用字符串视图作为其中一个或两个操作数。这是一个小变化:

 using namespace std::literals;
 if (argv[1] == "w"sv)

【讨论】:

  • 别忘了你需要包含 string_view 和 using namespace std::literals 才能工作
  • @GuillaumeRacicot 嗯,当我测试时,示例中的using namespace std; 就足够了。奇怪的; ADL 也不应该在这里应用。
  • 哦,我没有注意到 OP 代码中的 usign namespace std;。我的道歉
  • 当我这样做时cout&lt;&lt;argv[1]&lt;&lt;endl; 给了我w
  • @Chintusharma 这是意料之中的。
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多