3

在输入选项/参数时,您将如何使用使用 argv[] 的 if/then 语句?

例如,a.out -d 1 sample.txta.out -e 1 sample.txt

int main (int argc, char *argv[])
{
  ifstream infile(argv[3]);

  int c;
  int number = 0;
  int count = 0;

  while ( infile.good() ) {

            if (argv[1] == "-d")
            {

                 c = infile.get();

                 number = atoi(argv[2]);  

                  if (number == count)
                 {
                 cout.put(c);
                 count = 0;
                 }

                      else
                        count++;

            }       


           if (argv[1] == "-e")
           { 
              cout << "entered -e" << endl;   //testing code
           }


  }//end while

}//end main
4

5 回答 5

3

您不能使用相等运算符来比较 C 风格的字符串,您必须使用std::strcmp

if (std::strcmp(argv[1], "-d") == 0)

其背后的原因是==运算符比较指针而不是它们指向的内容。

于 2012-11-28T07:29:32.003 回答
1

我希望您要检查输入参数-d-e,对吗?如果是这种情况,请使用 strcmp()

if (!strcmp(argv[1],"-d")) {

            count++;
            printf("\ncount=%d",count);

        }       

       if (!strcmp(argv[1],"-e"))
       { 
          printf("entered -e");   //testing code
       }
于 2012-11-28T07:43:25.500 回答
1

第一个错误在第一行main

ifstream infile(argv[3]);

你不能这样写,因为没有第三个论点。当你像这样调用你的程序时:

a.out -d 1 < sample.txt

那么程序看到的命令行如下所示:

argv[0] = "a.out"
argv[1] = "-d"
argv[2] = "1"

相比之下,< sample.txtshell 直接解释 ,并且文件被流式传输到程序的标准输入 - 在程序内部,您无法更改它。

至于解析本身,不要读取文件的循环中执行,在之前执行并设置适当的标志。

对于实际的解析,我建议使用库来减轻您的痛苦。标准的 Unix 工具是getopt,但它只有一个 C 接口。有几个 C++ 库,其中Boost.Program_Options对我来说有点太复杂了。

于 2012-11-28T07:54:12.660 回答
1

argc/argv 来自 C 语言,使用起来相当麻烦,因此当完成基本参数传递之外,您可以将参数转换为字符串向量并以 C++ 风格工作:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

main(int argc, char* argv[])
{
  std::vector<std::string> args;
  std::transform(argv+1, argv+argc, std::back_inserter(args), [](char* arg){ return std::string(arg); });

  if (args.at(1) == "-d") { std::cout << "Arg 1 = -d" << "\n"; }

  for (auto& arg: args) { std::cout << "arg: " << arg << "\n"; }
}

不过,您需要检查参数是否存在。如果这是一个基本工具,并且当参数不存在时工具中止是可以接受的,那么您可以使用args.at(x)而不是访问 args 元素args[x]

或者检查这个 SO question以获得参数解析器。

于 2012-11-28T09:10:03.027 回答
0

char argv[] 是一个 char * 数组 所以

 if (string(argv[1]) == "-d")
于 2012-11-28T07:30:28.320 回答