9

char配列の初期化に続いていると仮定します。

char charArray[]={'h','e','l','l','o',' ','w','o','r','l','d'};

また、文字列リテラルの次の初期化もあります。

char stringLiteral[]="hello world";

最初の配列と2番目の文字列の内容の唯一の違いは、2番目の文字列の最後にヌル文字が含まれていることです。

char配列を初期化する場合、初期化テキストを2つの二重引用符で囲むことができるマクロなどがありますが、配列に余分なnull終了文字が含まれることはありませんか?

終了ヌル文字が必要ない場合は、最初に述べた初期化の構文を使用し、初期化テキストの各文字に2つの単一引用符を記述し、文字を区切るためにバーグルマークを記述する必要があることは私には意味がありません。

char配列が必要な場合は、文字列リテラルを使用すると結果が得られないという事実に加えて、文字列リテラルに依存する関数でそれを使用したくないことも明らかです。私の考慮に。

私はあなたの答えに感謝しています。

4

5 に答える 5

9

Cでは、次のように配列を宣言できます。これにより、終了をコピーせずに配列が初期化されます。'\0'

char c[3] = "foo";

しかし、C++では違法です。私はC++でそれを可能にするトリックを知りません。C++標準はさらに

理論的根拠:これらの終了していない配列が標準の文字列ルーチンによって操作される場合、大きな災害が発生する可能性があります。
元の機能への影響:意味的に明確に定義された機能の削除。
変換の難しさ:意味変換。'\ 0'で終わる文字列を含めるには、配列を1つ大きい要素として宣言する必要があります。
広く使用されている方法:めったにありません。このスタイルの配列初期化は、不十分なコーディングスタイルと見なされます。

于 2010-07-09T21:07:20.563 に答える
3

あなたがやりたいことをする方法はありません。配列を初期化する最初の方法では、文字ごとに個別の初期化子を指定します。これにより、「\0」を明示的に省略できます。2つ目は、文字列から文字配列を初期化することです。これは、C /C++では常にヌル文字で終了します。

編集:修正:'文字ポインタ'->'文字配列'

于 2010-07-09T20:55:25.273 に答える
1

litbには技術的に正しい答えがあります

意見としては、余分な「\0」の「無駄」と一緒に暮らすと言います。非常に多くのバグは、コードがnullの終了を予期している結果です(このアドバイスは、バッファ全体をゼロにすることを気にしないことについて、1、2日前に行った他のアドバイスに直接反するように見えるかもしれません。矛盾-私はまだバッファ内の文字列を終了するnullを提唱しました)。

処理しているデータ構造のセマンティクスが原因で「\0」ターミネータを実際に使用できない場合(たとえば、より大きなパック構造の一部である可能性がある場合)、いつでも自分で配列を初期化できます(これは私がコンパイラがあなたのためにしたかもしれないことよりも効率的であるべきだと思います):

#define MY_STRING_LITERAL "hello world"

char stringLiteral[sizeof(MY_STRING_LITERAL) - 1];

memcpy( stringLiteral, MY_STRING_LITERAL, sizeof(stringLiteral));
于 2010-07-09T23:54:26.733 に答える
0

基本的な答えは、char配列の大部分が文字列であるということです。Cでは、文字列はnullで終了します。C++はその規則を継承しました。そのnullが必要ない場合でも、ほとんどの場合、それをそのままにしておくだけで問題はありません。

マクロは、あなたが望むことをするのに十分強力ではありません。テンプレートは、コンパイル時の文字列処理がないことを除いて、そうなります。

通常、数値バイトと文字列リテラルを同じchar-arrayシーケンスに混在させたい場合は、文字列リテラルを使用しますが、。などの16進文字エスケープを使用します\xFF

于 2010-07-09T21:02:30.577 に答える
0

直接やりたいことではないのに、やりたいことをやる方法を見つけたかもしれませんが、同じ効果があると思います。
まず、次の2つのクラスについて考えます。

template <size_t size>
class Cont{
 public:
  char charArray[size];
};
template <size_t size>
class ArrayToUse{
 public:
  Cont<size> container;
  inline ArrayToUse(const Cont<size+1> & input):container(reinterpret_cast<const Cont<size> &>(input)){}
};

先に進む前に、ここに移動して、定数式のコンストラクターと初期化型を確認することをお勧めします
次に、次のコードを見てください。

const Cont<12> container={"hello world"};
ArrayToUse<11> temp(container);
char (&charArray)[11]=temp.container.charArray;

最後に、初期化テキストは2つの二重引用符の間に書き込まれます。

于 2010-07-11T10:19:06.523 に答える