将非空终止 c 字符串转换为终止 c 字符串的最干净方法
Cleanest way to convert non null terminating c string to terminating c string
我有一些遗留函数 return 非空终止字符串。
struct legacy {
char a[4]; //not null terminated
char b[20]; //not null terminated
};
我传递了很多这些 char 数组,我需要一种干净的方法将它们转换为 null 终止。
截至目前,这就是我正在做的事情:
legacy foo;
std::string a(foo.a, sizeof(foo.a));
std::string b(foo.b, sizeof(foo.b));
bar(foo.a.c_str(), foo.b.c_str());
有没有更简洁的方法我可以使用 类 和模板将此代码简化为...
legacy foo;
bar(make_null_terminated(foo.a), make_null_terminated(foo.b));
您可以简单地:
std::string a(std::begin(foo.a), std::end(foo.a));
应该这样做:
struct make_null_terminated {
template <size_t sz>
make_null_terminated(char (&lit)[sz]) : str(lit, sz) {}
operator const char* () const { return str.c_str(); }
private:
std::string str;
}
这将允许您按照自己的方式使用它。
EDIT 标签编辑后,我去掉了 std::begin
和 std::endl
.
我能想到的最干净的方法是使用 std::string 的迭代器构造函数,指针是一种迭代器。
bar(std::string(std::begin(foo.a), std::end(foo.a)).c_str(),
std::string(std::begin(foo.b), std::end(foo.b)).c_str());
这里发生了什么?
通过复制 foo.a 中的字节并添加尾随零来构造一个字符串(这被封装在 std::string 中)
同上 foo.b
在临时字符串上调用方法 c_str() 以获取指向内部以 null 结尾的 c 字符串的指针。
来电吧
销毁临时字符串
我有一些遗留函数 return 非空终止字符串。
struct legacy {
char a[4]; //not null terminated
char b[20]; //not null terminated
};
我传递了很多这些 char 数组,我需要一种干净的方法将它们转换为 null 终止。
截至目前,这就是我正在做的事情:
legacy foo;
std::string a(foo.a, sizeof(foo.a));
std::string b(foo.b, sizeof(foo.b));
bar(foo.a.c_str(), foo.b.c_str());
有没有更简洁的方法我可以使用 类 和模板将此代码简化为...
legacy foo;
bar(make_null_terminated(foo.a), make_null_terminated(foo.b));
您可以简单地:
std::string a(std::begin(foo.a), std::end(foo.a));
应该这样做:
struct make_null_terminated {
template <size_t sz>
make_null_terminated(char (&lit)[sz]) : str(lit, sz) {}
operator const char* () const { return str.c_str(); }
private:
std::string str;
}
这将允许您按照自己的方式使用它。
EDIT 标签编辑后,我去掉了 std::begin
和 std::endl
.
我能想到的最干净的方法是使用 std::string 的迭代器构造函数,指针是一种迭代器。
bar(std::string(std::begin(foo.a), std::end(foo.a)).c_str(),
std::string(std::begin(foo.b), std::end(foo.b)).c_str());
这里发生了什么?
通过复制 foo.a 中的字节并添加尾随零来构造一个字符串(这被封装在 std::string 中)
同上 foo.b
在临时字符串上调用方法 c_str() 以获取指向内部以 null 结尾的 c 字符串的指针。
来电吧
销毁临时字符串