苦学楽学塾 ホームページ
最終更新日:2025年1月2日
1.実行制御関数
C言語の実行制御関数を以下に掲げます。
void abort()
SIGABRT例外を発生して異常終了します。<stdlib.h>をincludeしてください。
assert(int check)
プログラム中で診断を行うマクロです。checkには、本来0以外(真)になるはずの式を記述します。checkが0(偽)になると、assertが置かれている行番号、関数名、ファイル名、処理内容をレポートし、abort()関数が呼ばれます。<assert.h>をincludeしてください。<assert.h>をincludeする前に、#define NDEBUGを入れておくと、assert()マクロは何もしなくなります。
int atexit(void (*func)())
exit()関数実行後、あるいはmain()関数終了後に実行される関数func(引数を取らず、戻り値のない関数)を登録します。複数の関数を登録すると、登録順と逆の順に実行されます。<stdlib.h>をincludeしてください。
void exit(int status)
終了ステータスstatusで、プログラムを終了します。終了に当たり、atexit()関数で登録した関数を登録順と逆順に起動します。<stdlib.h>をincludeしてください。
void longjmp(jump_buf env, int value)
C言語のgoto文は、関数内での分岐にしか使えないのですが、関数間であっても制御を一発で移動させる方法を提供します。引数のenvは、setjmp()関数で引数としたenvを指定します。引数valueは、setjmp()関数の戻り値のように働きます。longjmp()を実行すると、あたかもvalueを戻り値として、setjmp()として呼ばれた関数から戻るかのように、setjmp()の位置に制御が移ります。setjmp()自体は0を返すので、引数valueには0以外の値を指定します。<setjmp.h>をincludeしてください。
void perror(char *string)
文字列stringに続けて、errnoに対応するエラー・メッセージをstderrに出力します。<stdio.h>をincludeしてください。
int raise(int sig)
引数sigで指定されたシグナルを発生します。正常終了すれば0を返します。<signal.h>をincludeしてください。
シグナルとしては、SIGINT(Ctrl-C押下),SIGQUIT(Ctrl-¥押下),SIGABRT(abort()関数実行),SIGFPE(ゼロ除算、オーバーフローなど),SIGKILL(強制終了シグナル),SIGUSR1(raise(SIGUSR1)の実行),SIGSEGV(不正なメモリ・アクセス),SIGUSR2(raise(SIGUSR2)の実行),SIGALRM(alarm()関数の実行),SIGTSTP(Ctrl-Z押下)などがあります。
int setjmp(jmp_buf env)
C言語のgoto文は、関数内での分岐にしか使えないのですが、関数間であっても制御を一発で移動させる方法を提供します。関数間を移動するための情報を格納する領域envを引数に指定します。envはlongjmp()関数で使われます。setjmp()関数自体は0を返します。longjmp()関数から制御が移ってきたときには0以外の値が返るので、区別することができます。<setjmp.h>をincludeしてください。
例えば、main()関数から呼ばれたfunc()の中から、main()関数内に戻りたい場合、main()関数内の戻りたい位置にsetjmp()を置き、
int func(jmp_buf env) {
処理1
longjmp(env, 1);
}
void main() {
jmp_buf env;
処理2
if (setjmp(env) == 0) {
処理3
ret = func(env);
}
else {
処理4
}
}
とします。main()関数で、処理2が行われ、setjmp(env)が実行され、必要な情報がenvに入り、ここでは0を返すので、処理3に進みます。ここで、func()を呼び出し、処理1を実行後、longjmp()が実行されると、制御がmain()関数のsetjmp()の位置に移り、今度は、setjmp()関数は、longjmp()関数の第2引数の1を返すので、処理4に進むことになります。setjmp(),longjmp()は、副作用の恐れもあり、致命的な障害が起きたときに最低限の復旧を試みる、といった特殊な使い方以外は使用を避けるべきです。
void (*signal(int sig, void(*func)(int)))(int)
シグナルsigが発生したときに起動する関数func()を登録します。<signal.h>をincludeしてください。なお、C言語固有の機能の3.例外処理も参考にしてください。
int system(char *com)
文字列comで指定されるコマンドを実行します。コマンドの終了ステータスを返します。
type va_arg(va_list ap, type)
可変個数引数関数の引数リストから引数データを取り出すマクロです。事前に、va_start()マクロを実行しておく必要があります。このマクロを実行して引数データを取り出すと、va_list型のapは次の引数を指すようになります。なお引数の型type(int,char *,doubleなどを指定します)と引数の個数は事前に知っておく必要があります(printf()関数と同様に第1引数を解析して各引数の型と引数の個数を把握する、あるいは、引数の型をintに限定し、引数リストの最後に終了マークを入れる、など)。実際の引数の個数よりも多く呼ばれた時にこのマクロが何を返すかは保証されません。また、typeをshortとしてもintに変換され、typeをfloatとしてもdoubleに変換されます。<stdarg.h>をincludeしてください。
void va_copy(va_list ap2, va_list ap1)
可変個数引数関数の引数リストのコピーを作るマクロです。事前にva_start()マクロを実行しておく必要があります。va_list型のap1からva_list型のap2にコピーされます。実際には、先頭の第1引数の位置と値がコピーされるだけです。<stdarg.h>をincludeしてください。
void va_end(va_list ap)
可変個数引数関数の引数リストをリセットするマクロです。可変個数引数の取り出し完了後に実行します。va_start()マクロで初期化されたva_list型のapだけでなく、va_copy()で作られたva_list型のapについても、このマクロを実行しておく必要があります。<stdarg.h>をincludeしてください。
void va_start(va_list ap, arg_1)
可変個数引数関数の引数リストを初期化するマクロです。va_list型のapを可変個数引数関数の可変個数部分でない最後の引数の変数名arg_1(可変個数引数関数がfunc1()だとして、int func1(char *pc1, char *pc2, ...)となっているならpc2)にセットします。<stdarg.h>をincludeしてください。
2.数学関連関数
C言語の数学関連関数を以下に掲げます。
int abs(int n)
整数nの絶対値を返します。<stdlib.h>をincludeしてください。
double acos(double x)
xの逆余弦の値(0~π)を返します。xは-1≦ x ≦1です。<math.h>をincludeしてください。
double acosh(double x)
xの双曲線逆余弦の値を返します。計算不能なとき、errnoにエラー番号を設定し0を返します。<math.h>をincludeしてください。
double asin(double x)
xの逆正弦の値(-π/2~π/2)を返します。xは-1≦ x ≦1です。<math.h>をincludeしてください。
double asinh(double x)
xの双曲線逆正弦の値を返します。<math.h>をincludeしてください。
double atan(double x)
xの逆正接の値(-π/2~π/2)を返します。計算不能なとき、errnoにエラー番号を設定し0を返します。<math.h>をincludeしてください。
atan2(double y, double x)
y/xの逆正接の値(-π~π)を返します。計算不能なとき、errnoにエラー番号を設定し0を返します。<math.h>をincludeしてください。
double atanh(double x)
xの双曲線逆正接の値を返します。計算不能なとき、errnoにエラー番号を設定し0を返します。<math.h>をincludeしてください。
double cbrt(double x)
xの立方根を返します。<math.h>をincludeしてください。
double ceil(double x)
x以上の最小の整数を返します。<math.h>をincludeしてください。
double cos(double x)
x(ラジアン単位で指定)の余弦を返します。<math.h>をincludeしてください。
double cosh(double x)
x(ラジアン単位で指定)の双曲線余弦を返します。<math.h>をincludeしてください。
double erf(doule x)
xの誤差関数を返します。<math.h>をincludeしてください。
double erfc(double x)
xの相補誤差関数を返します。<math.h>をincludeしてください。
double exp(double x)
xの指数関数を返します。<math.h>をincludeしてください。
double fabs(double x)
xの絶対値を返します。<math.h>をincludeしてください。
double floor(double x)
x以下の最大整数を返します。<math.h>をincludeしてください。
double fmod(double x, double y)
x/yの浮動小数点剰余を返します。結果はxと同符号で、結果の絶対値はyの絶対値よりも小さくなります。<math.h>をincludeしてください。
double frexp(double x, int *exp)
浮動小数点数xの指数部をexpが指す変数に格納し、仮数部を返します。<math.h>をincludeしてください。
double hypot(double x, double y)
xの2乗とyの2乗の和の平方根を返します。<math.h>をincludeしてください。
double j0(double x)
xに対する0次の第1種ベッセル関数の値を返します。<math.h>をincludeしてください。
double j1(double x)
xに対する1次の第1種ベッセル関数の値を返します。<math.h>をincludeしてください。
double jn(int n, double x)
xに対するn次の第1種ベッセル関数の値を返します。<math.h>をincludeしてください。
long labs(long x)
xの絶対値を返します。<math.h>をincludeしてください。
double ldexp(double x, int exp)
xと2のexp乗の積を返します。<math.h>をincludeしてください。
double log(double x)
xの自然対数を返します。x > 0でないとエラーになります。<math.h>をincludeしてください。
double log10(double x)
xの常用対数を返します。x > 0でないとエラーになります。<math.h>をincludeしてください。
double log2(double x)
2を底とするxの対数を返します。x > 0でないとエラーになります。<math.h>をincludeしてください。
double modf(double x, double *ptr)
浮動小数点数xを、整数部分と小数部分に分解し、整数部分をptrの指す先の変数に入れ、小数部分を返します。<math.h>をincludeしてください。
double pow(double x, double y)
xのy乗を返します。<math.h>をincludeしてください。x ≦ 0の場合、yは整数でなければなりません。
int rand()
0~RAND_MAXの範囲の疑似乱数整数を生成します。<stdlib.h>をincludeしてください。乱数のseedはsrand()関数で設定しますが、デフォルトでは1です。<stdlib.h>をincludeしてください。
double round(double x)
xを四捨五入した値を返します。<math.h>をincludeしてください。
double sin(double x)
x(ラジアン単位で指定)の正弦を返します。<math.h>をincludeしてください。
double sinh(double x)
x(ラジアン単位で指定)の双曲線正弦を返します。<math.h>をincludeしてください。
double sqrt(double x)
xの平方根を返します。<math.h>をincludeしてください。
void srand(unsigned int seed)
疑似乱数のseedをseedに設定します。<math.h>をincludeしてください。
double tan(double x)
x(ラジアン単位で指定)の正接を返します。<math.h>をincludeしてください。
double tanh(double x)
x(ラジアン単位で指定)の双曲線正接を返します。<math.h>をincludeしてください。
3.時間関連関数
C言語の時間関連関数を以下に掲げます。
int alarm(unsigned int seconds)
seconds秒後にSIGALRM例外を発生します。この関数自体は0を返します既に設定されているalarm設定がある場合、キャンセルされ、残り秒数を返します。<unistd.h>をincludeしてください。
char *asctime(struct tm *ptm1)
ptm1の指すtm構造体の内容に従って、日付時刻の文字列を生成し、文字列を指すポインタを返します。<time.h>をincludeしてください。
Mon Dec 16 14:25:53 2024
のような文字列を生成します。末尾には改行文字'¥n'と末尾0が付きます。
clock_t clock()
プログラムの動作時間を求めたい場合、動作終了時点のclock()関数の戻り値(ミリ秒単位)から、動作開始時点のclock()関数の戻り値を引いて求めます。CYGWIN上では、ミリ秒単位なので、秒単位にする場合には、1000で割ります。<time.h>をincludeしてください。
char *ctime(time_t *pt1)
pt1の指すtime_t型変数の内容(1970年1月1日0時0分0秒 UTCからの経過秒数)に従って、日付時刻の文字列を生成し、文字列を指すポインタを返します。<time.h>をincludeしてください。
Mon Dec 16 14:25:53 2024
のような文字列を生成します。末尾には改行文字'¥n'と末尾0が付きます。
double difftime(time_t t1, time_t t2)
システムが持っている時刻t1,t2(time()関数の戻り値)の差を秒単位で求めます。ミリ秒単位で求めたい場合には、clock()関数を使うこと。<time.h>をincludeしてください。
struct tm *gmtime(time_t *pt1)
pt1が指す変数に入っている、time()関数で取得されたシステム時刻の値から世界標準時に合うようにtm構造体を設定し、tm構造体を指すポインタを返します。<time.h>をincludeしてください。
struct tm *localtime(time_t *pt1)
pt1が指す変数に入っている、time()関数で取得されたシステム時刻の値から日本標準時に合うようにtm構造体を設定し、tm構造体を指すポインタを返します。<time.h>をincludeしてください。
time_t mktime(struct tm *ptm1)
ptm1の指すtm構造体の内容からシステム時刻(1970年1月1日0時0分0秒 UTCからの経過秒数)を求めます。<time.h>をincludeしてください。
int pause()
プログラムの動作を停止します。Ctrl-C押下など、何らかのシグナルが発生すると、動作を再開します。<unistd.h>をincludeしてください。
unsigned int sleep(unsigned int s)
s秒間、動作を停止して待機します。s秒間待機して終了すると0を返します。途中終了する場合は、残りの秒数を返します。
size_t strftime(char *buffer, size_t max, char *format, struct tm *ptm1)
ptm1の指すtm構造体の内容から、文字列formatで指定する書式に従って、buffer以降に日付時刻を出力します。書式には、以下のものを指定できます。
%a 曜日の省略文字列
%A 曜日の省略なし文字列
%b 月の省略文字列
%B 月の省略なし文字列
%c 日付・時刻の標準文字列
%d 日(1~31)
%H 24時間表記の時
%I 12時間表記の時
%j 年初からの通算日数
%m 月(1~12)
%M 分
%p 午前/午後
%S 秒
%x 日付の標準文字列
%X 時刻の標準文字列
%a 曜日の省略文字列
%y 西暦年の下2桁
%Y 4桁の西暦年
例えば、2024年12月16日に、100文字分のbufferを用意し、time_t t1; time(&t1); ptm1 = localtime(&t1); strftime(buffer, 100, "%j", ptm1); printf("%s\n", buffer);
とすると、画面に351と表示します。同日に、
strftime(buffer, 100, "%Y年%m月%d日(%a)%H時%M分%S秒", ptm1);
printf("%s\n", buffer);
とすると、画面に、
2024年12月16日(Mon)18時38分33秒
のように表示します。<time.h>をincludeしてください。
char *strptime(char *string, char *format, struct tm *ptm1)
文字列stringの内容を書式文字列formatに従って読み込み、ptm1の指すtm構造体にデータをセットします。<time.h>をincludeしてください。strftime()関数の書式設定に加えて以下のものが可能です。
%n 任意の空白
%R %H:%Mと同じ
%T %H:%M:%Sと同じ
time_t time(time_t *pt1)
システムが保持している時刻データ(1970年1月1日0時0分0秒 UTCからの経過秒数)を返します。pt1の指す変数に返る値と戻り値は同じです。pt1にNULLを指定することもできます。<time.h>をincludeしてください。
int usleep(useconds_t m)
mマイクロ秒間、実行を停止します。正常に実行されると0を返します。
4.メモリ関連関数
void *calloc(size_t num, size_t size)
長さsize,要素数numの配列用にメモリを確保し、メモリ領域の先頭アドレスを返し、メモリ確保に失敗すると、NULLを返します。<stdlib.h>をincludeしてください。
void free(void *ptr)
calloc()関数、malloc()関数により取得されたメモリ領域の先頭アドレスptrを指定して、メモリ領域を解放します。<stdlib.h>をincludeしてください。
void *malloc(size_t size)
sizeバイトのメモリ領域を確保し、メモリ領域の先頭アドレスを返し、メモリ確保に失敗すると、NULLを返します。<stdlib.h>をincludeしてください。
void *realloc(void *ptr, size_t size)
calloc()関数、malloc()関数により取得されたメモリ領域(先頭アドレスptr)の大きさを変更する場合、ptrを指定し、sizeバイトの領域を取り直し、新たな領域の先頭アドレスを返します。領域を広げた場合は、元の内容は保存されています。メモリ領域の位置が変更されることもあります。<stdlib.h>をincludeしてください。
4.システム環境関連関数
C言語のシステム環境関連関数を以下に掲げます。
int clearenv()
環境テーブルから環境変数を全てクリアしてデフォルトに戻します。外部からの悪意のある侵略者が環境変数を変更している恐れがあるとき、system()関数実行前にclearenv()しておくように、と指摘しているウェブサイトがあります。「環境 クリア」で検索してみてください。<stdlib.h>をincludeしてください。
char *getenv(char *pv)
pvで指定する名前の環境変数に設定されている内容の文字列へのポインタを返します。pvが見つからない場合にはNULLを返します。<stdlib.h>をincludeしてください。
int putenv(char *string)
環境変数の設定を行います。文字列stringは、var=valueという形をしています。成功すると0を返します。<stdlib.h>をincludeしてください。
例えば、環境変数PATHに/home/owner/testを設定するのであれば、
char string[] = "PATH=/home/owner/test";
putenv(string);
とします。
int setenv(char *var, char *value, int flag)
環境変数の設定を行います。環境変数文字列varに、文字列valueを設定します。varが既に存在するとき、flagが0以外ならvalueに書き換えてしまいますが、flagが0のときには、書き換えません。いずれにしても正常終了の0を返します。
5.ユーティリティ関数
C言語のユーティリティ関数を以下に掲げます。
void *bsearch(void *key, void *array, size_t num, size_t size, int (*compare)(void *e1, void *e2))
比較関数compare()を用いて二分探索を行い、sizeバイトの要素数numの配列array中からkeyの指す内容を探し、見つかれば、そのデータを指すポインタを返し、見つからなければNULLを返します。同じ比較関数compare()を用いて事前にqsort()関数でソートしておく必要があるのですが、qsort()に時間がかかるので、文字列などでは、ハッシュ探索を考えるべきです。<stdlib.h>をincludeしてください。
void *lsearch(void *key, void *array, size_t *np, size_t size, int (*compare)(void *e1, void *e2))
比較関数compare()(e1の指す内容ととe2が指す内容が一致すれば0,一致しないときには0以外を返す)を用いて線形探索を行い、sizeバイト、ポインタnpの指す要素数の配列array中からkeyの指す内容を探し、見つかれば、そのデータを指すポインタを返し、見つからなければkeyの指す内容を配列の末尾に付加し要素数*npを1増やして、配列の末尾を指すポインタを返します。<search.h>をincludeしてください。
void qsort(void *array, size_t num, size_t size, int (*compare)(void *e1, void *e2))
比較関数compare()を用いて、sizeバイトの要素数numの配列arrayをソートします。比較関数compare()は、e1の指す内容がe2の指す内容よりも小さいときに負の値を返し、e1の指す内容とe2の指す内容が等しいときに0を返し、e1の指す内容がe2の指す内容よりも大きければ正の値を返す関数です。<stdlib.h>をincludeしてください。
6.その他
struct lconv *localeconv()
lconv構造体へのポインタを返します。<locale.h>をincludeしてください。
lconv構造体のメンバーには、decimal_point(小数点文字へのポインタ),thousands_sep(小数点の左側にある数字を(例えば3桁ごとに)グループ毎に区切る文字へのポインタ)などがあります。
car *setlocale(int category, char *locale)
localeの設定と取得を行います。categoryには、LC_ALL(全てのカテゴリー),LC_COLLATE(文字列の照合について定義します),LC_CTYPE(ctype.hで定義されている文字操作関数,また、printf(),scanf()と同類の関数,mblen()に影響します),LC_MONETARY(通貨情報に影響します),LC_NUMERIC(printf(),scanf()と同類の関数,strtod(),atof()の小数点文字などに影響があります),LC_TIME(strftime(),strptime()での日付表示形式に影響があります)などが指定できます。なお、LC_COLLATEとLC_CTYPEには同じlocaleが設定されているはずです。localeには、"ja_JP.SJIS","ja_JP.UTF-8"などを指定します。本ウェブサイトでは、"ja_JP.SJIS"が指定されていることを前提としています。localeをヌル文字列""とすると設定されているlocale文字列へのポインタを返します。<locale.h>をincludeしてください。
【広告】 ここから広告です。ご覧の皆さまのご支援ご理解を賜りたく、よろしくお願いいたします。
【広告】 広告はここまでです。