在C++中,如何用不同长度的字符串替换一个命令行参数。

问题描述 投票:0回答:1

我有一个大型的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++专业知识,在网上找不到答案。

c++ arrays string command-line-arguments
1个回答
0
投票

我有一个大型的C++程序,在这个程序中,可以使用char *argv[]来提供几个命令行参数。在程序的后面,第一个参数需要用一个任意长度的新字符串来替换。

你根本无法用可移植的方式来实现这一点(当然,前提是你要 ps(1) 以了解更新的参数)。) 你可以找到一些Linux特有的技巧来实现这一点。

当然,你也可以用 argv[i] = "foo"; 在你 main (或从它调用的其他函数),如果 i>=0i<argc. 但是... ps 很可能看不到它。

但为什么你不能直接复制 argcargv 传给 main 作为堆变量,并处理这些变量?

在Linux上,请阅读关于 解析程序参数 glibc. 另见 采购(5).

还考虑到 用一些 std::vector<std::string> 并在你的 mainargcargv

© www.soinside.com 2019 - 2024. All rights reserved.