2016-05-06 6 views
0

C++では、クラスのインスタンス化時にcharの配列を渡しているときに、入ってくる文字の数が不明な場合にオーバーフローを防ぐためにコピーされたバイトに上限を設定できますか?コンストラクタの初期化を使用するクラスコンストラクタにcharの配列を渡すときのオーバーフローを防止しますか?

私の実装はユーザの入力に基づいていないので、それはうまくいくことはわかっていますが、一般的な知識は不思議です。

this postから)

class test2 { 
    char name[40]; 
public: 
    test2() : name("Standard") {}; 
    void display() { cout << name << endl; } 
}; 

追記として、(this postの編集されたバージョン)

class test2 { 
    char name[40]; 
public: 
    test2(const char *charsComingIn) : name(charsComingIn) {}; 
    void display() { cout << name << endl; } 
}; 

は、私は第二の例をテストしていませんが、それは私が現時点で何をしようとしているの要旨です。どのような修正も実装の概念に歓迎されています。

+3

'const char *'から 'char [40]'を初期化することはできません。問題は回避されました! –

+2

'strncpy'があります。通常、これは 'std :: string'のような管理されたソリューションより劣っているとみなされます。 –

+0

文字の配列を渡していません。 – immibis

答えて

1

あなたはstrncpyを使用して、潜在的に切り捨てることができます:

test2(const char *charsComingIn) { 
    strncpy(name, charsComingIn, sizeof(name)); 
    name[sizeof(name)-1] = '\0'; 
} 

これは間違いなくオーバーフローしません。ただし、ユーザーが切り捨てられたかどうかはわかりません。後者が懸念される場合は、例外をスローすることができます。

それともだけ十分に小さいアレイの可能性があります:

template <size_t N, class = std::enable_if_t<(N <= 40)>> 
test2(const char (&in)[N]) { 
    memcpy(name, in, N); 
} 

任意のc-の文字列を許可しないでしょう。

関連する問題