1

私はよくこのようなことをしたいです:

unsigned char urlValid[66] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";

...また:

unsigned char listOfChar[4] = "abcd";

...つまり、文字列リテラルから文字配列を初期化し、そのリテラルのnullターミネータを無視します。それはとても便利です、そして私は次のようなことをしsizeof urlValidて正しい答えを得ることができます。

しかし、残念ながら、エラーが発生しますinitializer-string for array of chars is too long

次のいずれかの方法はありますか?

  • この特定の発生に対するエラーと警告をオフにします(つまり、char配列を初期化するときにnullターミネータの余地がない場合)
  • 利便性と読みやすさを維持しながら、それを改善しますか?
4

4 に答える 4

7

質問にCとC++の両方のタグを付けました。実際には、C言語ではこのエラーは発生しません。代わりに、終了ゼロは単に配列に含まれません。つまり、Cでは、希望どおりに機能します。

C ++では、実際にエラーが発生します。C ++では、おそらく終了ゼロに対応し、の結果から1を引くことを忘れないでsizeofください。

@Daniel Fischerがコメントで示唆しているように、定義を初期化から「切り離す」ことができることにも注意してください

char urlValid[66]; 
memcpy(urlValid, "ab...", sizeof urlValid);

したがって、C++でのC言語の動作を効果的にシミュレートします。

于 2013-01-17T20:07:37.947 に答える
1

C ++では、常にを使用する必要がありますstd::string。便利で、メモリリークなどが発生しにくいです。

ただし、サイズを指定せずに配列を初期化することはできます。

char urlValid[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";

コンパイラは文字列リテラルから正しいサイズを推測できるため、これは機能します。もう1つの利点は、リテラルが変更された場合にサイズを変更する必要がないことです。

編集:unsigned char文字列には使用しないでください。

于 2013-01-17T20:06:12.493 に答える
1

文字の実際の配列で初期化しますか?

char urlValid[] = {'a','b','c','d','e','f',...};
于 2013-01-17T20:13:21.490 に答える
-1

2つの簡単な解決策があります。

  1. 次のように、配列に要素を追加することができます。

    unsigned char urlValid[67] = 
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
    
  2. または、配列のサイズをすべて一緒に省略します。

    unsigned char urlValid[] =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~";
    
于 2013-01-17T20:11:14.757 に答える