こんにちは､ そしてお帰りなさい｡ 今回は､ 前回の課題であった「文字配列の理解」の解決策をデモで紹介したいと思います｡
主に､ 文字列の長さを求める関数､ 文字列を連結する関数､
2つの文字列が等しいかどうかをチェックする関数を書きます｡
ということで､ プロジェクトを作成します｡ 文字列を理解するという名目で
そして､ まず最初に行うのは､ この長さ関数を実装することです｡
トップに3つの関数宣言を作成することにします｡
最初のものは文字列長と名付けることにします｡
ネーミングはキャメルケースを使うことにしています｡
これは､ 定数文字列を取るだけです｡
では､ なぜ文字列だとわかるかというと､ 文字配列だからで､ その後にセミコロンを入れることになります｡
それは最初に作るものだから､
とりあえずそこで止めておこう｡
これからこの関数を作って､ 下の方で定義していきますので､ constというキーワードを理解しておいてください｡
Constは､ 変更できない､ 修正できない文字列という意味です｡
ここで const を使っているのは､
関数内部で文字列を変更するのではなく､ 基本的に文字列をパースして長さを整数で返したいからです｡
この関数は､ 配列を調べるだけなので､ 実はとても簡単に実装することができます｡
だから､ 実際にインカウントはゼロに等しいと言える｡
これはローカル変数です｡
この関数の中でのみ使用可能です｡
なぜsize of 演算子を使わないのかというと､ size of 演算子は文字列のサイズを教えてくれるのであって､
その文字列の中に何文字入っているかは教えてくれないからです｡
しかし､ 必要なのはループを作り､ ヌル型ターミネーターにぶつかるまで配列を通過させることです｡
そこで､ 私たちの文字列を見てみましょう｡ 文字列のカウントとヌルターミネータが等しくない場合､
ヌルターミネータはバックスラッシュゼロという1文字で表現されます｡
また､ 文字に対して比較するため､ not equals演算子を使うことができます｡
そして､ このwhile文の本体には､ プラス・プラス・カウントという､ カウントを増加させるだけのものが1つだけあります｡
そして､ それを返したいときは､ return countと言えばいいだけです｡
それが､ 文字列長機能のすべてです｡ 文字列が配列の中にあり､
文字列の末尾がヌルであるため､
かなり簡単です｡
これをテストするために､ mainメソッドを開始して､ いくつかの定数文字､
例えばword one Jasonを作成します｡
つまり､ これがcで文字配列を作る方法です｡
そこに定数はなくてもいいのですが､ これは修正されていないんです｡
char キーワード､ char データ型､ 識別子､ そして括弧を使用します｡
cコンパイラは自動的にヌルターミネータを付加するので､
括弧の中でサイズを指定しない方が良い｡
そして､ 代入演算子の後に､
文字列リテラルを二重引用符で囲んで入力します｡
ここで2つほど作成し､ 動作の確認をします｡
文字列はパーセント記号で簡単に表示できるが､ ここで本当に表示したいのは長さである｡
そこで､
パーセントdを使用することにしました｡
そこで､ この3つの文字列､ パーセントdのリンクをプリントアウトし､
間にスペースを入れて､ 改行を加えるだけにしておきます｡
そして､ これは各単語の文字列長関数を呼び出すだけで､
ここはとてもシンプルです｡
では､ 実際にビルドしてテストし､ これがうまくいくかどうか見てみましょう｡
出力としては､ ジェイソンの長さが5､
オーケーの長さが2､ そして何とかの長さが約8と表示されるはずです｡
そこで､ ここでは5､ 2､ 8とし､ これは正しいように見える｡
というわけで､ 文字列の長さはこうやって書けばいいんですね｡ 続いて､ 連結関数について説明します｡
連結関数は､ 3つの文字列を2つの定数として受け取るだけです｡
これでは何も返せませんしね｡ 結果の文字列を最初のパラメータに入れるだけです｡
そこで､ concatと呼ぶことにします｡ これから結果が出ますが､
2つの文字列があります｡ 2つの文字列を連結したいものと､
1つの文字列だけを持ちたいものがあります｡
そこで､ 文字列1､ 文字列2と名付けることにする｡
そして､ そこに行く｡ そして､ これが関数宣言です｡
だから､ 定義される前ならどこでも使えるんです｡
こちらもアレイを通す必要がありそうです｡ 2つの配列を通過し､ それぞれを通過するたびに､
結果の文字列に追加していくだけです｡
この関数の中でのみ使用できるローカル変数､ int I と j を作成するつもりです｡
そして､ forループを使って配列内を移動していきます｡
Iは0に等しいと言うことにしています｡
Str サブ 1 またはサブ I がヌル終端器と等しくない場合は､
I をインクリメントします｡
私たちはforループの構文に慣れ親しんでおり､
ループの識別子を最初に持っています｡
最初のセミコロンの前に､ 2番目のセミコロンの前に飛び出す条件､
そして無限ループにならないようにループ制御変数を修正します｡
ここで行うのは､ 結果を保存することで､
sub Iはstr one sub Iに等しい｡
これらは文字なので､ ここで等号の割り当てを使用しても全く問題ないことを忘れないでください｡
文字配列の場合､ 配列に配列を代入することができないので､
このようなことはできません｡
strのコピーを使わなければならないでしょう｡
つまり､ 最初の文字列をコピーしているわけです｡
2番目の文字列をresultsに連結したいので､
非常によく似たことをしますが､ 2番目の配列を調べてresultの正しい場所に置くことを確認します｡
そこで､ 次のようなことをするのです｡ jから0へ､ strからjはヌル終端記号++jと等しくならない｡
そして､ resultは､ Iにjを足したものであることがわかると思いますが､ つまり､ 私が終わらせたものは何でもいいのです｡
10文字追加した場合､ ゼロベースなのでその10文字目から始まり､
10＋0､ 10＋1というようにjが追加されるだけです｡
そして､ それだけです｡
最後にもうひとつ､ 本当に重要なことですが､ ヌル文字ターミネータを追加する必要があります｡
つまり､ result, I plus jと言い､ さらに1文字､
null terminatorを追加したい｡ これはシングルクォートの中のバックスラッシュゼロである｡
そして､ それが私たちの機能です｡
str 1からstr 2にコピーするだけなので､
この関数から何かを返す必要はない｡
では､ これをテストしてみましょう｡
これに関して期待するのは､ 2､ 3人のキャラクターでテストすることです｡
今ある文字を使い､ 2つほど連結していくだけです｡
そこで､ もう1つ結果を作成する必要があります｡
だから､
クリアするために結果だけ言うことにします｡
ここでは､ その最初の1枚について､ サイズを指定する必要があるということにしています｡
というわけで､ サイズ50を指定するだけです｡ 制限することになりました｡
だから､ これらの定数文字が機能するはずです｡
さて､ これからprintfと言って､
文字列を出力してみましょう｡
つまり､ パーセントsと言い､ コンカットと名付ける｡
結果を渡して､
ワード1､ ワード2とする｡
これは出力として表示されるべきもので､
数行の新しい行に置くことを確認します｡
これは､ 出力ジェイソン大丈夫と表示されるはずです｡ つまりconcatは実際にはデータを返さないので､
printfに直接入れられないんです｡
呼び出して､ 結果を表示することです｡
そこで､ concatを呼び出す｡
すべてを結果に落とし込み､ その結果を表示する｡
このように､ もう一度実行すると､ Jason
OKと表示されるはずです｡
3番目に実装したいのは､
2つの文字列が等しいかどうかをチェックする比較関数です｡
この関数はブール値を返すべきである｡
そこで､ 定番のboolを入れたいと思います｡
だから､ ブーリアン値やtrueとfalseの値を使うことができるのです｡
そして､ これは実際には等しい文字列として定義されることになります｡
これは､ 定数文字配列 s1 と､ 2つの文字列が等しいかどうかをチェックするためのもう1つの文字配列を取るつもりです｡
正しいヘッダーを含めたことを確認するために､ これをビルドしてみます｡
これでboolキーワードが使えるようになり､ true
falseも使えるようになりました｡
では､ このイコール文字列を実装してみましょう｡
これは､ 配列を通過して各文字をチェックするだけなので､
ほとんど同じです｡
そこで､ いくつかのローカル変数
I equals 0 を作成して､ ループを 0 に初期化します｡
ブーリアン演算では､ 両者が等しいかどうかを示すだけで､
is equalsのような値を返すことになります｡ そして､ 実際にこれをfalseに初期化することができます｡
まず最初にやりたいことは､ カウントを取ることです｡
どちらもどのくらいの大きさなのか､
確認したい｡ というのも､ サイズを確認するためにはカウントが必要で､
基本的にはヌル文字が終了していないかどうかをチェックするためです｡
そこで､ 渡す文字列は同じ大きさであると仮定することにする｡
そこで､ 簡単なwhileループを書けばいいのです｡ if文も書くことができる｡
論理演算子を使った比較は､ すべてwhileループに組み込んだようなものです｡
論理演算子を使う必要はない｡ if文を使って､ 2つ目の文字列の全体を調べればいいんです｡
しかし､ ここで私が行ったのは､ s1 sub Iがs2
sub Iと等しい間､ それらはヌルターミネーターと等しくない､
と言ったのです｡
なぜなら､ もし両者がNullターミネーターに等しければ､
どちらかがNullターミネーターである場合に飛び出したいからです｡
だから､ 今はプラス・プラス・アイと言うんだ｡ そして､ 最後にしなければならないのは､ それらがヌル・ターミネーターであるかどうかをチェックすることだけです｡
そして､
もしそうであれば､ 正しいデータを返すようにブーリアン変数を設定すればよいのです｡
つまり､ s1 sub I が null terminator
と等しく､ s2 sub が null terminator
と等しい場合､ ブーリアン変数に equals を設定し､
それを返すということです｡
そして､ リターンはイコールと言うだけです｡
そして､ これをテストするためには､ 良い文字列と悪い文字列をテストする必要があります｡
では､ イコールストリングスということにしておきましょう｡
ブール値の整数値だけを出力するつもりなので､ パーセントdと､
ここでイコール文字列と言うことにして､ これは何かを返すので､ これをプリント式のイコール文字列に入れればいいのです｡
等しい文字列を確認してから､
コンマJasonを渡します｡
そして､ 今度はジェイソンと呼ぶことにしよう｡
そして､ 最初のものは1を､ 2番目は0を返すようにし､
1は真､ 0は偽を表します｡
これを実行すると､ 1と0が表示されます｡
1はtrue､
0はfalseです｡ ただし､ 改行がないので読みにくいです｡ そこで､ 改行を追加して､ もう一度だけお見せしましょう｡
今､ 私たちは1つのゼロ､ 真偽を確認しています｡
ジェイソン・ジェイソンは､ お互いに平等です｡
ジェイソンのジェイソンは平等ではありません｡
このように､ 文字配列と文字列の表現方法について基本的に学ぶことができる､
簡単な関数を紹介しました｡
ありがとうございます｡ ソースファイルも提供しますので､ より詳しく見てみてください｡
これがあなたの課題の解決に役立つことを願っています｡