从向量<string>到 char** 的转换仅携带第一个元素
Conversion from vector<string> to char** only carries the first element
我已经用我的问题对下面的代码进行了大量注释。基本上,问题是我试图通过std::vector<std::string>
伪造argv
,但我从Visual Studio获得了我所不期望的行为。你能详细说明我在这里错过了什么吗?
std::vector<std::string> argv_storage;
for (std::size_t i = 0; i < 10; ++i)
{
// I copy output of generate_rand_str() because I will need it
// later in the code.
argv_storage.push_back( std::string( generate_rand_str() ) );
}
std::vector<char *> argv( argv_storage.size() + 1 ); // one extra for NULL
for (std::size_t i = 0; i != argv_storage.size(); ++i)
{
argv[i] = &argv_storage[i][0];
}
// Here if I access elements like argv.data()[index]
// they are perfectly fine but when I do:
char** test = argv.data();
// Visual Studio debugger only shows argv.data()[0]
// I want to pass this to glutInit() ...
int argc = argv.size() - 1; // one less for the NULL
glutInit(&argc, argv.data());
// Inspection of arguments passed to glutInit() also shows that ONLY the
// the first element of argv is passed.
dr 你对glutInit
的呼吁是错误的。见下文。
尽管许多其他贡献者声称,您的个人 C 字符串完全以 NULL 结尾,因为在 C++11(您正在使用(中,保证str.operator[](str.size())
的计算结果为 null 字符:
[C++11: 21.4.5]:
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
1 要求:
pos <= size().
2 返回:如果pos < size()
,则*(begin() + pos)
,否则引用值为charT()
的T
类型的对象; 引用的值不得修改。
(严格来说,这并不是说*(&str.operator()(str.size()-1)+1)
是charT()
的,而是NULL 必须存储在实际的数据缓冲区中,以便实现遵守字符串的常量访问保证。
所以完全没有必要诉诸存储str.c_str()
的结果,尽管这是一个有效的替代方法。
而且,由于向量默认初始化其成员,因此argv
本身也是以 null 结尾的。
因此,您的矢量没有问题;当我抽象出OpenGL时,我无法重现您的问题:
#include <vector>
#include <string>
#include <iostream>
int main()
{
std::vector<std::string> argv_storage;
for (std::size_t i = 0; i < 10; ++i)
{
// I copy output of generate_rand_str() because I will need it
// later in the code.
argv_storage.push_back(std::to_string(i));
}
std::vector<char *> argv( argv_storage.size() + 1 ); // one extra for NULL
for (std::size_t i = 0; i != argv_storage.size(); ++i)
{
argv[i] = &argv_storage[i][0];
}
char** test = argv.data();
while (*test != NULL) {
std::cout << *(test++) << ' ';
}
}
// 0 1 2 3 4 5 6 7 8 9
(现场演示(
但是,glutInit
需要一个指向数据缓冲区大小的指针,而不是大小本身。所以,当你通过argv.size()
时,这是错误的。
试试这个:
int argv_size = argv.size();
glutInit(&argv_size, argv.data());
glutInit
采用int *
作为第一个参数,而不是int
。
你的矢量/字符串的东西看起来很乱,但是正确的。
- 从较小的阵列到较大的阵列的元素级转换
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 从转换后的容器元素创建离散分布
- 将包含多个元素的字符串作为输入并转换为矢量 C++
- 如何从一个容器中获取某些元素并将其转换插入到另一个容器中?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- void* 数组将元素转换为另一种类型
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 避免从单一元素向量转换为基元类型
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- 将数字的字符串数组转换为整数数组时,元素将变为 0
- 如何将 int 数组的 1 个元素转换为字符串/字符
- 转换字符串向量:基于先前的值跳过元素
- 如何将元素从 Swift 中的 [UnsafeMutablePointer<UInt8>] 转换为 C++ 中的 UInt8 *
- 为什么 C++ std::move 并没有真正对 std::initializer_list 中的元素进行强制转换?右值
- 将字符串元素转换为整数 (C++11)
- 如何转换一个类方法以修改另一个类的私有元素?
- 转换性元素::元素
- 使用Stoi()将字符串数组元素转换为C 中的INT
- 从字符串转换为float时,丢失文件中的第一行元素