在 argv[] 的开头添加一个参数
Adding a parameter at beginning of argv[]
if( PIN_Init(argc,argv) || !KnobMaxThreads.Value() )
{
return Usage();
}
要在最后添加另一个参数,我可以这样做(argc-1,argv(
if( PIN_Init(argc-1,argv) || !KnobMaxThreads.Value() )
{
return Usage();
}
如何在beginning
而不是end
添加参数?我用它的东西是这样的:argv[argc-1]
试:
GLOBALFUN int main(int argc, char *argv[])
{
extern KNOB<UINT32> KnobMaxThreads;
PIN_InitSymbols();
if( PIN_Init(argc-1,argv) || !KnobMaxThreads.Value() )
{
return Usage();
}
int array_size = sizeof(argv)/sizeof(argv[0])
cout<<"size : "<<array_size<<endl;
for(int j=array_size -1;j>0;j++)
{
argv[j] = argv[j - 1];
}
char path[3000] = "";
cout<<"path : "<<argv[0]<<endl;
getchar();
sprintf(path, "%s", argv[argc-1]);
你的代码中有很多废话,你对你试图实现的目标的解释不是很清楚。
1(你写了"要在最后添加另一个参数,我可以做(argc-1,argv("。这似乎是错误的,例如,如果 argv 包含 10 个元素,您说它只包含 9 个元素。我没有看到你最后在哪里添加任何内容?因此,当您调用"PIN_Init(argc-1,argv("时,PIN_Init函数知道它有一个包含 9 个元素的数组(即使实际上有 10 个元素(。它只能对 0 到 8 的元素进行操作,跳过最后一个元素。
2(正如其他人所说,你不能轻易地在数组的前面添加一个元素。您的代码在许多方面都特别错误:
int array_size = sizeof(argv)/sizeof(argv[0])
这是一个常数,不依赖于 argv 的内容。基本上两个 sizeof 都返回指针的大小(通常在 32 位架构上为 4,在 64 位架构上为 8,但在这里无关紧要(,因此计算总是产生 1。如果你想array_size数组中的元素数量,只需使用 argc。
for(int j=array_size -1;j>0;j++)
这永远不会循环:array_size始终为 1,j 从 0 开始,条件永远不会满足。这很好,因为如果它开始迭代,在进入未定义的行为(有符号整数溢出(之前永远不会停止。
既然你标记了C++,最好的方法肯定是使用 std::vector:
std::vector<char *> newArray(argc+1); // vector containing one element more than required
newArray[0] = "my new element at the begining";
for(int arg = 0; arg < argc; ++arg)
newArray[arg+1] = argv[arg];
// Can safely replace the loop with:
// memcpy(&newArray[1], argv, argc*sizeof(argv[0]));
纯 C 代码需要显式动态内存分配:
char **newArray = (char **)malloc((argc+1)*sizeof(argv[0]);
// Exactly same as before
newArray[0] = "my new element at the begining";
for(int arg = 0; arg < argc; ++arg)
newArray[arg+1] = argv[arg];
// Can safely replace the loop with:
// memcpy(&newArray[1], argv, argc*sizeof(argv[0]));
// Don't forget to call: free(newArray)
#include <iostream>
void print(int c, char* v[]){
for (int j = 0; j<c; j++)
{
std::cout << j;
std::cout << " " << v[j];
std::cout << "n";
}
}
int main(int argc, char* argv[])
{
const char *extra = "My New 1st Param";
char *newargs[argc+1];
std::cout << "before n";
print(argc, argv);
for(int j = 0; j<argc; j++)
{
newargs[j+1] = argv[j];
}
newargs[0] = extra; // warns -- not too fond of this
std::cout << "after n";
print(argc+1, newargs);
return 0;
}
示例输出
$ ./a.out hello
before
0 ./a.out
1 hello
after
0 My New 1st Param
1 ./a.out
2 hello
相关文章:
- 构造函数在退出函数时无法初始化一个参数
- 运算符重载:"operator+"必须采用零个或一个参数
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 如何设置默认参数以防用户不输入另一个参数
- 使用一个参数的模板函数时出错(适用于 2)
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 如何在两个树通用的函数中创建一个参数?
- 使用带有一个参数函数的递归找到数字的平方
- 专门处理一个参数(C++模板)的两个模板参数
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何更改参数包中的最后一个参数
- C++ 如何使用一个参数从派生类构造函数中调用具有两个参数的超类构造函数
- 模板参数重载,最后一个参数为非类型名
- 根据一个参数对数组进行排序
- 是否可以将指针传递给运算符,作为一个参数,例如指向函数的指针
- 用一个参数计数圆形链接列表中的节点
- 将数组作为一个参数从一个函数传递到C 中的另一个函数
- 将另一个参数传递给函子的库
- 分叉:使用一个参数运行 shell 时资源暂时不可用