我有一个std::string
数组,我需要转换为一个无符号字符数组,这样我就可以使用这个数组与第三方库,只接受无符号字符数组。
假设我的数组是
std::string array[3];
array[0] = "a105b";
array[1] = "c258e"
array[2] = "ff587";
我需要把这个数组转换成:
unsigned char cArray[3][5];
我可以硬连接unsigned char,如下所示:
unsigned char cArray[3][5] = {"a105b", "c258e", "ff587"};
但是我无法找到一种方法来使用c++代码将数据从std::string
数组传输到无符号字符数组。
可以创建一个函数,循环遍历这两个数组,并从一个数组复制到另一个数组。
的例子:
#include <algorithm>
#include <iostream>
#include <string>
template<size_t R, size_t N>
void foo(const std::string(&src)[R], unsigned char(&dest)[R][N]) {
// both `src` and `dest` must be arrays with `R` rows
// `N` is how many unsigned chars each inner array in `dest` has
for(size_t idx = 0; idx < R; ++idx) {
// Copy from `src[idx]` to `dest[idx]`
// Copy at most `N` chars but no more than the length of the string + 1
// for the null terminator:
std::copy_n(src[idx].c_str(), std::min(N, src[idx].size() + 1), dest[idx]);
// Add the below line if the arrays in cArray are supposed to
// be null terminated strings:
//dest[idx][N - 1] = ' ';
}
}
int main() {
std::string array[3];
array[0] = "a105b";
array[1] = "c258e";
array[2] = "ff587";
unsigned char cArray[3][5];
foo(array, cArray);
}
我可以硬连接unsigned char,如下
unsigned char cArray[3][5] = {"a105b", "c258e", "ff587"};
不,这在c++中是无效的。你必须让内部数组[6]
在c++中:
unsigned char cArray[3][6] = {"a105b", "c258e", "ff587"};
在代码中可能是这样的:
#include <array>
#include <algorithm>
#include <cstring>
#include <string>
template<typename to_type, size_t buf_size, size_t number_of_strings>
void to_array(const std::array<std::string, number_of_strings>& input,
to_type (&output)[number_of_strings][buf_size])
{
for (std::size_t n = 0; n < number_of_strings; ++n)
{
const auto input_str = input[n].c_str();
// for input string include trailing 0 on input so add one to length
const auto copy_len = std::min(input[n].length()+1, buf_size);
std::memcpy(output[n], input_str, copy_len);
}
}
int main()
{
std::array<std::string, 3> input_array{ "a105b", "c258e", "ff587" };
unsigned char c_array[3][6];
to_array<unsigned char, 6>(input_array, c_array);
return 0;
}
它再次向我展示了'c'风格的数组不太好使用。你不能从函数中返回它们(就像你可以用std::array那样)。因此,您必须将输出数组作为参数传递给转换函数。
不允许给普通数组赋值。不能为普通数组定义自己的赋值操作符,因为c++不允许重载赋值操作符,除非将其作为类的非静态成员函数。
一种解决方法是为移位操作符定义重载,并为输入流提供类似的语法。
template <unsigned N>
void operator >> (std::string s, unsigned char (&a)[N]) {
auto n = (s.size() < N) ? s.size() + 1 : N;
std::copy_n(s.c_str(), n, a);
}
/*...*/
unsigned char cArray[3][5];
array[0] >> cArray[0];
array[1] >> cArray[1];
array[2] >> cArray[2];