2

我已经编写了以下代码,它不起作用,但是当我更改它时,第二个片段会起作用。

int main( int argc, char *argv[] )
{
  if( argv[ 1 ] == "-i" )   //This is what does not work
     //Do Something
}

但是,如果我这样编写代码,这将起作用。

int main( int argc, char *argv[] )
{
  string opti = "-i";

  if( argv[ 1 ] == opti )   //This is what does work
     //Do Something
}

是因为字符串类有 == 作为重载成员,因此可以执行此操作吗?

提前致谢。

4

3 回答 3

11

是因为字符串类有 == 作为重载成员,因此可以执行此操作吗?

你是对的。类型的常规值char *没有重载运算符。要比较 C 字符串,

if (strcmp(argv[1], "-i") == 0) {
    ...
}

==通过以您所做的方式(直接)比较字符串,您正在比较指针的。由于"-i"是编译时间常数并且argv[1]是其他东西,它们永远不会相等。

于 2010-01-04T06:18:07.193 回答
9

正确的。当您这样做时argv[1] == "-i"(在两个表达式上使用 == char*),您正在比较指针是否相等,而不是字符串中的字符。您必须使用该strcmp函数来比较字符串数据。

std::string已重载运算符来检查 string==string、char*==string 和 string==char*,但不可能重载 char*==char*,因为它已经具有定义的含义:比较指针。

于 2010-01-04T06:18:30.547 回答
1

这个在 C 中可以正常工作。记得检查 argc,这样你就不会遇到 seg 错误。还有 strncmp() ,这是一种比较字符串的更安全的方法,因为您限制了字符串的最大长度。

#include <string.h>
#include <stdio.h>

int main( int argc, char *argv[] )
{
  if((argc > 1) && (strcmp(argv[1], "-i") == 0))
  {
      printf("got -i\n");
  }
}

如果您将多个参数作为命令选项传递,请查看getopt()

于 2010-01-04T09:29:21.910 回答