如何将向量转换为以<string>空结尾的字符**?
How to convert a vector<string> to null terminated char **?
我试图将std::vector<std::string>
转换为c风格字符串(char *
)的NULL终止数组。是否可以不复制new
/malloc
?
基本上,我想将vec转换回与arr完全相同的东西,而不使用new/malloc。
#include <string>
#include <vector>
#include <stdio.h>
using namespace std;
void print(const char **strs)
{
const char **ptr = strs;
while(*ptr) {
printf("%s ", *ptr);
++ptr;
}
}
void print(std::vector<std::string> &strs) {
for(auto iter = strs.begin(); iter != strs.end(); ++iter) {
printf("%s ", iter->c_str());
}
}
void main()
{
const char *arr[] = { "a", "b", "c", "d", "e", "f", NULL };
vector<string> vec;
const char **str = arr;
while(*str) {
vec.push_back(*str);
++str;
}
vec.push_back((char *) NULL); //Doesn't work
//print(vec);
print((const char **) &vec[0]);
}
仅仅通过设置指向该向量开头的指针是不可能的,因为vector<string>
不是您期望的顺序字符。
addr1 addr2 addr3
^ ^ ^
| | |
+--------+--------+--------+----
| | | | | | |
| std:: | std:: | std:: |
+----> | string | string | string | ...
| | | | |
| +--------+--------+--------+----
|
|
|
vector<string>
addr1
, addr2
和addr3
是内存中的随机地址。
因此,解决方案是遍历项目,读取字符串和字符并将它们放入continue数组
您需要自己构建指针数组,如果在编译时不知道其大小,则需要动态分配。(在本例中,您可以从sizeof arr
;但我假设arr
是不可用的,当你需要重建它)。
您可以使用指针指向由vector管理的字符串,因此您不需要为它们分配任何内存。
这样你就可以得到你需要的数组了:
std::vector<char const *> vec2;
vec2.reserve(vec.size()+1); // optional, but might improve efficiency
for (auto const & str : vec) {
vec2.push_back(str.c_str());
}
vec2.push_back(nullptr);
print(vec.data());
是否可以不使用new/malloc进行复制?
如果您的c++编译器支持变长数组作为扩展,那么它就是。否则,您将不得不使用动态内存分配。
std::vector<std::string> vec;
// initialize `vec', etc.
const char *c_strings[vec.size()];
size_t idx = 0;
for (std::vector<std::string>::iterator it = vec.begin(); it != vec.end(); it++) {
c_strings[idx++] = it->c_str();
}
好的,所以你不能在std::vector<std::string>
中存储"NULL",我认为这是你想要做的。
std::vector
的全部意义在于它跟踪std::vector::size()
然而,如果你真的需要有一个东西,你可以传递给一个函数,比如你的print,那么你可以这样做:
vector<const char *> v;
for(auto iter = vec.begin(); iter != vec.end(); ++iter) {
v.push_back(iter->c_str());
}
v.push_back(NULL);
print(&v[0]);
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存