在argv []开头添加参数

时间:2014-03-26 04:32:17

标签: c++ linux

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]);

2 个答案:

答案 0 :(得分:3)

您的代码中存在许多无意义的内容,并且您对尝试实现的内容的解释并不十分明确。

1)你写了#34;要在最后添加另一个参数,我可以做(argc-1,argv)&#34;。这似乎是错的,如果argv包含10个元素,例如,你说它只包含9个。我不知道你最后在哪里添加任何东西?因此,当您调用&#34; PIN_Init(argc-1,argv)&#34;时,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)

答案 1 :(得分:2)

#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