将std :: string转换为无符号字符数组

时间:2018-08-15 07:27:25

标签: c++

我正在使用c ++ / cli进行编码,并且试图将文本框中的字符串分配给未签名的char数组。我已经完成了从String ^到std :: string的转换。

我知道这是可能的

    unsigned char test[] = "abcde";

但是,我试图将字符串变量传递给数组。下面的字符串变量用于演示。同时,我不知道数组的恒定长度值

    string str = "abcde";
    unsigned char test[] = str.c_str();

我要求类型为unsigned char [6]

enter image description here

希望有人可以为此找到解决方法。谢谢

unsigned char [6]

2 个答案:

答案 0 :(得分:2)

标准方式:

#include <vector>
#include <string>

std::vector<unsigned char> to_vector(std::string const& str)
{
    // don't forget the trailing 0...
    return std::vector<unsigned char>(str.data(), str.data() + str.length() + 1);
}

int main()
{
    std::string str = "abcde";

    auto v = to_vector(str);
}

一种使用可变长度数组扩展名的方法,在某些编译器中可用:

#include <vector>
#include <string>

std::vector<unsigned char> to_vector(std::string const& str)
{
    // don't forget the trailing 0...
    return std::vector<unsigned char>(str.data(), str.data() + str.length() + 1);
}

int main()
{
    std::string str = "abcde";

    unsigned char v[str.length() + 1];
    std::copy(str.data(), str.data() + str.length() + 1, v);
}

但请注意:

main.cpp:14:37: warning: ISO C++ forbids variable length array 'v' [-Wvla]
     unsigned char v[str.length() + 1];
                                     ^

...,这是确保我们使用对数组的引用的另一种方法。请注意,该引用仅在当前线程中有效,并且仅在下一次调用to_array()之前有效。但是请注意,这都是不必要的。

#include <vector>
#include <string>
#include <iostream>

unsigned char (& to_array(std::string const& str))[] 
{
    static thread_local std::vector<unsigned char> result;
    result.assign(str.data(), str.data() + str.length() + 1);
    return reinterpret_cast<unsigned char (&)[]>(*result.data());
}

extern "C" void foo(unsigned char p[]) { }

int main()
{
    std::string str = "abcde";

    unsigned char (&v)[] = to_array(str);
    foo(v);  // ok
    foo(reinterpret_cast<unsigned char*>(str.data())); // also ok!

}

答案 1 :(得分:-2)

您本质上想要做的是找到“ abcde”的地址,并将其传递给未签名的char *作为指针。然后您可以毫无问题地将其作为数组访问。

幸运的是,如果您看一下str.c_str(),您将看到它已经返回了一个指针(abcde的地址)。 因此,您要做的就是将其保存到变量中。 此处的示例:

string str = "abcde";
unsigned char* test = (unsigned char*)str.c_str();

您可以毫无问题地将其作为数组使用。

for (int i = 0; i < str.size(); i++)
    cout << test[i];

如果要复制字符串,可以使用以下命令进行

unsigned char* test = (unsigned char*)malloc(str.size());
memcpy(test, str.c_str(), str.size());

我们要做的是分配内存空间,我们可以在其中使用malloc复制字符串的内容。 然后,我们使用memcpy从str.c_str()(其中包含“ abcde”)返回的地址复制到内容,并将其复制到在使用malloc之前创建的新分配空间的地址。