C++:

2017-12-12 7 views
0

の割り当てで互換性のないタイプの私は、このstruct作成:C++:

struct message_text{ 
        char text[1024]; 
}; 

message_text instance; 

instance.text = "HELLO WORLD, FIRST MESSAGE"; 

を、私はこのエラーを取得する:instance.textのサイズを超えていないため

error: incompatible types in assignment of ‘const char [27]’ to ‘char [1024]’ 
     instance.text = "HELLO WORLD, FIRST MESSAGE"; 

私はこのエラーを理解していません最大メッセージサイズは1024バイトです。

は、私は他の同様の質問を見てきましたが、私は私のミスが

ヘルプは高く評価された構造を作成していた時のか理解できなかった

+2

あなたがのstd ::文字列を使用して、この問題を持っていないでしょう。 – stark

答えて

0

他にも記載されているとおり、std::stringを使用してください。あなたが本当に配列に文字列リテラルを割り当てたい場合しかし、あなたは以下のように行うことができます。

struct message_text{ 
     char text[1024]; 
     template <int N> 
     void assignText(const char (&other)[N]) { 
      static_assert(N < 1024, "String contains more than 1024 chars"); 
      for(int i =0 ; i < N ; ++i) { 
       text[i] = other[i]; 
      } 
     } 
}; 

注:

  1. 上記は、文字列リテラルまたはchar配列から割り当てるために動作します。ヌル終了文字列はサポートされていません。
  2. assignTextはテンプレートなので、一意のNで使用するたびに関数を生成します。これによりバイナリサイズが増加する可能性があります。
  3. assignTextはテンプレートなので、ヘッダーまたは同じソースファイル内で定義する必要があります。

コンパイラエクスプローラ:https://godbolt.org/g/1oLcAq

1

char配列がそのように動作しません - あなたはそれらを割り当てることはできませんたとえば、intと同じ方法です(ただし、配列の初期化時に行うこともできます)。そのリテラルをchar配列にコピーする場合は、strncpyを使用します。

それよりも、C++とタグ付けされているので、標準stringクラスを使用してください。

+0

Askerが行ったことを行って文字配列を初期化できますが、割り当てることはできません。 – user4581301

+2

'strncpy'を使用することはほとんどありません。名前にもかかわらず、より安全な' strcpy'ではありません。 [私はこれについて書いた。](http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html)。 –

+0

そして次の質問を予期するには - 配列の代わりにstd :: vectorを使う – pm100