如何从shell传递整数向量

How to pass integer vector from shell?

本文关键字:整数 向量 shell      更新时间:2023-10-16

我想传递一个整数数组/向量作为shell参数?下面是我的最后一次尝试:

#include <iostream>
#include <vector>
#include <string>
//using namespace std;
int main(int argc, const char *argv[])
{
    char dummy;
    std::vector<int> argument(argc-1);
    std::cout<<argc<<std::endl;
    for (int i = 1; i <= argc; ++i)
    {
        dummy=*(*(argv+1)+i);
        argument[i-1]=std::stoi(dummy);
    }
    std::cout<<argument.size()<<std::endl;
    return 0;
}

I got error:

错误:没有匹配的函数来调用' stoi(char&) '

有更简单的方法吗?基本运行程序如下:

。/可执行{1,2,3,4,5}

并在程序中使用这些值初始化数组/向量?

解决编译器错误是浪费时间。OP最初使用std::string dummy;的想法是正确的,所以让我们坚持下去,找出问题所在。

首先让我们假设4个参数:1 12 123 1234并检查4循环的范围。

for (int i = 1; i <= argc; ++i)

因为OP从1开始循环,我假设它们知道第一个参数是执行的命令。好的开始。

i <= argc将允许i的范围从1到5。argv的取值范围是0 ~ 4。这意味着未定义的行为被调用访问argv[5]和Crom只知道之后会发生什么。很可能dummy加载了来自argv[5]的垃圾,而std::stoi无法将这些垃圾解析为int。这只是猜测。确定未定义行为的行为是浪费时间。下次可能会不一样。它甚至可能看起来像下一次成功了。

首先要做的是去掉越界读。

for (int i = 1; i < argc; ++i)

现在我们有一个范围为1到4的i,所有的东西都在边界内。

接下来,我们可以清理
dummy=*(*(argv+1)+i);

,因为我们不再试图将其放入char中。最简单的是

std::string dummy(argv[i]);

声明string dummy并初始化它以包含一个命令行参数。这能做得更快吗?是啊,但这太好读了。从简单开始,如果简单不符合项目要求,才进入困难。我唯一要做的更改是将dummy更改为更具描述性的名称。

更简单的是

argument[i-1]=std::stoi(argv[i]);

但我更喜欢dummy方法,至少现在。它有一个主要的调试优势:您可以在std::stoi抛出异常之前打印或使用调试器检查dummy的值,因为dummy无法转换。

结果代码:

int main(int argc, const char *argv[])
{
    std::vector<int> argument(argc-1);
    std::cout<<argc<<std::endl; 
    for (int i = 1; i < argc; ++i) 
    {
        std::string dummy(argv[i]);
        argument[i-1]=std::stoi(dummy);
    }
    std::cout<<argument.size()<<std::endl;
    return 0;
}
./executable 1 12 123 1234调用

,输出将是

5
4

5个输入参数和4个向量项,因为命令被丢弃。

如何处理

中的花括号
./executable {1, 2, 3, 4, 5}

我要留给OP去弄清楚。

无需复杂,直接使用

    argument[i-1]=std::stoi(argv[i]); in place of 
    dummy=*(*(argv+1)+i);
    argument[i-1]=std::stoi(dummy);

我们知道大小为n的数组将元素从位置0存储到位置n-1。Argc是字符串的数目,当你运行程序时,包括你的可执行文件名,我们知道argv是字符串数组(字符序列),所以在argv的位置0是一个可执行文件名。这就是为什么从位置i=1开始for循环,我们需要运行for循环i=1到i <Argc(表示直到i><= Argc -1)

试试下面的程序

  #include <iostream>
  #include <vector>
  #include <string>
  using namespace std;
  int main(int argc, const char *argv[])
  {
  char dummy;
  std::vector<int> argument(argc-1);
  std::cout<<argc<<std::endl;
  for (int i = 1; i < argc; ++i)
  {
      //   dummy=*(*(argv+1)+i);
    // argument[i-1]=std::stoi(dummy);
     argument[i-1]=std::stoi(argv[i]);
   }
  std::cout<<argument.size()<<std::endl;
 return 0;
 }