c++ - 将非空终止 c 字符串转换为终止 c 字符串的最干净方法

标签 c++ templates c-strings c++03 null-terminated

我有一些遗留函数返回非空终止字符串。

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));

最佳答案

应该这样做:

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;
}

这将允许您按照自己的方式使用它。

编辑 标签编辑后,我去掉了std::beginstd::endl

关于c++ - 将非空终止 c 字符串转换为终止 c 字符串的最干净方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36267731/

相关文章:

C++ 无法覆盖纯虚函数

c++ - C++ 核心指南中的 stack_array

c++ - 我可以在创建窗口后删除标题栏/标题吗?

c++ - 在结构上使用模板时遇到问题

javascript - 如何在 Iron Router Meteor 中查看当前路线

c - 查找字符串长度的程序

c - 使用递归反转字符串 - 出现 'Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)' 错误

c++ - 如何将 Catch2 作为外部库与 CMake 集成?

c++ - 特化成员模板而不特化其父模板

c - 无法将字符串添加到 C 中的 LinkedList