How to initialize std :: array <char, N> with a string literal omitting the final '\ 0'

I have a file structure where fixed-length strings don't have trailing zero. How to initialize fields as std :: array without trailing zero:

#pragma pack(push, 1) struct Data { // Compiles, but it has an undesired '\0': std::array<char, 6> undesired_number{"12345"}; // Does not compile: std::array<char, 5> number{"12345"}; // stripping '\0' }; #pragma pack(pop) 
+5
source share
2 answers

Creating a helper function

 template <std::size_t N, std::size_t ... Is> std::array<char, N - 1> to_array(const char (&a)[N], std::index_sequence<Is...>) { return {{a[Is]...}}; } template <std::size_t N> std::array<char, N - 1> to_array(const char (&a)[N]) { return to_array(a, std::make_index_sequence<N - 1>()); } 

And then

 struct Data { std::array<char, 5> number{to_array("12345")}; // stripping '\0' }; 

Demo

+11
source

A string literal has a NUL end, in C ++ (unlike C) you cannot remove it by specifying the size Length - 1 ; therefore, it cannot be done directly, also given that array internally T[N] .

0
source

Source: https://habr.com/ru/post/1235032/


All Articles