コンパイラメーカがよく使う機能をオブジェクトライブラリとして提供してくれるものを「標準ライブラリ関数」と言います。 入出力、文字列処理、文字処理、数学処理など機能別に多くのライブラリ関数が存在します。
以下にごく基本的でよく使われるライブラリ関数についてまとめます。
また、この章で扱わない標準ライブラリ関数については、付録の「標準ライブラリ一覧」で順次扱っていくことにします。
文字列を処理するための関数
文字列のコピー、連結、比較、長さの取得などを行います。
#include <string.h> が必要です。「#include」については「18-2」 を参照してください。
また、詳細に付いては「標準ライブラリ一覧」をご覧ください。
| 関数 | 説明 | 使用例 |
|---|---|---|
| strcpy(a, b) | 文字列a に文字列b をコピーする。 (注) '\0' もコピーするので文字列a はその分も考えて大きさを宣言しておくこと。 |
char a[10], b[10]; strcpy(a, "some"); strcpy(b, "day"); strcpy(a, b); |
| strcat(a, b) | 文字列a のうしろに文字列b を連結する。 |
char a[10] = "some"; char b[10] = "day"; strcat(a, b); |
| strlen(a) | 文字列a の長さを取得。'\0'は長さに含めない。 |
int len;
char a[] = "today";
len = strlen(a);
printf("長さ = %d\n", len);
|
| strcmp(a, b) | 文字列a と文字列b を比較する。 a > b で正、a < b で負、a = bで 0 を返す。 大小関係は一般に文字コード順による。 |
char a[128], b[128];
scanf("%s", a);
scanf("%s", b);
if (strcmp(a, b) == 0) {
printf("等しい文字列\n");
} else {
printf("異なる文字列\n");
}
|
| strncpy(a, b, n) | 文字列a に文字列b の先頭 n文字をコピーする。 | |
| strncat(a, b, n) | 文字列a のうしろに文字列b の先頭 n文字を連結する。 | |
| strncmp(a, b, n) | 先頭 n文字だけ文字列a と文字列b を比較する。 | |
文字検査や文字変換を行う関数
大文字、小文字などの文字検査や大文字から小文字への文字変換などを行う関数です。
#include <ctype.h> が必要です。
「#include」については「18-2」 を参照してください。
変数は全て int型であり、0〜UCHAR_MAX の値または EOF でなければなりません。
| 関数 | 説明 | 使用例 |
|---|---|---|
| isalnum(c) | 文字c が英数字(A〜Z、a〜z、0〜9)なら真(0以外の数)を返す。 文字c が英数字以外なら偽(0)を返す。 |
int c;
c = getchar();
if (isalnum(c) != 0) {
printf("英数字入力\n");
}
|
| isalpha(c) | 文字c が英文字(A〜Z、a〜z)なら真(0以外の数)を返す。 文字c が英文字以外なら偽(0)を返す。 |
int c;
c = getchar();
if (isalpha(c) != 0) {
printf("英文字入力\n");
}
|
| isdigit(c) | 文字c が数字(0〜9)なら真(0以外の数)を返す。 文字c が数字以外なら偽(0)を返す。 |
int c;
c = getchar();
if (isdigit(c) != 0) {
printf("数字入力\n");
}
|
| islower(c) | 文字c が英小文字(a〜z)なら真(0以外の数)を返す。 文字c が英小文字以外なら偽(0)を返す。 |
int c;
c = getchar();
if (islower(c) != 0) {
printf("英小文字入力\n");
}
|
| isupper(c) | 文字c が英大文字(A〜Z)なら真(0以外の数)を返す。 文字c が英大文字以外なら偽(0)を返す。 |
int c;
c = getchar();
if (isupper(c) != 0) {
printf("英大文字入力\n");
}
|
| isxdigit(c) | 文字c が16進表示文字(0〜9、A〜F、a〜f)なら真、それ以外なら偽を返す。 |
int c;
c = getchar();
if (isxdigit(c) != 0) {
printf("16進表示文字\n");
}
|
| iscntrl(c) | 文字c が制御文字(0x00〜0x1f、0x7f)なら真、それ以外なら偽を返す。 | |
| isprint(c) | 文字c が印字可能文字(0x20〜0x7e)なら真、それ以外なら偽を返す。 | |
| isgraph(c) | 文字c が空白を除く印字可能文字(0x21〜0x7e)なら真、それ以外なら偽を返す。 | |
| ispunct(c) | 文字c が区切り文字(0x21〜0x2f、0x3a〜0x40、0x5b〜0x60、0x7b〜0x7e)なら真、それ以外なら偽を返す。 | |
| isspace(c) | 文字c が空白、タブ、復帰、改行、垂直タブ、改頁(0x09〜0x0d、0x20)なら真、それ以外なら偽を返す。 | |
| tolower(c) | 文字c が大文字なら、小文字に変換した値を返す。 大文字以外なら、そのままの値を返す。 |
int c, ch;
c = getchar();
ch = tolower(c);
printf("小文字変換 = %c\n", ch);
|
| toupper(c) | 文字c が小文字なら、大文字に変換した値を返す。 小文字以外なら、そのままの値を返す。 |
int c, ch;
c = getchar();
ch = toupper(c);
printf("大文字変換 = %c\n", ch);
|
数値演算を行う関数
様々な算術演算を行う関数です。
#include <math.h> が必要です。「#include」については「18-2」 を参照してください。
また、詳細に付いては「標準ライブラリ一覧」をご覧ください。
| 関数 | 説明 | 使用例 |
|---|---|---|
| exp(x) | 指数関数e の x乗の値を返す。 |
double y; y = exp(1.0); ・・・ y は 2.718282 |
| log(x) | 自然対数(e を底とする対数)logex の値を返す。 |
double y; y = log(2.718282); ・・・ y は 1 |
| log10(x) | 常用対数(10を底とする対数)log10x の値を返す。 |
double y; y = log10(100); ・・・ y は 2 |
| sqrt(x) | x の平方根の値を返す。 |
double y; y = sqrt(2.0); ・・・ y は 1.41421 |
| pow(x, y) | x の y乗の値を返す。 |
double z; z = pow(2.0, 3.0); ・・・ z は 8.0 |
| sin(x) | x(ラジアン)のサイン値を返す。 |
double y; y = sin(90.0 * 3.14159 / 180.0); ・・・ 90°のサイン値 y は 1.0 |
| cos(x) | x(ラジアン)のコサイン値を返す。 |
double y; y = cos(90.0 * 3.14159 / 180.0); ・・・ 90°のコサイン値 y は 0.0 |
| tan(x) | x(ラジアン)のタンジェント値を返す。 |
double y; y = tan(45.0 * 3.14159 / 180.0); ・・・ 45°のタンジェント値 y は 1.0 |
| abs(n) | int型データ n の絶対値を int型で返す。 #include <stdlib.h> が必要。 |
int a; a = abs(-2); ・・・ -2 の絶対値は 2 |
| fabs(x) | double型データ x の絶対値を double型で返す。 |
double y; y = fabs(-23.4); ・・・ -23.4 の絶対値は 23.4 |
| ceil(x) | データ x を切り上げた値を返す。 |
double y; y = ceil(12.11); ・・・ y は 13 y = ceil(-5.68); ・・・ y は -5 |
| floor(x) | データ x を切り下げた値を返す。 |
double y; y = floor(12.11);・・・ y は 12 y = floor(-5.68);・・・ y は -6 |
| fmod(x) | x / y の余りの値を返す。 |
double z; z = fmod(10.5, 3.2); ・・・ z は 0.9 |
代表的な一般ユーティリティ関数に以下のものがあります。
#include <stdlib.h> が必要です。
「#include」については「18-2」 を参照してください。
| 関数 | 説明 | 使用例 |
|---|---|---|
| atoi(str) | 文字列str を int型変数に変換して返す。 |
int i; char str[] = "123"; i = atoi(str); ・・・ i は整数値の 123 |
| atof(str) | 文字列str を double型変数に変換して返す。 |
double d; char str[] = "123.456"; d = atof(str); ・・・ d は浮動小数点数の 123.456 |
| atol(str) | 文字列str を long型変数に変換して返す。 |
long l; char str[] = "123456"; l = atol(str); ・・・ l は整数値の 123456 |
| rand() | 整数の擬似乱数(関数コールするたびに異なる値)を返す。(詳細) |
int d; d = rand(); ・・・ d は整数の擬似乱数 |
| system(cmnd) | コマンドプロセッサを呼び出し、cmnd で指定したコマンドを実行する。 |
char cmnd[] = "time";
system(cmnd);・・・ timeコマンドを実行
system("dir");・・・dirコマンドを実行
|
| exit(status) | 任意の場所でプログラムを終了させる。 status は、 |
成功終了 ==> exit(EXIT_SUCCESS); 失敗終了 ==> exit(EXIT_FAILURE); |
scanf()で読み込み不一致が起こる問題では、上記 「atoi()、atol()、atof()」を使って回避します。
読み込み不一致は、scanf()を for や while などのループの中で用いた場合、入力バッファに残されたデータを永遠に受け付けないため無限ループになってしまい意外に深刻な問題となります。
そのためデータを一旦、scanf("%s", ○)や gets()を用いて文字列として入力し、それから上記の変換関数を用いて期待するデータ型に変換するのです。
int i = 0;
char a[20];
while(i != -1) {
printf("整数値を入力してください(終了条件:-1)\n");
scanf("%s", a);
i = atoi(a);
}
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved