声明固定大小的字符串

14

在C语言中我们这样做

char buffer[100];

有没有一种方法来声明一个固定大小的 std::string


4
用固定长度的字符串解决哪些问题? - Oliver Charlesworth
1
你可以选择在C语言中做完全相同的事情。你还可以使用array<char>。或者你可以只将字符串限制在100个字符以内。这取决于你想要做什么。 - D Hydar
https://dev59.com/UnI_5IYBdhLWcg3wAeA2 - Shahid
你可以使用std::vector<char>。 - Unick
有一个类似于 void do_something(char * buffer, int buffer_sz); 的第三方函数,我决定使用 std::string 并在需要时将其转换为 cstring。问题是 buffer_sz 必须在编译时知道。所以我想知道是否有一种声明固定大小的 std::string 的方法... - user3600124
你有什么理由不能直接使用 std::string,但忽略允许你插入或删除字符的函数吗? - Nicol Bolas
6个回答

11

你可以像这样使用string::reserve方法

  std::string s;
  s.reserve(100);

但这并不是固定大小的,因为您可以使用string::push_back等方法向字符串中添加更多字符。


7
在c++17中,会有std::string_view,它提供与std::string相同(不可变)的接口。
同时,您可以将char数组封装起来,并添加您选择的任何服务,例如:
template<std::size_t N>
struct immutable_string
{
    using ref = const char (&)[N+1];
    constexpr immutable_string(ref s)
    : s(s)
    {}

    constexpr auto begin() const { return (const char*)s; }
    constexpr auto end() const { return begin() + size(); }
    constexpr std::size_t size() const { return N; }
    constexpr ref c_str() const { return s; }
    ref s;

    friend std::ostream& operator<<(std::ostream& os, immutable_string s)
    {
        return os.write(s.c_str(), s.size());
    }
};

template<std::size_t NL, std::size_t NR>
std::string operator+(immutable_string<NL> l, immutable_string<NR> r)
{
    std::string result;
    result.reserve(l.size() + r.size());
    result.assign(l.begin(), l.end());
    result.insert(result.end(), r.begin(), r.end());
    return result;
}

template<std::size_t N>
auto make_immutable_string(const char (&s) [N])
{
    return immutable_string<N-1>(s);
}

int main()
{
    auto x = make_immutable_string("hello, world");
    std::cout << x << std::endl;

    auto a = make_immutable_string("foo");
    auto b = make_immutable_string("bar");
    auto c = a + b;
    std::cout << c << std::endl;
}

5
截至Boost 1.66:一种不分配内存的字符串,模拟std::basic_string的接口。

5

我不知道你想做什么,但是使用std::array<char, 100> buffer;应该可以胜任。

然后你可以像这样获取一个字符串:

std::string str(std::begin(buffer),std::end(buffer);

1

1

你可以使用 std::array,它是 C++ 中实现与 C 中相同功能的方法。

std::array<char, 100> buffer;

如果您担心由于大缓冲区大小而导致堆栈溢出(例如,如果那个1001'000'000的替代品),则可以改为动态分配。

std::unique_ptr<std::array<char, 100>> buffer = std::make_unique<std::array<char, 100>>();

由于你的接口以char *作为操作数,并且该对象允许您在运行时查询其大小,因此这应该足够。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接