Как использовать аргумент командной строки в вызовах функций и параметрах? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь прочитать аргументы из основной функции.Моя проблема в том, как получить каждый аргумент, чтобы поместить их в функции.Я знаю, что должен использовать что-то вроде 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 - это файлы.

Здесь мы просим сократить 5 символов, начиная со столбца 13. Это должно сократить 3-значный номер после каждого имени.Затем мы просим его сделать копию того, что в столбцах с 33 по 39;это 7 символов, начиная с колонки 33, и это должно дать нам копию последнего числа с плавающей запятой в каждой строке.Затем мы говорим ему вставить это в начале строки, давая нам еще одну копию этих чисел в начале каждой строки.Таким образом, оригинал будет выглядеть следующим образом

       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 ]

1 голос
/ 13 марта 2019

У вас есть массив строк в 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
        }          
    }
}
1 голос
/ 13 марта 2019

Когда вы передаете некоторое значение по параметру в 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 возвращают символ, поэтому, если вы хотите получить целое число, которое вы должны преобразовать, вы можете использовать atoi(), эта функция получает символ и возвращает целое число doc .

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...