書いてしまっていますから、あとから配列の型が変わると、修正を忘れる恐れがあります。そこでさらに工夫して、次のようにします。使っておくということです。この方法が取れるのは、生の配列には要素以外に余計なものがないからです。同じことをすると正しい結果が得られません。lengthメンバ関数を使いましょう。これはさらに次のように関数形式マクロ(「プリプロセス」のページを参照)にしておくと、使いまわしが効くようになります。テンプレートを使う方法もあります。以前でも同じ関数を実装できます。コンパイルできるプログラムは次のようになります。使うべきといえますが、効率面などの都合で、生の配列を使って表現する選択肢もあります。文字列は文字型の配列に過ぎず、配列と同じ特性を持ちますし、同じように操作できますが、メモリ上での表現に関して特殊な部分があります。バイトが1つ置かれます。置かれるため、5文字分の領域を必要とします。文字列の変数は、次のようにさまざまな方法で定義できます。1要素ずつ別個に初期化子を記述しており、要素が文字型でない場合と同じ構文です。ルールも同じで、「配列を定義する」の項で説明したように、要素数の指定に対して、初期化子のほうが多い場合はコンパイルエラーになります。内側の初期化子が少ないとき、残りの要素は値初期化されます。あるため、うまく末尾に終端文字が入った状態になります。以下はすべて同じ結果になります。内側の初期化子が同数である場合、終端文字がない不完全な文字列ができてしまうことに注意が必要です。ように、文字列リテラルを初期化子にする方法がよく使われます。文字列リテラル自身が、char型の配列であり、終端文字も自動的に付加されています。char型の配列です。要素数も指定しています。要素数の指定が十分に大きい場合は、メモリがその分消費されることになりますが、エラーになることはありません。要素数が小さい場合はコンパイルエラーです4。自動ストレージ期間を持つ場合は未初期化になります。埋められた状態になります。(std::strlen関数)文字列も配列なので、「配列の要素数を取得する」の項で取り上げた方法で要素数を取得できます。この場合の結果には、終端文字の分が含まれます。lengthメンバ関数が返す値(長さ)は、終端文字を含まないので、この違いには注意が必要です。"\n";}実行結果:1413生の配列による文字列で長さを求めるには、std::strlen関数5を使う方法があります。char型の配列の長さを返します。インクルードが必要です。std::strlen関数が長さを調べる仕組みは、先頭から1要素ずつカウントしていくことを、終端文字が見つかるまで繰り返すというものです。そのため、終端文字が適切に存在しなければいけません。2バイト以上の大きさが必要な文字が含まれていると、返される結果は見た目どおりの文字数ではないことにも注意してください。長さはエンコーディング形式によって異なります。配列に対して、代入演算子を使って代入することできません。std::copy_n関数があります。コピーする要素の範囲をイテレータを使って指定します。第1・2引数でコピー元の範囲をイテレータで指定し、第3引数でコピー先(先頭)を指定します。戻り値は、コピー先の側にコピーされてきた最後の要素の1つ後ろを指すイテレータです。インクルードが必要です。コピー元の範囲と、コピー先になる範囲に重なりがないように注意してください。コピー先に十分な領域があることも必要です。警告が出るかもしれません。Studio編>「C4996警告」のページを参考にして対応してください。std::copy関数の亜種です。コピー元の範囲を指定する代わりに、先頭を指すイテレータと要素数を指定する点に違いがあります。第1引数でコピー元の先頭をイテレータで指定し、第2引数にコピーする要素数を指定します。第3引数はコピー先(先頭)です。戻り値は、コピー先の側にコピーされてきた最後の要素の1つ後ろを指すイテレータです。インクルードが必要です。コピー元の範囲と、コピー先になる範囲に重なりがないように注意してください。コピー先に十分な領域があることも必要です。警告が出るかもしれません。Studio編>「C4996警告」のページを参考にして対応してください。0)を入れたいと思うことがあります。std::copy_n関数は使いづらいです。std::fill_n関数が利用できます。2つのイテレータで指定した範囲の要素に、指定した値を入れていく関数です。第1・2引数で範囲をイテレータで指定し、第3引数で各要素に入れる値を指定します。インクルードが必要です。指定範囲が配列の範囲外に出ないように注意が必要です。std::fill関数の亜種です。範囲を指定する代わりに、先頭を指すイテレータと要素数を指定する点に違いがあります。第1引数で対象範囲の先頭をイテレータで指定し、第2引数で要素数を指定します。第3引数で各要素に入れる値を指定します。ときは、第1引数をそのまま返す)。インクルードが必要です。配列の範囲外に出ないように注意が必要です。(std::equal関数)配列は、型や要素数が一致していたとしても、等価演算子や関係演算子による比較が想定どおりに機能しません。falseこうしたコードはコンパイルは通りますが、配列の要素どうしを比較しているわけではありません。うまく機能しない理由は、(一部例外はあるが)式の中で配列が現れたとき、ポインタ型に暗黙的に変換されているためです。比較していることになります。別の配列であって、メモリ上でも別々の場所に配置されていますから、メモリアドレスが一致することはあり得ません。sizeof演算子があります。ポインタ型に変換されていないことを意味しています。変換されているなら、ポインタ型の大きさになってしまうはずです。望んでいる動作は、要素同士を1つ1つ比較した結果がどうであるかでしょう。std::equal関数は、2つの範囲にある値の一致を調べます。第1、2引数で1つ目の範囲をイテレータを使って指定します。第3、4引数で、もう1つの範囲の先頭をイテレータを使って指定します。2つの範囲の要素数が異なれば一致しないことになります。インクルードが必要です。なく、char型の配列で表される文字列)の場合には、std::strcmp関数11を使う方法もあります。こちらは、文字列の末尾に終端文字があることを前提にしており、末尾を指示する必要がなく簡潔です。std::strcmp関数には、比較する2つの文字列を渡します。0、つまり「偽」であることに注意してください。ように判定してはいけません。インクルードが必要です。「配列の比較」の項で説明したように、配列はポインタ型に変換されています。このルールの影響を大きく受けるのが、関数の引数と戻り値です。配列を受け取る?詳しい話は次のページであらためて取り上げることにしますが、結論としては、生の配列を渡したり、生の配列を受け取ったりすることはできません。使うのが一番簡単な解決策です。生の配列を混在する必要に迫られる場面もあるかもしれませんが、基本的に両者はまったく別のものであって、お互いにやり取りを行うことは簡単ではありません。両者を比較したり、一方を他方に代入したりすることはできません。std::copy関数などが使えるので、そうして解決できます。std::copy_n関数を使うときには、コピー先に十分な領域があるかどうかに注意しなければなりません。互いに変換することも一つの手ですが、オブジェクトの生成と要素のコピーが必要なので、コストは大きくなります。要素を使って、生の配列を定義することはできません。生の配列を定義してから、std::copy関数などでコピーするしかありません。要素数の指定に困ります。char型の配列については、ある程度、相互で運用しやすくなっています。char型の配列は比較できます。代入することができ、それまでの長さよりも長くなるとしても、正常に動作します。いずれにしても、char型の配列には終端文字が存在していなければなりません。実際には、char型の配列はポインタに変換されています。char型のポインタとの間でうまくやり取りできているということになります。char型の配列への代入はできません。これは配列に配列を代入できなかったことと同じなので、std::copy関数などを使って解決します。十分な大きさがあることをよく確認してください。使った構文による初期化(集成体初期化)が可能である配列の要素には添字演算子を使ってアクセスする一部例外はあるが、式の中に現れる配列は暗黙的にポインタに変換されるそのため配列どうしの比較は、実際にはメモリアドレスの比較になり、想定どおりの結果にならない要素どうしを比較するには、std::equal関数が利用できる同じ理由で、関数に配列を渡したり、関数から配列を返したりはできない配列への代入は行えない。char型の配列を代入できる(実際はポインタに変換されている)が、逆は行えないので、std::copy関数などで代用する新C++編の【本編】の各ページには、末尾に練習問題があります。ページ内で学んだ知識を確認する簡単な問題から、これまでに学んだ知識を組み合わせなければならない問題、あるいは更なる自力での調査や模索が必要になるような高難易度な問題をいくつか掲載しています。当サイトの参考書籍一覧ページ。当サイトの参考Webサイト集。★は、すべての方が取り組める入門レベルの問題です。★★は、自力でプログラミングができるようなるために、入門者の方であっても取り組んでほしい問題です。★★★は、本格的にプログラマーを目指す人のための問題です。(応用★★)int型の配列に、ある指定した値を持つ要素が含まれているかどうかを調べるプログラムを以下の3通りの方法で作成してください。