В C ++ как заменить один из аргументов командной строки строкой разной длины - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть большая программа на C ++, в которой несколько аргументов командной строки могут быть предоставлены с помощью char *argv[]. Позднее в программе первый аргумент необходимо заменить новой строкой произвольной длины.

Сначала я попытался сделать это простым способом:

MyProg_1. cpp

#include <cstring>
#include <iostream>

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

  using std::cout; using std::endl;
  std::string new_string;

  //Confirm the command line arguments on the screen:
  for(int i = 0; i < argc; ++i){
     cout << "argv[" << i << "] = " << argv[i] << "   String length = " << strlen(argv[i]) <<  endl;
  }
     cout << endl;

  // Change the value of one of the arguments:
  new_string = "ABCDE";
  strcpy(argv[1], new_string.c_str());

  //Confirm the command line arguments on the screen:
  for(int i = 0; i < argc; ++i){
     cout << "argv[" << i << "] = " << argv[i] << "   String length = " << strlen(argv[i]) << endl;
  }

}

Я компилирую и запускаю его как ...

$ g++ MyProg_1.cpp -o MyProg_1.x
$ ./MyProg_1.x abc def ghi

И получаю следующий вывод

argv[0] = ./MyProg_1.x   String length = 9
argv[1] = abc   String length = 3
argv[2] = def   String length = 3
argv[3] = ghi   String length = 3

argv[0] = ./MyProg_1.x   String length = 9
argv[1] = ABCDE   String length = 5
argv[2] = E   String length = 1
argv[3] = ghi   String length = 3

Так что ему присваивается значение new_string argv [1] правильно, но портит значение argv[2], которое я хотел бы сохранить до исходного значения (def).

Так что в моей следующей попытке я попытался сохранить значения argv во временный строковый массив, в надежде, что я смогу восстановить значения argv[2] и далее после изменения argv[1].

MyProg_2. cpp

#include <string>
#include <cstring>
#include <iostream>

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

  using std::cout; using std::endl;

  std::string argvtemp[argc];
  std::string new_string;

  //Store all the command line arguments in a temporary array:
  for(int i = 0; i < argc; ++i){
     argvtemp[i] = argv[i];
     cout << "argvtemp[" << i << "] = " << argvtemp[i] << "   String length = " << argvtemp[i].length() <<  endl;
  }
     cout << endl;

  // Change the value os one of the arguments:
  new_string = "ABCDE";
  strcpy(argv[1], new_string.c_str());

  //Restore the rest of the argv elements
  for(int i = 2; i < argc; ++i){
     strcpy(argv[i], argvtemp[i].c_str());
  }

  for(int i = 0; i < argc; ++i){
     cout << "argv[" << i << "] = " << argv[i] << "   String length = " << strlen(argv[i]) << endl;
  }

}

Снова , Я компилирую и запускаю его как ...

$ g++ MyProg_2.cpp -o MyProg_2.x
$ ./MyProg_2.x abc def ghi

И на этот раз я получаю следующий вывод

argvtemp[0] = ./main4.x   String length = 9
argvtemp[1] = abc   String length = 3
argvtemp[2] = def   String length = 3
argvtemp[3] = ghi   String length = 3

argv[0] = ./main4.x   String length = 9
argv[1] = ABCDdef   String length = 7
argv[2] = def   String length = 3
argv[3] = ghi   String length = 3

Это исправляет проблему с argv[2], но теперь портит измененный значение argv[1], которое должно было быть ABCDE.

Просто, чтобы уточнить, вывод, который я хотел бы видеть:

argv[0] = ./main4.x   String length = 9
argv[1] = ABCDE   String length = 5
argv[2] = def   String length = 3
argv[3] = ghi   String length = 3

Как мне этого добиться? Мне кажется, что длина отдельных элементов argv почему-то не меняется даже после того, как я изменяю их значения.

К сожалению, у меня недостаточно опыта в C ++, чтобы это сделать, и я не смог найти ответ в Интернете.

1 Ответ

0 голосов
/ 22 апреля 2020

У меня есть большая программа на C ++, в которой несколько аргументов командной строки могут быть предоставлены с помощью char * argv []. Далее в программе первый аргумент необходимо заменить новой строкой произвольной длины.

Вы просто не можете сделать это переносимым способом (при условии, что вы, конечно, хотите ps ( 1) чтобы быть в курсе обновленных аргументов). Вы можете найти некоторые Linux специфические c трюки, которые делают это.

Конечно, вы можете сделать argv[i] = "foo"; в вашем main (или какой-либо другой функции, вызываемой из него), если i>=0 и i<argc. Но ps, скорее всего, его не увидит.

Но почему вы не можете просто скопировать argc и argv, переданные main, в качестве переменных кучи и обработать их?

В Linux читайте о синтаксическом анализе аргументов программы с glibc. См. Также pro c (5) .

Также рассмотрите , используя std::vector<std::string> и заполните его в начале main из argc и argv

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...