☆標準関数、マクロ
ANSI-Cを基本にLinux, Cygwin等で一般的に使用可能なものを含む
◎アルファベット順 S-Z
◆scanf()
│ #include <stdio.h>
│ int scanf(const char *format,…);
※フォーマット付入力
⇒バッファオーバーフローの危険がある
※第1引数がstdinであるfscanf関数と等価。stdinからの入力を*formatの制御に基づき、実引数の指すオブジェクトに格納する。
│ *format 書式文字列
│ … 可変個引数
※代入された入力項目数を返す。入力失敗が発生した場合はEOFを返す。
※scanf(3)
※潜在的にバッファオーバフローを起こす危険がある
⇒使用しない方がよい。<=迷信?
⇒書式指定を完璧にすればバッファオーバフローは防げる
⇒しかし、整数や浮動小数点数の場合のオーバーフロー、アンダーフローは検知不能
⇒そのような場合は、
char s[100]; long t; int x; char *endptr; fgets(s, 100, stdin); errno = 0; t = strtol(s, &endptr, 10); if (errno != 0 || *endptr != '\n' || (t < INT_MIN || INT_MAX < t)) { /* エラー処理 */ } x = t;
※変換指定
%[代入抑止][最大フィールド幅][長さ修飾子]変換指定子
①代入抑止
* フォーマットに合わせて読み込むが実引数に代入しない
②最大フィールド幅
数字
③長さ修飾子
h 実引数 char
hh 実引数 short
l 実引数 long/wchar_t/double
ll 実引数 long long
j 実引数 intmax_t
z 実引数 size_t
t 実引数 ptrdiff_t
L 実引数 long double
④変換指定子
d,i 10進符号付
u 10進符号無
o 8進符号無
x,X 16進符号無
e,E 浮動小数
f,F 浮動小数
g,G 浮動小数
a,A 浮動小数
c 文字
s 文字列
p void*型ポインタ値
n 整数変数出力済文字列
% ’%’
[…] []内の文字のみ取得、それ以外は入力終了
[^…] []内の文字が入ってくるまで文字を読み込む、残りは入力ストリームに残される。
※入力した際の改行文字の除去
char ch;
scanf(“%c%*c”, &ch);
※改行文字まで文字列を読み込み、改行コードは除去
char s[20];
scanf(“%[^\n]%*c”, s);
※バッファオーバランを防ぐ sには19バイトまでしか入力できない
(末尾は0)
⇒最大フィールド幅を指定する.
char s[20];
scanf(“%19[^\n]%*[^\n]”, s);
getchar();
⇒19バイト読み込み、改行文字まで空読み
⇒getchar()で改行文字を取り除き
char s[10];
scanf(“%9s%*[^\n]%*c”, s);
※scanfは異常入力の場合、値をストリームに残す
⇒scanfは代入に成功した変数の数を戻り値で返す。
戻り値が期待と異なる場合は、バッファをクリアする
scanf(%*s”)
◆setbuf()
│ #include <stdio.h>
│ void setbuf(FILE *stream, char *buf);
※バッファを設定する。 fopen, freopen関数でファイルをオープンし、入出力を行う前に使う。bufがNULLの場合は、バッファリングをしない。NULLでないなら、bufが示すBUFSIZ値のバイト数のchar配列をバッファとする。返却値はない。
※setvbuf関数に包含されるので、そちらを使う。
◆setjmp()
│ #include <setjmp.h>
│ int setjmp(jmp_buf env);
※マクロ呼び出し時の環境を環境退避変数 env に退避する。この環境を後でlongjmp関数で回復することで非局所分岐を起こす。setjmpマクロの直接呼出しでは0を返す。
◆setlocale()
│ #include <locale.h>
│ char *setlocale(int category, const char *locale);
※categoryは、LC_~マクロで指定する。*localeには”C”,””などを設定する。組み合わせが適切であれば、現在地域を示す文字列へのポインタを返す。その文字列を*localeにセットして再度setlocale()すると、もとに戻せる。組み合わせが不適切であればNULLを返す。
◆setvbuf()
│ #include <stdio.h>
│ int setvbuf(
│ FILE *stream,
│ char *buf,
│ int mode,
│ size_t size
│ );
※バッファを設定する。*streamをオープンし、ファイルに関連づけた後、読み出しが行われる前に *buf とそのサイズ size、バッファ形式を示すバッファモードを設定する。
│ _IOFBF 入出力完全バッファリング
│ _IOLBF 行バッファリング
│ _IONBF バッファリングしない。
※bufがNULLなら領域を自動的に割り付ける。成功した場合は0を返すが、失敗した場合は非0を返す。
※自動的に作られるバッファでなく、プログラム側で用意したバッファをstreamに使わせることができる
◆signal()
│ #include <signal.h>
│ void (*signal(int sig, void (*func)(int)))(int);
※シグナル番号sigを受けた場合に処理する方法を第2引数に指定する。第2引数が
│ SIG_DFL シグナルのデフォルト処理
│ SIG_IGN シグナル無視
関数であれば、SIG_DFLと同等の実行後、関数が呼び出される。呼び出された関数は,abort,exit,longjmpで終了してもよい。returnもできるが、SIGFPEなどでは未定義。他の場合は、中断したところから実行再開。返却値を返すことが可能で、成功の場合は、呼び出された関数funcへのポインタを返し、誤りの場合はSIG_ERRを返す。
◆sin()
│ #include <math.h>
│ double sin(double x);
※角度x(ラジアン)の正弦を返す。
◆sinh()
│ #include <math.h>
│ double sinh(double.x);
※浮動小数点値xの双曲線正弦値をラジアンで計算する。xの絶対値が大きすぎる場合は範囲エラーとなる。オーバーフローの場合はHUGE_VALをかえしerrnoはERANGEとなる。アンダーフローの場合は0を返すが、errnoがERANGEとなるかどうかは処理系依存。
◆sprintf()
│ #include <stdio.h>
│ int sprintf(char *s, const char *format, …);
※第1引数が *s であるfprintf関数と等価。ファイルでなく, char配列に書く。末尾には空文字が付加されるが、返却値である書かれたバイト数の総計には含まれない。配列末尾を越えて書き込んだ場合の動作は未定義。
◆sqrt()
│ #include <math.h>
│ double sqrt(double x);
※浮動小数点値xの非負の平方根を返す。負の場合は定義域エラー。
◆srand()
│ #include <stdlib.h>
│ void srand(unsigned int seed);
※擬似乱数列の種 seed を設定する。srand関数を呼び出さずにrand関数を呼び出した場合は、seedを1としてsrand関数を呼んだ場合と同じ。返却値はない。擬似乱数の生成方法は処理系定義。
◆sscanf()
│ #include <stdio.h>
│ int sscanf(const char *s, const char *format, …);
※入力はストリームでなく、第1引数の文字列*sであるfscanf関数と等価。文字列の終わり(空文字)までをスキャンする。代入された入力項目数を返す。入力失敗が発生した場合はEOFを返す。
◆strcat()
│ #include <string.h>
│ char *strcat(char *s1, const char *s2);
※配列 *s1.. の末尾に、文字列 *s2.. を複写したものを連結付加する。*s1.. の最後の空文字を *s2.. の最初の文字(*s2)で上書きする。*s2.. の最後の空文字まで複写される。s1の値を返す。記憶域が重なっていたり、末尾を越えた場合の動作は未定義。
◆strchr()
│ #include <string.h>
│ char *strchr(const char *s, int c);
※文字列 *s.. の文字 c の最初の出現に位置ずけする。位置づけは c を char でキャストして行う。文字列末尾の空文字は文字列の一部とみなす。発見できれば位置ずけられた文字へのポインタを、発見できない場合は NULL を返す。
◆strcmp()
│ #include <string.h>
│ int strcmp(const char *s1, const char *s2);
※文字列 *s1.. と *s2.. を比較し、異なる最初の文字対(unsigned char)の値の差を返す。*s1.. が小さければ負の整数、一致すれば 0 、大きければ正の整数が返る。
◆strcoll()
│ #include <string.h>
│ int strcoll(const char *s1, const char *s2);
※文字列 *s1.. と *s2.. をLC_COLLATEにもとづいて解釈し、照合する。小さい、等しい、大きい場合に、それぞれ負、0、正の整数を返す。
◆strcpy()
│ #include <string.h>
│ char *strcpy(char *s1, const char *s2);
※配列 *s1.. に文字列 *s2.. を複写する。*s2..末の空文字も複写される。*s1領域を超過したり、記憶域の重複についての動作は未定義。
◆strcspn()
│ #include <string.h>
│ size_t strcspn(const char *s1, const char *s2);
※文字列 *s1.. の中で、文字列 *s2.. の文字群以外の文字で構成される先頭部分の長さを計算する。
◆strerror()
│ #include <string.h>
│ char *strerror(int errnum);
※エラー番号 errnum を、処理系定義のエラーメッセージ文字列に対応づける。対応づけられた文字列へのポインタを返す
⇒strerror()の戻り値の指す領域は、次回のstrerror()で上書きされてしまうので、戻り値は直ぐに使うこと。
◆strftime()
│ #include <time.h>
│ size_t strftime(
│ char *s,
│ size_t maxsize,
│ const char *format,
│ const struct tm *timeptr
│ );
※詳細時間 *timeptr を、書式文字列 *format.. で文字列に変換し、文字配列 s に maxsize バイトまで格納する。変換後の空文字を含まないバイト数がmaxsizeを超えなければそのバシト数を、超えていれば0を返す。
変換指定子
%a 曜日略語
%A 曜日名前
%b 月略語
%B 月名前
%c 日付時刻
%d 日付
%H 時(24時間制)
%I 時(12時間制)
%j 年通算日
%m 月(数字)
%M 分
%p 午前午後
%S 秒
%U 年通算週(日曜開始)
%w 曜日(日曜日0)
%W 年通算週(月曜開始)
%x 日付
%X 時刻
%y 西暦下2ケタ
%Y 西暦年
%Z 時間帯
%% %%そのもの
◆strlen()
│ #include <string.h>
│ size_t strlen(const char *s);
※文字列 *s.. の長さを返す。文字列の長さは空文字に先行する文字数である。
◆strncat()
│ #include <string.h>
│ char *strncat(char *s1, const char *s2, size_t n);
※文字配列 *s1.. の末尾に、文字列 *s2.. から n バイトの文字を付加する。*s1..末尾の空文字が上書きされ、文字列の末尾には空文字が付加される。s1を返す。*s1..の領域を超えた場合の動作は未定義。
◆strncmp()
│ #include <string.h>
│ int strncmp(
│ const char *s1,
│ const char *s2,
│ size_t n
│ );
※文字列 *s1.. *s2.. の最初の n バイトの文字を比較し、0より小さい、0、0より大きい整数を返す。*s2.. の空文字以降の文字は比較対象にはならない。
◆strncpy()
│ #include <string.h>
│ char *strncpy(char *s1, const char *s2, size_t n);
※配列 *s1.. に、文字列 *s2.. の最初の n バイトの文字を複写し、s1 を返す。
◆strpbrk()
│ #include <string.h>
│ char *strpbrk(const char *s1, const char *s2);
※文字列 *s1 の中で、*s2.. のいずれかの文字の最初の出現に位置づけし、その文字へのポインタを返す。発見できなかった場合は、NULLを返す。
◆strrchr()
│ #include <string.h>
│ char *strrchr(const char *s, int c);
※文字列 *s.. の中の文字 c の最後の出現に位置づけする。位置づけられた文字へのポインタを返す。発見できなかった場合は、NULLを返す。
◆strspn()
│ #include <string.h>
│ size_t strspn(const char *s1, const char *s2);
※文字列 *s1.. のなかで *s2.. の文字群で構成される先頭部分の長さを求めて返す。
◆strstr()
│ #include <string.h>
│ char *strstr(const char *s1, const char *s2);
※文字列 *s1.. の中で、*s2..(文字列末の空文字除く)とマッチする最初の出現に位置づけしたポインタを返す。マッチしなければNULLを返し、s2が長さ0であればs1を返す。
◆strtod()
│ #include <stdlib.h>
│ double strtod(const char *s, char **endptr);
※文字列 *s.. の最初の部分をdouble表現に変換し変換値を返す。変換が行われなかった場合は0を返す。先頭の空白文字類は読み飛ばされる。変換対象にならない末尾の認識不能文字列へのポインタがendptrの指すオブジェクトに格納される。
◆strtok()
│ #include <string.h>
│ char *strtok(char *s1, const char *s2);
※文字列 *s1.. を、*s2.. のいずれかの文字で区切られたトークンに分割する。1回目の呼び出し時に、s1を登録し、2回目以降は s1をNULLとすることで、トークンに分割していくことができる。s2を呼び出し毎に変えても良い。トークンへのポインタを返し、トークンが発見できなかった場合はNULLを返す。
◆strtol()
│ #include <stdlib.h>
│ long int strtol(const char *s,
│ char **endptr,
│ int radix);
※文字列からlong型への変換
※long型の範囲を超える大きな数を与えてもLONG_MAXが返る。
※数字の後に数字以外の文字が続く場合、エラーにならず数字部分のみが変換される。
※文字列 *s.. の最初の部分をlong int表現に変換し変換値を返す。
※変換が行われなかった場合は0を返す。先頭の空白文字類は読み飛ばされる。
※変換対象にならない末尾の認識不能文字列へのポインタがendptrの指すオブジェクトに格納される。
⇒radixが1の場合は、0のみ。radixが2~36の場合は、radixを基数とする英数字の列。radixが16の場合は、0x形式となる。
※strtol(3)
※strtolは成功時にerrnoの値を変更することはない
⇒予めerrnoに0を代入しエラー検出することができる。
※strtolは変換をやめた位置を第二引数にセットする
#include <stdlib.h> #include <stdio.h> #include <limits.h> #include <errno.h> int main(int argc, char *argv[]) { long val; char *end; errno = 0; val = strtol(argv[1], &end, 0); if (errno != 0) { perro("strtol"); exit(1); } if (end[0] != '\0') { fprintf(stderr, "Non-digit character: %c\n", end[0]); exit(1); } printf("%ld\n", val); }
◆strtoul()
│ #include <stdlib.h>
│ unsigned long int strtoul(const char *s,
│ char **endptr,
│ int radix);
※文字列 *s.. の最初の部分をunsigned long int表現に変換し変換値を返す。変換が行われなかった場合は0を返す。先頭の空白文字類は読み飛ばされる。変換対象にならない末尾の認識不能文字列へのポインタがendptrの指すオブジェクトに格納される。
radixが0の場合は、無符号整数定数、1の場合は、0のみ。radixが2~36の場合は、radixを基数とする英数字の列である。radixが16の場合は、0x形式となる。
◆strxfrm()
│ #include <string.h>
│ size_t strxfrm(char *s1, const char *s2, size_t n);
※*s1.. に *s2.. の最初のnバイトの文字を、LC_COLLATEで適切なものに変形した結果を格納する。変形後の文字列のバイト数を返す。返却値がn以上の場合は、*s1..の内容は不定。
◆syscall
※間接システムコール
◆system()
│ #include <stdlib.h>
│ int system(const char *s);
※シェルコマンドを実行する
※文字列 *s.. をコマンドプロセッサによって実行されるホスト環境に渡す。
※sにNULLポインタを与えた場合、コマンドプロセッサが存在すれば非0、存在しなければ0を返す。
※NULL以外の場合では、処理系定義の値を返す。
#include <stdlib.h>
int system(const char *command);
例)
system(“ls foo”);
◆tan()
│ #include <math.h>
│ double tan(double x);
※角度 x (ラジアン)の正接を計算する。
◆tanh()
│ #include <math.h>
│ double tanh(double x);
※浮動小数点値 x の双曲線正接を計算する。
double tanh(double x) { double p=exp(x), m=exp(-x); return (p-m)/(p+m); }
◆time()
│ #include <time.h>
│ time_t time(time_t *timer);
※現在の暦時間を返す。暦時間が向こうの場合は(time_t)-1を返す。timerがNULLで無い場合には*timerにも返却値を代入する。
◆tmpfile()
│ #include <stdio.h>
│ FILE *tmpfile(void);
※バイナリ一時ファイルを生成し、wb+モードでオープン、ストリームに対するポインタを返す。生成できなかった場合はNULLを返す。クローズされるときかプログラム終了時に削除される。
◆tmpnam()
│ #include <stdio.h>
│ char *tmpnam(char *s);
※存在するファイルと一致しない一時ファイル名を生成する。
◆tolower()
│ #include <ctype.h>
│ int tolower(int c);
※英大文字を英小文字に変換する。英大文字以外では無変換のまま返す。
◆toupper()
│ #include <ctype.h>
│ int toupper(int c);
※英小文字を英大文字に変換する。英小文字以外では無変換のまま返す。
◆ungetc()
│ #include <stdio.h>
│ int ungetc(int c, FILE *stream);
※バイト単位でバッファに戻す
⇒連続してungetc()はできない。1バイトだけ
※文字 c をunsigned char に変換し、入力ストリーム *stream に押し戻す。
※操作が成功すれば文字 c を返し、失敗すればEOFを返す。
※1つのstreamに対して連続してungetc()することは不可
※入力を単語に区切るときなどに使われる
│ getしたのが区切りと解釈できる意味のある文字だった
│ ⇒ungetcで戻して区切り処理をする
※ungetc(3)
#include <stdio.h>
int ungetc(int c, FILE *stream);
※文字列を読んで行って、「ではない」文字を読んで区切りと認識するような処理で使用する。
◆va_arg()
│ #include <stdarg.h>
│ type va_arg(va_list ap, type);
※va_start()により初期化された可変個引数集 ap から次の要素を、仮引数 type によって指定される返却値の型として返す。typeが合わないときの動作は未定義。
◆va_end()
│ #include <stdarg.h>
│ void va_end(va_list ap);
※va_start()により初期化された可変個引数集 ap を引数にとり、可変個引数関数から正常に戻る手段を与える。返却値無し。
◆va_start()
│ #include <stdarg.h>
│ void va_start(va_list ap, parmN);
※可変個引数処理のマクロ群で使われる可変個引数集 ap を初期化する。parmNは最終固定個仮引数の末尾を示す(「,…」の直前)仮引数である。
◆vfprintf()
│ #include <stdarg.h>
│ #include <stdio.h>
│ int vfprintf(FILE *stream,
│ const char *format,
│ va_list arg);
※可変個実引数の並びを、va_list型の実引数 arg に置き換えたfprintf関数と等価。成功した場合、転送されたバイト数を返す。エラーの場合は負の値を返す。
◆vprintf()
│ #include <stdarg.h>
│ #include <stdio.h>
│ int vprintf(const char *format, va_list arg);
※可変個実引数の並びを、va_list型の実引数 arg に置き換えたprintf関数と等価。成功した場合、転送されたバイト数を返す。エラーの場合は負の値を返す。
◆vsprintf()
│ #include <stdarg.h>
│ #include <stdio.h>
│ int vsprintf(char *s,
│ const char *format,
│ va_list arg);
※可変個実引数の並びを、va_list型の実引数 arg に置き換えたsprintf関数と等価。成功した場合、転送されたバイト数を返す。エラーの場合は負の値を返す。
◆wcscpy()
※strcpy相当
◆wcsncpy()
※strncpy相当
◆wcscat()
※strcat相当
◆wcsncat()
※strncat相当
◆wcscmp()
※strcmp相当
◆wcsncmp()
※strncmp相当
◆wcswc()
※strchr相当
◆wcscspn()
※strcspn相当
◆wcspbrk()
※strpbrk相当
◆wcsrwc()
※strrchr相当
◆wcsspn()
※strspn相当
◆wcswcs()
※strstr相当
◆wcstok()
※strtok相当
◆wcstombs()
│ #include <stdlib.h>
│ size_t wcstombs(char *s,
│ const wchar_t *pwcs,
│ size_t n);
※ワイド文字列 *pwcs.. を、対応する多バイト文字列に変換し、nバイトまで配列 *s.. に格納する。合計バイト数がnを超えた場合か、空文字を格納した場合に変換は終了する。書き込んだバイト数を返す。空文字は要素数に含まない。無効文字があった場合は、(size_t)-1を返す。
◆wctomb()
│ #include <stdlib.h>
│ int wctomb(char *s, wchar_t wchar);
※ワイド文字 wchar を多バイト文字の列 *s.. に変換する。sにNULLを指定した場合は、バイト数を返し、*sが空文字なら0
を返す。有効な文字でないなら-1。
☆非標準関数
◆alloca
※mallocとインタフェイスは同じ。
※メモリブロックを割り当てるが、ヒープでなくスタックにブロックを割り当てる。
※関数から戻ると自動的に廃棄される。
⇒FreeBSDでは、移植性に欠けるということで推奨されない。
⇒GNUでは、メモリリークを減らすという点で推奨される。
☆Debug
◎Assert
◆NDEBUG
※assertマクロをvoid式に変換する。
例)
#define NDEBUG
☆関数リスト
◎関数リスト:システム
◆abort()
◆assert()
◆atexit()
◆exit()
◆getenv()
◆localeconv()
◆longjmp()
◆perror()
◆raise()
◆setjmp()
◆setlocale()
◆signal()
◆strerror()
◆system()
◎関数リスト:オブジェクト
◆calloc()
◆free()
◆malloc()
◆offsetof()
◆realloc()
◎関数リスト:演算
◆abs()
◆acos()
◆asin()
◆atan()
◆atan2()
◆ceil()
◆cos()
◆cosh()
◆div()
◆exp()
◆fabs()
◆floor()
◆fmod()
◆frexp()
◆labs()
◆ldexp()
◆ldiv()
◆log()
◆log10()
◆modf()
◆pow()
◆rand()
◆sin()
◆sinh()
◆sqrt()
◆srand()
◆tan()
◆tanh()
◎関数リスト:入出力
◆clearerr()
◆fclose()
◆feof()
◆ferror()
◆fflush()
◆fgetc()
◆fgetpos()
◆fgets()
◆fopen()
◆fprintf()
◆fputc()
◆fputs()
◆fread()
◆freopen()
◆fscanf()
◆fseek()
◆fsetpos()
◆ftell()
◆fwrite()
◆getc()
◆getchar()
◆gets()
◆printf()
◆putc()
◆putchar()
◆puts()
◆remove()
◆rename()
◆rewind()
◆scanf()
◆setbuf()
◆setvbuf()
◆sprintf()
◆sscanf()
◆tmpfile()
◆tmpnam()
◆ungetc()
◆vfprintf()
◆vprintf()
◆vsprintf()
◎関数リスト:文字列、メモリ処理
◆mblen()
◆mbstowcs()
◆mbtowc()
◆memchr()
◆memcmp()
◆memcpy()
◆memmove()
◆memset()
◆strcat()
◆strchr()
◆strcmp()
◆strcoll()
◆strcpy()
◆strcspn()
◆strlen()
◆strncat()
◆strncmp()
◆strncpy()
◆strpbrk()
◆strrchr()
◆strspn()
◆strstr()
◆strxfrm()
◆wcscpy()
◆wcsncpy()
◆wcscat()
◆wcsncat()
◆wcscmp()
◆wcsncmp()
◆wcswc()
◆wcscspn()
◆wcspbrk()
◆wcsrwc()
◆wcsspn()
◆wcswcs()
◆wcstok()
◆wcstombs()
◆wctomb()
◎関数リスト:変換
◆atof()
◆atoi()
◆atol()
◆strtod()
◆strtol()
◆strtok()
◆strtoul()
◆tolower()
◆toupper()
◎関数リスト:判定
◆isalnum()
◆isalpha()
◆iscntrl()
◆isdigit()
◆isgraph()
◆islower()
◆isprint()
◆ispunct()
◆isspace()
◆isupper()
◆isxdigit()
◎関数リスト:時刻
◆asctime()
◆clock()
◆ctime()
◆difftime()
◆gmtime()
◆localtime()
◆mktime()
◆strftime()
◆time()
◎関数リスト:ユーティリティ
◆bsearch()
◆qsort()
◆va_arg()
◆va_end()
◆va_start()