こんにちは､ そしてお帰りなさい｡
引き続き､ 標準cライブラリのいくつかの関数について説明したいと思います｡
これらは､ すでに授業で行った関数の多くですが､ 覚えておいてほしいことがあります｡
このように､ C言語標準ライブラリの重要な関数は､
このコースで学習したすべての例題とすべての内容ですでに扱ったものがたくさんあります｡
文字列の関数については､ いろいろと話をしました｡
そして､ その中にはとても使いやすいものもあれば､ これからたくさん使うものもあるので､
これらを使いこなしておくといいでしょう｡
これらの関数を使用するには､ ヘッダーファイルの文字列をインクルードする必要があります｡
h､ 全ては文字列で定義されています｡ h.
スト猫の話をしました｡
Str catは2つの文字列を連結し､ それが取る2つのパラメータ､ 2つの文字ポインタを連結する｡
そして､ もう一方の文字ポインタを連結したものを返します｡
そこで､ 最終的な文字列の末尾にヌル文字を置くと､
この関数はs1を返す｡
Str char 文字を含む文字列を検索する｡
これによって､ キャラクタースターも返されます｡
検索するのに便利です｡
ひもじい思いをしている猫とは､ かなり話が合いました｡
Str compareは､ 2つの文字列を比較するものです｡
これが標準的なやり方なんですね｡
2つのポインタを受け取り, 整数を返す｡
基本的に0を返せば2つの文字列が等しくなるような例もありました｡
より大きいか小さいかを返すと､ もし0より大きくなったら､
それはs1が通常アルファベットの大きさでは大きいことを意味します｡
つまり､ aを含む文字列を渡して､ 2番目の文字列がbだった場合､
aはbより小さいので0より大きい値を返すか､ 0より小さい値を返します｡
第1パラメータにb､ 第2パラメータにcを渡した場合､ bまたはcで始まる何らかの文字列があれば､
0より大きい値を返します｡
だから､ その戻り値を理解する必要があるんだ｡
それが､ 大切なstrの比較です｡
Strのコピーです｡
このように､ 文字列を別の文字列に代入することができます｡
文字列､ ポインタ､ 文字配列は､ 代入演算子を使って直接文字列を代入することはできないことを覚えておいてください｡
整数や浮動小数点では､ 等号演算子だけでよい｡
弦楽器ではできないこと
そのため､ ポインタや文字ポインタ､ 文字配列に文字列を代入する場合は､ str copyを使用する必要があります｡
二重引用符で囲まれた文字配列リテラル文字列定数を初期化することができます｡
しかし､ その後､ 初期化した後に変更したい場合は､
str copyを使う必要があります｡
弦の長さ｡
文字列の長さを得るためのもう一つの重要な関数です｡
これは, 長さを表す整数であるサイズtを返す｡
これらの文字列関数はすべて､ ポインタまたは文字配列をパラメータとして受け取ります｡
だから､ その仕組みも理解する必要がある｡
その他の文字列関数 strncat｡
バッファオーバーフローが発生しないので､ 代わりに末尾を追加するすべての関数は､
少し安全であることを覚えておいてください｡
そこで､ strncatでは第3パラメータを追加し､ 多くのパラメータをコピーまたは連結することを意味します｡
通常､ 3番目のパラメータは､ 1番目のパラメータのサイズになります｡
これらの関数は､ バッファオーバーフローに対して安全であるため､
他の文字列関数よりも利用されるべきです｡
Strnを比較する｡
ここでも､ s1とs2のある文字数を比較することになります｡
Strnコピー, ここで3番目のパラメータendは, おそらくs1のstr lengthかsizeだろう｡
なぜなら､ s2とs1をコピーすることになりますが､ s1が保持または保存できる以上のバイトをコピーしたくないからです｡
Str charです｡
ここで､ ある文字が最後に現れるかどうかを文字列で検索することができます｡
これはstr charと非常によく似ていることにお気づきでしょうか､ ここに余分なrがあります｡
つまり､ 最初の出現回数を返す代わりに､ これは最後の出現回数を返しますが､
他のものと同じように使用しました｡
ストスト
これは､ 文字列を検索することになります｡
つまり､ これは文字列の中の部分文字列を探そうとする検索機能なのです｡
ここでも2文字のポインターを取る｡
ストロク
これは､ データの解析に役立つ重要な機能でした｡
Strtokは第2引数にデリミタをとり､ 文字列の中の任意の場所にデリミタ文字を探します｡
そのため､ s2にはスペースや改行といったものを使うことが多いようです｡
文字列をいくつかの異なるトークンに分割します｡
ここでも､ 普通にデータをパースしたいときに使う｡
毎回､ 与えられた文字列の中から次のtokを探す場合､
nullになるまで何度もstrtokを呼び出さなければならない｡
また､ 重要なキャラクターファンクションもありました｡
すべての文字関数は ctype で定義されています｡ h.
使用した文字関数は､ 英数字なのか空白なのか､
制御文字なのか数字なのかをチェックする関数で､
そこにはさまざまな関数がありました｡
だから､ ctypeを覚えておいてください｡ hは､ これらの異なる文字が実際に何であるかをチェックすることができます｡
また､ ctypeにはいくつかの変換関数がありました｡ h､ 主に私たち2人のアッパーです｡
Two lowerは文字を取り､ その文字に相当する小文字を表示します｡
小文字を大文字に変換する課題があったのを覚えていますか？
その課題では､ 実際にASCIIテーブルに追加したのですが､ 文字に2つのアッパーを呼び出すことができました｡
ctypeさえ入れれば､ 文字の周りに2つ設定することができました｡
hとすると､ 小文字が大文字に変換されます｡
IO機能､ インプットとアウトプットをたくさん持っていました｡
ファイルの読み書きに集中していましたが､ キーボードからの入力を読んだり､
コンソールやスクリーンにデータを出力したりもしました｡
だから､ 最も一般的なIO関数を使うために､ それはすべてスタンダリオにあります｡
h ヘッダーファイル｡
このファイルには､ さまざまなIO関数の宣言と､
ファイルの終わり､ 標準出力と標準エラーにおけるヌル標準のような定数の定義があります｡
それらはすべて一定の値です｡
また､ ファイル構造ファイルの定数もあります｡
Fcloseは､ ストリームを閉じるために使用した関数です｡
ファイルポインタで指定されたファイルをクローズする｡
また､ クローズが成功した場合は0を､ そうでない場合はeofを返します｡
Feofは､ 明示的には使っていませんが､ ファイルの終端かどうかをチェックする関数で､
定数と比較するのではなく､ feofでチェックすることができます｡
Fflushです｡
内部バッファの全データをフラッシュする関数です｡
やり直したいときに必要な場合もありますが､ 基本的にはバッファの中のものを取り除くだけです｡
また､ fgetcもあります｡
これは､ 個々の文字を読み込むもので､ ファイルポインタを取ります｡
fgetの位置があります｡
これはポジション機能の一部です｡
ファイルポインタに関連付けられたファイルの現在のファイル位置を取得し､
標準ioで定義されているf位置型に格納します｡
hも同様です｡
私たちのフェッツがありました｡
これは文字列で読んでいた｡
非常に良い､ 指示されたファイルから文字を読み込むが､
文字数が多い｡
Fopenは､ ファイルポインタを使用して､ 特定のモード（読み込み､ 書き込み､
追記）でファイルを開きます｡
Fprintfはデータとフォーマットされた出力を書き込みます｡ これはprintf関数と似ていて､
ポインターで指定された引数を受け取り､ フォーマットされたデータを使って書き込みます｡
だから､ 整数､ 倍数を書式指定子を使って書き､ さらに書きたい変数を書くことができるのです｡
また､ ファイルに文字を書き込むfputcもありました｡
Fputs は文字列をファイルに書き込みます｡
バッファとファイルポインタが必要で､ 書きたいものと書きたいファイルを指定します｡
Fscanfはファイルからデータを読み込みます｡
これは入力を取り込み､ scanfが書式指定子や変数を取り込むのと同じ種類の書式を使用することになります｡
しかし､ これはスペースで区切られたデータを読み込むのにいい｡
fscanfを使えば､ 型を指定できるので､ ints､ doubles､
特定のデータ型に直接読み込むことができます｡
Fseekは､ ファイルのどこを指しているのか､ 位置を移動させるんだ｡
だから､ ファイルの最初や最後から始める必要はないのです｡
ファイルの途中まで直接移動することができます｡
一旦その位置を探すと､ 次の読み出しや書き込みは､ その位置を使用して書き込みや読み出しを行います｡
Fsetの位置はfseekと同様です｡
ファイルポインタに関連付けられたファイル内の現在のファイル位置を
f position, fpos が指す値に設定する｡
また､ ftellもありました｡
Ftellは､ ファイルポインタに基づいて､ 先頭から何バイトのところにいるかを返します｡
つまり､ 常に先頭とは限らないが､ 現在の位置からの相対的なオフサイトをバイト単位で表しているのである｡
ある課題でftellを使って､ ファイルを逆から読むということをやっています｡
Printfです｡
私たちは､ おそらく他のどの機能よりもこれを多く使っています｡
これは､ 画面に出力を表示していた｡
フォーマット指定子とカンマで区切られた可変数の引数を使用します｡
Printfはデバッグや出力の表示にとても便利で､ Cプログラムの内部ではかなり多く使われています｡
取り除く｡
Removeは､ ファイルを削除する機能です｡
ファイル名を指定します｡
ファイルポインタを閉じなければならない｡
開いているのはダメなんです｡
Renameは､ あるファイルから別のファイルへ名前を変更しますが､ ファイルを閉じる必要があり､
ファイルを開くことはできません｡
Scanfは通常デフォルトではキーボードからの入力を読み込みます｡
必要であれば､ 他のストリームからの入力を読み取るように変更することも可能です｡
また､ コースを通して議論した変換関数もありました｡
これらの関数のほとんどは､ 標準の lib に含まれています｡ hファイル､ ヘッダーファイル｡
atof機能を搭載していました｡
これは文字列をfloatに変換しているのですが､ それを文字列で渡します｡
atoiの機能を搭載しています｡
これは､ 文字列を整数に変換するものです｡
Atolは文字列をlongに変換しているのですが､ 文字列を渡すと､
変換先のリターンメソッドのどちらかを返してくれます｡
これらは非常に便利です｡
文字列をある種の数値型に変換するときによく使います｡
アトールでは､ long long intに変換されます｡
しかし､ より多くの変換機能については､ 標準のlibヘッダーファイルを見るようにしてください｡
メモリ機能､ 動的メモリ割り当て機能などがありました｡
これらは本当に大切なことです｡
動的なメモリ割り当てが重要なのは､ より効率的だからです｡
必要なメモリだけを活用する｡
静的なデータを作るのではありません｡
これにより､ プログラムの柔軟性が格段に向上します｡
これらの機能はすべて標準ライブラリに含まれています｡ h.
キャロックの話をしました｡
Callocは､ ある大きさを確保すると､ それがn倍される素晴らしい関数です｡
だから､ データ型も指定すれば､ それを掛け算してくれる｡
callocのいいところは､ データを初期化してくれるところです｡
だから､ mallocよりも優先されるんだ｡
メモリを削除するフリー機能を搭載しています｡
このメモリはすべてヒープ上に作成されることになる｡
ですから､ 私たちはずっと長く生き続けることになりますが､ このメモリを管理できるかどうかは､
プログラマーであるあなた次第なのです｡
他のプログラムではメモリは希少な資源なので､
使い終わったら必ずメモリを解放し､ そのメモリを使いたいものです｡
そのため､ callocやmallocを行った後は必ずfreeを呼び出すようにしてください｡
Mallocは､ よりシンプルにメモリを作成するためのものです｡
実際にデータを初期化するわけではありません｡
サイズをパラメータとして受け取るだけです｡
void starを返します｡
そのため､ callocと同じように､ 指し示すメモリの種類に応じたキャストが常に必要です｡
intやfloatを指している場合は､ それをキャストする必要があります｡
また､ reallocもあります｡
Reallocは､ 実際に既存のメモリに追加することができるので､ 素晴らしいです｡
そうすることで､ 記憶がダイナミックになるのです｡
より多くのデータを保存したい場合は､ より大きくすることができます｡
Reallocは､ サイズにポインタを取る｡
前のメモリが指していたデータをすべて保持することになる｡
新しいメモリが割り当てられますが､ それは維持されるので､ 既存のメモリに追加することができます｡
とても､ 便利です｡
特に､ ポインターは非常に重要で､
より効率的です｡
しかし､ このコースで使用するヘッダーファイルについては､ すべて理解しておいてください｡
これらは､ とてもとても重要なメインです｡
次回の講義では､ 思うように話せなかった新しいものについてもお話しします｡
しかし､ これらは重要なものでもあります｡
ありがとうございます｡