2016-08-22 19 views
4

の文字列を宣言我々はCで固定サイズ

char buffer[100]; 

は固定サイズstd::stringを宣言する方法はありますか?

+4

固定長の文字列でどのような問題を解決したいですか? –

+0

Cで同じことを*正確に*行うことができます。また、配列でも可能です。あるいは、文字列に100文字以上の文字を置くことはできません。それはあなたが何をしようとしているかによって異なります。 –

+0

http://stackoverflow.com/questions/1571901/c-fixed-length-string-class – Shahid

答えて

0

あなたは何をしたいのか分かりませんが、std::array<char, 100> buffer;とすればうまくいくはずです。

あなたは、このような文字列を取得することができます:あなたはこの

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

ようstring::reserveメソッドを使用することができますしかし、あなたがより多くの文字を追加することができますので、これは、固定サイズではありません

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

を例えばstring :: push_backの文字列。

3

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

あなたがCで行ったまさに行うためのC++メソッドであるstd::arrayを、使用することができますあなたは(のような、例えば、その100がスタンドで1'000'000用の場合)による大規模なバッファサイズにスタックオーバーフロー心配している場合。

std::array<char, 100> buffer; 

あなたは動的代わりにそれを割り当てることができます。あなたのインターフェース以来

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

は、そのオペランドとしてchar *をとり、このオブジェクトは、実行時に、そのサイズを照会することができ、これは十分であるべきです。

関連する問題