如何在函数调用和参数中使用命令行参数?

时间:2019-03-13 17:29:05

标签: c

我正在尝试从main函数中读取参数。我的问题是如何获取每个参数以将其放入函数中。我知道我必须使用类似strcmp(argv [currentArg],“ albus”)== 0的方法,但是我对如何执行此方法感到非常困惑,尤其是因为可能存在不同数量的参数。 例如:

./cnp cut 13 5 copy 33 7 paste 1 input-b.txt output.txt

cnp是主文件的名称 剪切复制和粘贴关键字是程序中的功能 数字是函数必须剪切,过去和复制的索引 input-b.txt output.txt是文件。

在这里,我们要求它从第13列开始剪切5个字符。这应该剪切每个名称后的3位数字。然后,我们要求它复制第33至39列中的内容;这是从第33列开始的7个字符,它应该为我们提供每行最后一个浮点数的副本。然后,我们告诉它在行的开头粘贴该代码,并在每行的开头为我们提供这些数字的另一个副本。所以原始的看起来像这样

       Young  003   3  89.81  67.10  80.85  D
       Venus  002   8  72.29  73.59  76.20  A
      Jasmin  003   6  55.19  50.51  63.88  F
     Micheal  001   3  98.93  91.37  99.00  C
       Abram  001   2  50.23  90.14  57.36  E
   Rigoberto  002   8  61.63  94.64  77.05  B
         Noe  003   2  68.41  61.79  64.60  A
     Kristin  002   5  77.34  84.68  65.16  B
     Phillip  001   6  63.19  76.08  52.39  B
     Monique  001   6  81.76  57.62  80.15  A
       Verda  002  10  93.03  56.21  93.58  C
      Louise  003   2  70.30  71.37  61.91  C
       Vilma  001   9  71.09  93.43  76.72  G 

程序运行后,将如下所示:

80.85         Young   3  89.81  67.10  80.85  D
76.20         Venus   8  72.29  73.59  76.20  A
63.88        Jasmin   6  55.19  50.51  63.88  F
99.00       Micheal   3  98.93  91.37  99.00  C
57.36         Abram   2  50.23  90.14  57.36  E
77.05     Rigoberto   8  61.63  94.64  77.05  B
64.60           Noe   2  68.41  61.79  64.60  A
65.16       Kristin   5  77.34  84.68  65.16  B
52.39       Phillip   6  63.19  76.08  52.39  B
80.15       Monique   6  81.76  57.62  80.15  A
93.58         Verda  10  93.03  56.21  93.58  C
61.91        Louise   2  70.30  71.37  61.91  C
76.72         Vilma   9  71.09  93.43  76.72  G
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "buffer.h"
#include "document.h"

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

  char 



   if(argc > 0) {


   }

   else {

}

   return EXIT_SUCCESS;
}

粘贴,剪切,复制功能如下:

bool cut( char *line, int start, int n )
bool copy(char *line, int start, int n) 
bool paste(char *line, int start)

要阅读并打印出来,我们具有以下功能:

int readDocument( FILE *fp, char doc[ MAX_LINES ][ MAX_LENGTH + 1 ] )
void printDocument(FILE *fp, char doc[MAX_LINES][MAX_LENGTH + 1], int lines)

我已经完成了这些功能,但是我需要有关如何使用命令行参数的主要功能方面的帮助。我正在使用Linux机器。

2 个答案:

答案 0 :(得分:1)

在C / C ++中通过参数传递某些值时,例如:

./cnp cut 13 5 copy 33 7 paste 1 input-b.txt output.txt,您需要使用argv[positon_of_your_param],因此您的argv[0]将与./cnp相同,而您的argv[1]将是cut

现在,您可以按照自己的论据使用每个代码,尝试下面在 C 中编写的代码,但与 C ++ 几乎相同。您所有的 argv 返回char,因此,如果要获取整数必须进行转换,则可以使用atoi(),此函数获取char并返回整数{ {3}}。

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

void error(char *c, int n) {
  printf("%s\n", c);
  exit(n);
}

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

  char *firstAction, *secondAction, *thirdAction;
  char *file1, *file2;
  int howManyCharacters=0, startAt=0;
  int columnStart=0, columnEnd=0;
  int nAfterPaste = 0;

  if (argc < 10) {
    error("You must specify 10 parameters at least", -1);
  } else {
    firstAction       = argv[1];
    startAt           = atoi(argv[2]); // atoi(const char * str) -> This function convert your char into integer
    howManyCharacters = atoi(argv[3]);
    secondAction      = argv[4];
    columnStart       = atoi(argv[5]);
    columnEnd         = atoi(argv[6]) + columnStart;
    thirdAction       = argv[7];
    nAfterPaste       = atoi(argv[8]);
    file1             = argv[9];
    file2             = argv[10];

    printf("%s ", firstAction);
    printf("%i ", startAt);
    printf("%i ", howManyCharacters);
    printf("%s ", secondAction);
    printf("%i ", columnStart);
    printf("%i ", columnEnd);
    printf("%s ", thirdAction);
    printf("%i ", nAfterPaste);
    printf("%s ", file1);
    printf("%s \n", file2);

  }

  return EXIT_SUCCESS;
}

答案 1 :(得分:1)

argv中有一个字符串数组,如下所示:

{ "./cnp", "cut", "13", "5", "copy", "33", "7", "paste", "1", "input-b.txt", "output.txt" }

假设最后两个参数始终是输入和输出文件,我将遍历从1到arc - 3的参数来处理命令,例如下图不是一个完整的解决方案,但应该给您一些想法。

if (argc < 3) 
{
    // Handle the fact that there were not enough arguments.
}
else 
{
    int commandArgs = argc - 2;
    for (int i = 1 ; i < commandArgs ; ++i) // Start at 1 to omit program name
    {
        if (strcmp(argv[i], "cut") == 0) 
        {
            if (commandArgs - i < 2)
            {
                // Handle not enough args to cut
            }
            else 
            {
                // You have a cut command, call cut or save it to call cut later       
                i += 2; // Skip the two parameters 
            }
        }
        else if (strcmp(argv[i], "copy") == 0)
        {
            // similar pattern to above
        }
        else if (strcmp(argv[i], "paste") == 0)
        {
            // similar pattern to above
        }  
        else 
        {
            // Handle invalid command error
        }          
    }
}