こんにちは､ そしてようこそ｡ 本講演では､ 前回の課題に対する解決策のデモをご紹介します｡
str length関数を使って文字列の文字を反転させる方法､
str compareとstr copyを使って文字列をソートする方法､ バブルアルゴリズムを使う方法について説明します｡
コードブロックを持ち出そう｡
そして､ 私はこのために､ 一つのプログラムを作ろうと思っています｡ 課題の中で､ 2つのプログラムを作ると書きました｡
しかし､ 簡単のため､ またデモのため､ 1つだけ作成することにします｡
プロジェクトを作成し､
string functionsまたはそのバリエーションと名付けることにします｡
ここでは､ 一般的な文字列関数の例としましょう｡
では､ 逆から見てみましょう｡ リバースは独自の関数にすることもできますし､
mainに入れることもできます｡ メインに置こうと思っていました｡
まず最初に､ 正しいヘッダーファイルをインクルードして､
文字列関数を使用できるようにします｡
h.
ここには､ すべての素晴らしい文字列関数が含まれています｡
では､ 文字配列を作成します｡ 100サイズにします｡
あくまで任意ですが､ 100以上のものを格納することができなくなるだけです｡
パースに役立つローカル変数をいくつか作成するつもりです｡
そして､
私がしたいことは､ ユーザーに最初に何らかの出力を表示することです｡
だから､ 2､ 3行の改行､ 個々の､
文字列の個々の文字を印刷する､
逆順と言うことです｡
これは､ ユーザーに何が起こっているかを伝え､ さらに､ よりわかりやすくするために､
ちょうどそのようなものをプリントアウトして､
読みやすくするものです｡
文字列を入力すると言うことです｡ 文字列で読んでみる｡
そして､ その文字列を格納するんです｡
そこで､ scanfと言い､
sを提示し､ strと言うことにしています｡
アンパサンドを通さずに読み込めるし｡
それから､ 文字列の長さを求めます｡ それをlローカル変数に入れるんです｡
つまり､ 文字列を渡してstr lengthと言えば､ その文字列が何文字あるのかを返してくれる｡
とても､ 簡単です｡
そして､ 文字が逆順であることを伝えるために､ 何かをプリントアウトするのです｡
だから､ 逆rの文字列の文字がバックスラッシュn｡
それから､ 配列の長さに応じて､ それを反転させる小さなループを書きます｡
だから､ for Iイコールlと言うことにしている｡
だから､ 実際の文字列配列では逆戻りすることになるんだ｡
最後から順番に進んでいくんです｡
そして､ Iが0以上であり､ Iマイナスマイナスであるとする｡
この方法では､
ヌル文字で終わる文字を見る必要がないことにお気づきでしょうか｡
あとは､ 文字に遭遇するたびにプリントアウトしていくだけです｡
文字をプリントアウトして見るには､ パーセントcをするだけです｡
そして､ ただそうしてストサブアイと言うのです｡
そして､ 基本的にはそれだけです｡
そして､ 新しい行をプリントアウトするんだ｡
そして実は､ 最後にダッシュだけたくさんプリントアウトしておきます｡
長さを揃えるのは難しくないはずです｡
それと､ 改行を忘れていたので､ それを直しましょう｡
つまり､ ここでは､ 文字列の個々の文字を反転して表示するか､ 文字列を入力するように書かれています｡
さてscanfですが､ 読み込むだけです｡ だから､ 私がジェイソン空間フェデンに入れば
スキャンフはジェイソンと宇宙までしか読めません｡
全体を読むならf get sのような別の関数を使いたいところです｡
つまり､ これはジェイソンのプリントアウトを逆にしてノザシを行うだけなのです｡
文字列逆引きの文字はノザイです｡
それはとてもシンプルなことで､ それほど複雑な機能や実装ではありません｡
では､ 文字列のソートで試してみましょう｡
それで､ 今度は私があることをしようと思っているんです｡ そして､ 私はメインでやるつもりです......今だけだと思いますが｡
本来ならこれらを実際の関数に入れるべきなのですが､ この講義では関数のデモではなく､
文字列のデモをしています｡
では､ さらに必要なローカル変数をいくつか作ってみましょう｡
主に､ 名前を作成することになります｡
そして今回は､ 文字列の配列を作成することになりました｡
文字列の配列を作成し､ f get s を使ってみます｡
文字列の配列を作成してみる｡ つまり､ これは2次元の配列のように見えます｡
つまり､ サイズ50の文字列を25個作成するわけです｡
次に､ 25個だけのものをもう一つ作り､ これには各文字列を入れます｡
そして､ さらに2つの変数を追加します｡
nとjをつける｡
それで､ リバースした後､ プリントアウトするんです｡
バブルソートで配列の文字列をソートしていることを伝えるメッセージもあります｡
バブルソートを説明するつもりはない｡ なぜなら､ これもまた､ 私たちがやっていることとは関係のないアルゴリズムに過ぎないからです｡
本当に､ ただの仕分けです｡
基本的に交換するだけなので､ 最も簡単な種類の一つです｡
しかし､ 私たちがやりたいのは､ まず､ 彼らが入力する文字列の数を把握することです｡ そこで､ printf input
number of stringと言い､
scanfと言うことにします｡
Scanfは単なる数字なので､ ここで使うことができます｡
ここではパーセントdとし､ それをローカル変数nに格納することにします｡
ここでも､ 偉そうなことを言っていますが､
何かを実証しているのです｡ itはit'sなので､ アンパサンドを通さなければならない｡
そして､ 文字列を入力してもらう｡
ここでは､ 入力文字列1
2または3の後に改行すると言うことです｡
これは､ どのような番号を入力しなければならないかだけである｡
ストリングス1､ ストリングス2､ ストリングス3｡
そして､ 実際にループを組んで､ 入力を取得します｡
ここでは､ Iが0に等しい場合､ Iは入力したい文字列の数n未満､
Iプラスまたはプラス・プラスIとすることにします｡
ここでは実際に文字列を読み込むのですが､ 別の方法で読み込むことにします｡ f get sを使って､
スペースがある文字列を入力できるようにしようと考えていました｡
でも､ 必要なかったと思うんです｡
スキャンfを行い､
スキャンfを名前配列に読み込みます｡
名前と､ これは本来25文字の文字列であることを思い出してください｡
50文字25語のこと｡
だから､ 入力できる最大文字数は25文字｡
そこで､ これを名前の配列に格納することにします｡
だから､ scanfと言うことにしているのです｡
文字列を読み込んで､ name sub Iに入れるんだ｡
それで､ 配列を格納したのですが､ 25個までしか格納できません｡
これでループが終わったので､ あとはバブルソートを書くだけです｡
バブルソートは､ 説明するつもりはありませんが､ インナーループを持つ非常にシンプルなアルゴリズムであることだけはお伝えしておきます｡
つまり､ forループで､ Iは1に等しく､ すべての文字列を通過させるわけです｡
そして､ 内側のループで､ 0からすべての文字列をマイナス1まで移動させます｡
そして､ その最初の文字列と他のすべての文字列を比較するのです｡
そして､ 本来は泡で落とすものなのです｡ しかし､ ここで重要なのは､
strの比較関数である｡
strコピー関数でこのインデントを正しくするようにしよう､
これが本当に重要なことなんだ｡
どちらの4つも1つの文なので､ 最後の括弧がないことにお気づきでしょう｡
このifは､ if本体に何か書いてあっても､ これは1つの文に過ぎません｡
つまり､ 1つの単語を比較した後に､ 他のすべての単語と比較することになるのです｡
つまり､ str compare name sub j と name
sub j sub one の場合､ str compare
は2つの引数､ 2つの文字配列､ 文字ポインタを取ることになります｡
そして､ もしそれらが等しければ､ ゼロを返すことになるのです｡
もし第一パラメーターが第二パラメーターより小さければ､
0より小さい値を返すことになる｡
そして､ もし第一パラメーターが第二パラメーターより大きければ､
0より大きい1が返されます｡
つまり､ 最初の文字列が2番目の文字列よりも大きければ､ すべてを入れ替えようということです｡
そのために､ あのテンプレがあるわけです｡
Tempは実際には一時的な文字列を保存しています｡
そこで､ 仮の名前sub jを入れ､
名前sub jとj+1の名前を入れ替える｡
それがバブルソートの仕組みです｡ ここでも重要なのは､ str compareとstr copyです｡
そして､ 安全性を重視するならば､ strnのcompareを使いたいところです｡
そして､ strn 比較をすると｡ まあ､ 実際にはstrnの比較は､
prefixを比較する場合だけなので､ 気にする必要はないでしょう｡
strコピーについては､ 実際にはstrnコピーを使いたいところです｡
そして､ この3つ目のパラメータが重要なのです｡
つまり､ strnコピーでは､ tempのサイズから1を引いたものをコピーしないようにするだけで､
バッファオーバーフローが発生します｡
もしそれがキャラクタ・バッファでなければ､ ポインタであれば
str length を使うことになるでしょう｡
でも､ このサイズなら大丈夫でしょう｡
そしてまた､ これでバッファオーバーランをなくすことができます｡
ですから､ strn copyとoneを使うのが安全です｡
なぜなら､ 最後にヌルターミネーターが必要だからです｡
つまり､ ここでは､ strnのコピーのソース先だけである｡
名前サブjをtempにコピーしているのですが､ jプラス1の名前と名前サブjも同じようにコピーしています｡
そして最後に､
ネームサブjプラス1へのテンプレ｡ そして､ 実はこれらの変数は常にソースでなければならないので､
間違っているから更新しなければならない｡
だから､ ここでネームサブjを名乗る｡
そして最後は､ jプラス1､
jプラス1の名前になります｡
以上､ strnコピーとstrコンペア､ とても使いやすい関数でした｡
仕分けした後は､ プリントアウトするだけです｡
そこで､ ソート後に表示される文字列を改行して､ ループを経て､
配列内のすべての文字列を出力すると言うことにしたいのです｡
だから､ 4 Iイコール0と言うのです｡
Iがn以下なのは､ nがソートして入力した文字列の数を表しているからです｡
そして､ 文字列配列の文字列を調べていくだけです｡
そこで､ printf sの改行とsub
Iの名前を言いたいのです｡
つまり､ name sub I は実際にソートされた配列であり､ そのために name sub I という名前を付けているのです｡
それが各キャラクターの大きさを表しているので､ 2つ目がないにもかかわらず｡
50語中25語まで
では､ これがうまくいくかどうか見てみましょう｡
スペルを知らないので､ 2つほどメッセージをもらいました｡
そして､ これを実行すると まず､ リバース関数を実行し､ 同じプログラムに含まれていることを再度確認することができます｡
フェディンとかイドフとか言っておけばいい｡
並べ替えたい文字列の数を入力します｡ 5としましょう､
わかりやすいようにzzzとしましょう､ そんな感じです｡
そこで少し失敗してしまいましたが､ a b d f r z ということでソートされたようです｡
だから､ うまくいくのです｡ しかし､ 入力文字列のパーセントdのために､
私は1つのバグを持っています｡
nの文字列の数を入力して､ less than equalと言ってるんですが､
less thanと言えばいいんですね｡
では､ デモのためにもう一度実行してみますが､ ビルドする必要があります｡
変更した後のビルドも忘れずに｡
ここでも何でもいいから､ 文字列を数字にするんです｡
4つだけやってみよう｡
それで､ アルファベット順に並べて､ d e l z と言うので､ 良さそうです｡
ですから､ このコードを改良して､ すべてを関数に置き､ よりモジュール化することができます｡
しかし､
私がこの課題で伝えようとしているのは､ str compareの使い方､ strn copyの使い方､
str lengthの使い方です｡
また､ str cat､ strn cat､ that's the other
real common functionで遊んでみるとよいでしょう｡
検索にはstrstr, strcharを使うとよいでしょう｡ 文字チェックのためのis,
upper is, lowerや､ atoi nad atofの変換機能などは､
本当に素晴らしいものです｡
ありがとうございます｡ 参考になったでしょうか｡