Table of Contents
C標準ライブラリの概要
C標準ライブラリは、ISO Cプログラミング言語標準の部分として提供される機能、マクロ、およびタイプ定義のコレクションです。これにより、開発者は、入力/出力、文字列処理、メモリ割り当て、数学計算、日付/時刻操作などの一般的なタスクのためのポータブルでよくテストされた基礎を提供します。カスタムソリューションを書く代わりに、標準ライブラリに依存することで、バグを減らし、コードの読みや、さまざまなプラットフォームとコンパイラ間で一貫してプログラムが動作することを確認してください。
ライブラリは、各ヘッダファイルに構成され、関連する機能のグループ化を行います。各ヘッダが提供するものについて、効率的なCコードと保守可能なCコードを書くための最初のステップを把握します。以下では、最も重要なヘッダーとコア関数を、日常のプログラミングを簡素化する方法を実証する実用的な例とともに探索します。
必須ヘッダーとその機能
<stdio.h> - 入力と出力
[ヘッダーは、標準ストリーム(stdin、stdout、stderr)とファイルへの読み込みと書き込みのための機能を提供します。 それなしで、低レベルのシステムコールを実行したり、独自のバッファレイヤーを書く必要があります。 主な機能は次のとおりです。
- ]/[] - フォーマットされた出力と入力。
- ]/[]] - ファイルを開くと閉じるファイル。
- ]/[] - 安全にファイルから文字列を読み書きします。
- ]/[]]] - バイナリファイルI/O。
- ]/[] – フォーマットされたファイルI/O。
例:[]]] バッファオーバーフローなしでユーザから行を読み込むことは[で直立します:
#include <stdio.h>
int main() {
char buffer[100];
printf("Enter a line: ");
if (fgets(buffer, sizeof(buffer), stdin)) {
printf("You entered: %s", buffer);
}
return 0;
}
<stdlib.h> – 汎用ユーティリティ
[には、動的メモリ割り当て、ランダムな数生成、プロセス制御、変換のための機能が含まれています。これらは、実行時にメモリを割り当てる必要があるプログラムや、システムレベルの操作を実行する必要が不可欠です。
- ], [], [, []]] - 動的メモリ管理。
- ], [], - 文字列対数値変換。
- ], [] – 疑似ランダムな数生成.
- ], [] - プロセス制御.
- ] – 配列のクイックソート実装。
- ] – ソートされた配列のバイナリ検索。
例:]] 整数の配列をとソートするのは、独自のソートルーチンを書くよりもはるかに簡単です。
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = {42, 3, 71, 1, 9};
size_t n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare);
for (size_t i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
<string.h> – 文字列とメモリ操作
C 文字列(文字のnull-terminated配列)で動作するのは、標準ライブラリなしでエラーが発生します。 []は、文字列のコピー、連結、比較、検索、およびメモリブロック操作のための安全で効率的な機能を提供します。
- ], []] - コピー文字列.
- ], [] - 文字列を連結します。
- ], [] – 文字を文字通り比較します。
- ] – 文字列の長さを取得します。
- ], [] - サブストリングや文字を検索します。
- ], [], [] - メモリブロック操作.
- ] – 文字列をトークン化(再エントレンスに注意)。
[例:[]]] を使って2つの文字列を安全に連結する:
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
const char *src = "World!";
strncat(dest, src, sizeof(dest) - strlen(dest) - 1);
printf("%s\n", dest);
return 0;
}
<math.h> – 数学的機能
科学・工学用途向け[]は、フローティングポイント機能(])、[]、[]、[[]、および[[]])を提供します。これらは、Neiveの実装よりもハードウェア最適化とはるかに正確です。
- – 平方根.
- ], [], [ - トリゴノメトリック関数.
- ], [] – 指数関数的および自然的logarithm.
- ] – 浮動小数点の絶対値。
- ] – 最寄りの整数にラウンドします。
[例:[]] 2つのポイント間の距離を計算します。
#include <stdio.h>
#include <math.h>
int main() {
double x1 = 1.0, y1 = 2.0, x2 = 4.0, y2 = 6.0;
double dx = x2 - x1, dy = y2 - y1;
double distance = sqrt(dx*dx + dy*dy);
printf("Distance: %.2f\n", distance);
return 0;
}
<ctype.h> – キャラクターの処理
[の関数は、文字を分類し、変換します。[]、]、]]、]]。それらは、局所固有のルールを扱い、手動比較を書くよりも安全です。
[例:[]]]] 文字列を大文字に変換します。
#include <stdio.h>
#include <ctype.h>
int main() {
char str[] = "Hello, World!";
for (int i = 0; str[i]; i++)
str[i] = toupper(str[i]);
printf("%s\n", str);
return 0;
}
<time.h> - 日と時間
[ は、現在の時刻を取得する関数を提供し、経過時間を測定し、日付/時刻文字列をフォーマットします。ロギング、プロファイリング、スケジューリングに便利です。
- ] – 現在のカレンダー時間を取得する。
- – プログラムで使われる処理時間。
- ] – 2つの時間の値の違い。
- [] – 文字列として時刻をフォーマットします。
- ]/[]]]] - 分割されたダウンのstruct tmにtime tを変換します。
例:[]] プリント電流日時:
#include <stdio.h>
#include <time.h>
int main() {
time_t t = time(NULL);
struct tm *tm_info = localtime(&t);
char buffer[26];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_info);
printf("Current time: %s\n", buffer);
return 0;
}
標準的な図書館の電力を測る実用的な例
安全にファイルを読む
行でテキストファイルラインを読み込むことは一般的な要件です。 を使用して、バッファのオーバーフローを防ぎ、 ]/ は、ファイルのエンドとエラー条件を処理します。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("data.txt", "r");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
char line[256];
while (fgets(line, sizeof(line), fp)) {
printf("%s", line);
}
if (ferror(fp))
perror("fgets");
fclose(fp);
return 0;
}
弦の動的配列
文字列の配列(変数長さのそれぞれ)を割り当てるには、動的メモリが必要です。ライブラリの[[]、、および(利用可能な場合)は、プロセスを簡素化します。注記:[はISO C機能ではありませんが、広くサポートされています。また、]+ ]を使用できます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *words[] = {"apple", "banana", "cherry", "date"};
size_t num_words = sizeof(words) / sizeof(words[0]);
// Allocate array of char pointers
char **copy = malloc(num_words * sizeof(char*));
if (!copy) return EXIT_FAILURE;
for (size_t i = 0; i < num_words; i++) {
copy[i] = malloc(strlen(words[i]) + 1);
if (copy[i])
strcpy(copy[i], words[i]);
}
// Print and free
for (size_t i = 0; i < num_words; i++) {
printf("%s\n", copy[i]);
free(copy[i]);
}
free(copy);
return 0;
}
C標準ライブラリの使用の利点
- [Portability:]標準ライブラリコンパイルに対して書かれたコードで、準拠プラットフォーム(Windows、Linux、macOS、組み込みシステム)で実行します。
- []Correctness:]] ライブラリ関数は、多くのハンドロールされた実装よりも優れたエッジケース(nullポインタ、空の文字列、およびオーバーフローのような)を厳格にテストされ、処理します。
- [Performance:]]]標準ライブラリの実装は、インライン、検索テーブル、およびハードウェアの指示などの技術を使用して、ターゲットハードウェアに最適化されます。
- []Readability:]] は、カスタムバブルソートではなく、すぐに他の開発者に意図を伝えます。
- メンテナンス性:]] ライブラリは標準で進化します。コンパイラやプラットフォームをアップグレードすると、コードに触れることなくライブラリ機能のパフォーマンスが自動的に向上します。
最高の練習と共通ピトル
常に戻り値をチェックする
[、、[]のような関数は失敗することができます。 返り値がクラッシュしたり、未定義の動作を引き起こしていることを無視します。 例えば:
FILE *fp = fopen("nonexistent.txt", "r");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
好まれる曲げられた機能
バッファサイズがチェックされていないため、[とのような関数は危険なです。 ]、 、または(利用可能な場所)を使用して、バッファのオーバーフローを防止します。 例:
char buf[10];
snprintf(buf, sizeof(buf), "%s", "Hello, World!"); // safely truncated
動的に割り当てられた記憶をすべて自由に
[ または ] は、マッチング を持っている必要があります。 バルグラインダーやアドレスSanitizer などのツールを使用して、メモリリークを検出します。
再エントレンシーの注意してください。
いくつかの標準ライブラリ関数(例えば、]、])は、内部静的状態を使用し、スレッドセーフではありません。 複数のプログラムでは、利用可能な または のような再エントラントバージョンを好む。
さらなるリソース
C標準ライブラリの理解を深めるために、権威ある参照に相談してください。
コンテンツ
C標準ライブラリは、すべてのCプログラマにとって不可欠なツールです。ヘッダと機能のマスターによって、より短く、より安全な、よりポータブルなコードを書くことができます。基本的なコンポーネントを再発明する代わりに、アプリケーションを一意にさせるロジックに集中することができます。 Cで開発を続けると、標準ライブラリがすでにあなたの問題を解決するかどうかを最初にチェックする習慣をします。それは通常、そうして、それがで焼いた集団的知恵の十年で行います。