我正在使用c ++ / cli进行编码,并且试图将文本框中的字符串分配给未签名的char数组。我已经完成了从String ^到std :: string的转换。
我知道这是可能的
unsigned char test[] = "abcde";
但是,我试图将字符串变量传递给数组。下面的字符串变量用于演示。同时,我不知道数组的恒定长度值
string str = "abcde";
unsigned char test[] = str.c_str();
我要求类型为unsigned char [6]
希望有人可以为此找到解决方法。谢谢
unsigned char [6]
答案 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之前创建的新分配空间的地址。