如何从字符串常量创建char数组?

时间:2017-03-16 09:58:06

标签: c++ c++11 c++14 c++17

我尝试为我的单元测试创​​建一个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();

6 个答案:

答案 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。

  1. 使用动态内存。
  2. 使用静态内存。
  3.  
    
        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*