在C++中,如何用不同长度的字符串替换一个命令行参数。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C++中,如何用不同长度的字符串替换一个命令行参数。相关的知识,希望对你有一定的参考价值。
我有一个大型的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++程序,在这个程序中,可以使用char *argv[]来提供几个命令行参数。在程序的后面,第一个参数需要用一个任意长度的新字符串来替换。
你根本无法用可移植的方式来实现这一点(当然,前提是你要 ps(1) 以了解更新的参数)。) 你可以找到一些Linux特有的技巧来实现这一点。
当然,你也可以用 argv[i] = "foo";
在你 main
(或从它调用的其他函数),如果 i>=0
和 i<argc
. 但是... ps
很可能看不到它。
但为什么你不能直接复制 argc
和 argv
传给 main
作为堆变量,并处理这些变量?
在Linux上,请阅读关于 解析程序参数 glibc
. 另见 采购(5).
还考虑到 用一些 std::vector<std::string>
并在你的 main
从 argc
和 argv
以上是关于在C++中,如何用不同长度的字符串替换一个命令行参数。的主要内容,如果未能解决你的问题,请参考以下文章