如何从shell传递整数向量
How to pass integer vector from shell?
我想传递一个整数数组/向量作为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;
}
- C++ 如何比较n个排序的整数向量以找到互元素?
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 如何将整数向量插入到键中,标准::映射的值
- 整数对的向量转化为整数向量的向量
- 如何组合两个整数向量
- C++中整数向量的序列化/反序列化
- 我无法在C++中启动整数向量
- 根据偶数值对整数向量进行排序
- 从整数向量向量搜索整数向量的最佳算法
- 如何将数字转换为整数向量?
- 我需要声明一个包含整数向量的 4x4 矩阵
- 基于整数向量执行位排列的有效方法?
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- 如何将整数向量转换为 2 位十六进制并按顺序添加到 c 字符串?
- 为什么从右值整数向量的元素中推导 decltype(auto) 的类型是 int&?
- 将字符串转换为整数向量
- 尝试创建随机整数向量时的OpenMPI编译器错误
- 整数向量可以创建的整数项的最大数量
- 初始化和显示整数向量时出现意外结果