【问题标题】:C++ comparing c string troublesC++比较c字符串的麻烦
【发布时间】:2010-01-04 06:14:28
【问题描述】:

我已经编写了以下代码,它不会工作,但是当我更改它时,第二个 sn-p 会。

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
}

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

提前致谢。

【问题讨论】:

  • 使用strcmp有什么问题吗?我只是想知道这样做的好处......
  • 您似乎正在尝试读取命令行选项。如果您使用的是 linux 机器,请查看 getopt() 函数 linux.die.net/man/3/getopt

标签: c++ string c-strings


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这个在 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()

      【讨论】:

        猜你喜欢
        • 2012-11-05
        • 2014-12-03
        • 2021-11-19
        • 2016-02-08
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        相关资源
        最近更新 更多