我尝试为我的单元测试创建一个char* values[]
,它将被编写但是从常量初始化。天真的方式抛出一个警告,ISO C ++禁止它:
char* single[1];
single[0] = "foobar";
我尝试了以下显然不起作用:
std::string executable = "foobar";
std::array<char, executable.size()> data; // Error: size not known at compile time
std::copy(executable.begin(), executable.end(); data.data());
char* single[1];
single[0] = data.data();
必须有这样的方式:
std::array<char> data = { "foobar" };
char* single[1];
single[0] = data.data();
答案 0 :(得分:4)
我建议您将to_array
添加到工具箱中。然后你可以简单地写
Functor m
答案 1 :(得分:3)
std::string foo = "foobar";
std::vector<char> data(foo.data(), foo.data()+foo.size()+1u);
char* single[1];
single[0] = data.data();
How to convert a std::string to const char* or char*?
如果再次出现这种模式,你可以使用某种转换函数:
template<class CharT, std::size_t N>
std::vector<CharT> literal_vector(CharT const (&a)[N])
{
return std::vector<CharT>(&a[0], (&a[0]) + N);
}
然后
std::vector<char> lv = literal_vector("Hello");
single[0] = lv.data();
答案 2 :(得分:3)
即使您的问题未被标记为c ++ 1z,但值得一提的是,data
std::string
函数的常量限制已在标准的当前工作草案中解除(N4618),即将发布为C ++ 17。在[basic.string]中,可以找到两者:
const charT* data() const noexcept; charT* data() noexcept;
您的编译器可能已经支持它,可能需要编译器标志-std=c++1z
或类似的。如果是这样,你应该写:
std::string executable = "foobar";
char *single[1];
single[0] = executable.data();
答案 3 :(得分:1)
这里有两种方式,它们都使用memcpy。
using namespace std;
#define MAX_BUFFER_SIZE 250
int main()
{
const char* myData = "This is My Data";
int sizeOfmydata = std::strlen(myData);;
//1.- Dinamic Memory
char* data1 = new char[sizeOfmydata];
std::memcpy(data1, myData, sizeOfmydata);
//2.- Static Memory
char data2[MAX_BUFFER_SIZE];
memset(data2, '\0', MAX_BUFFER_SIZE);
std::memcpy(data2, myData, sizeOfmydata);
delete[] data1;
return 0;
}
答案 4 :(得分:-1)
这有点长,但它似乎做你需要的。这是文件foo.cpp
:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
int main(int argc, char* argv[])
{
std::vector<std::string> strings = {"foobar", "barbaz"};
char* values[strings.size()];
for (int i = 0; i < strings.size(); ++i) {
values[i] = new char[strings[i].size() + 1];
std::copy(strings[i].cbegin(), strings[i].cend(), values[i]);
values[strings[i].size()] = '\0';
}
for (int i = 0; i < strings.size(); ++i) {
printf("%s\n", values[i]);
}
return 0;
}
然后:
$ make foo
g++ foo.cpp -o foo
$ ./foo
foobar
barbaz
你当然应该delete
char*
数组中的每个元素,并且可以在函数中放置从std::string
复制到char*
的循环。上。
PS:auch,此解决方案与某人已经链接的this answer相同....链接的其他答案有更多详细信息。这是否意味着您的问题是重复的?我让有经验的用户决定。
答案 5 :(得分:-1)
您可以使用std::vector<std::string>
存储数据,并使用c_str()
std::string
将字符串解析为char*