为什么argv不起作用?

时间:2013-06-28 08:30:24

标签: c++ c compare c-strings

我是cpp的初学者,并且遇到以下代码问题。通常它应该根据argv [1]显示文本,但它不显示任何内容。

我做错了什么?

#include <stdio.h>

int main (int argc, char* argv[])
{

  if(argv[1] == "a" && argc > 1)  printf("hello world, argc: %d\n", argc);
  else if(argv[1] == "2" && argc > 1) printf("hello everyone, argc: %d\n", argc);

  for(int i=0; i<argc; i++) printf("%s\n", argv[i]);

  return 0;
}

2 个答案:

答案 0 :(得分:5)

使用strcmp,以下代码应该有效:

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

int main (int argc, char* argv[]) {

  if(argc > 1 && strcmp(argv[1], "a") == 0) {
      printf("hello world, argc: %d\n", argc);
  } else if(argc > 1 && strcmp(argv[1], "2") == 0)  {
      printf("hello everyone, argc: %d\n", argc);
  }

  for(int i=0; i<argc; i++) printf("%s\n", argv[i]);

  return 0;
}

由于问题已标记为C++,因此请使用以下内容更多C++ - 如:

#include <iostream>
#include <string>

int main (int argc, char* argv[]) {

  if(argc > 1) {
      std::string argv1(argv[1]);

      if (argv1 == "a") {
          std::cout << "hello world, argc: " << argc << std::endl;
      } else if (argv1 == "2") {
          std::cout << "hello everyone, argc: " << argc << std::endl;
      }
  }

  for(int i=0; i<argc; i++) {
      std::cout << argv[i] << std::endl;
  }

  return 0;
}

答案 1 :(得分:3)

代码中最重要的2个问题:

  • 你应该在参数检查之前检查参数的数量。
  • 使用标准库函数(如strcmp())比较字符串 如果你知道最大长度,甚至更好strncmp()

这是有效的 C代码。希望这有帮助。

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

int main (int argc, char* argv[])
{
    if ((argc > 1) && ((strcmp(argv[1], "a") == 0)))
    {
        printf("hello world, argc: %d\n", argc);
    }
    else if ((argc > 1) && (strcmp(argv[1], "2") == 0))
    {
        printf("hello everyone, argc: %d\n", argc);
    }

    for (int i = 0; i < argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}

关于字符串比较的一些细节。如果你在这里使用==运算符(如果你还没有重载它),你只需比较对象地址(仔细看,在这两种情况下都有char *)。显然,您的字符串文字和参数缓冲区具有不同的地址。你需要比较内容。实际上在C ++中,您可以构造std::string并使用比较运算符。

另一个基于==运算符的更多C ++解决方案

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

int main (int argc, char* argv[])
{
    if ((argc > 1) && (std::string(argv[1]) == "a"))
    {
        printf("hello world, argc: %d\n", argc);
    }
    else if ((argc > 1) && (std::string(argv[1]) == "2"))
    {
        printf("hello everyone, argc: %d\n", argc);
    }

    for (int i = 0; i < argc; i++)
        printf("%s\n", argv[i]);

    return 0;
}