У меня есть большая программа на 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 ++, чтобы это сделать, и я не смог найти ответ в Интернете.