Software_Cfuncs2

☆標準関数、マクロ

ANSI-Cを基本にLinux, Cygwin等で一般的に使用可能なものを含む

◎アルファベット順 G-R

◆getc()
│ #include <stdio.h>
│ int getc(FILE *stream);
※マクロとして実装されている場合があることを除いて fgetc() と等価。マクロとして実装されている場合、 stream を2度以上評価することになることがあるので steam は副作用のある式であってはならない。

※歴史的にバイト単位入出力のような小さい操作はマクロで実装した方が速いとされて存在していたもの。GNU libcではfgetc()でもget()でも速度は同じ

◆getchar()
│ #include <stdio.h>
│ int getchar(void);
※実引数にstdinを持つ getc 関数と等価。
⇒getc(stdin)
※stdin固定のfgetc()相当
※getchar(3)

◆getenv()
│ #include <stdlib.h>
│ char *getenv(const char *str);
※環境変数から文字列 *str と一致する名前を検索し、その値に結び付けられた文字列へのポインタを返す。名前が見つからないときには NULL ポインタを返す。
※返却値が指す文字列を変更してはならない。環境変数を変更する方法は処理系依存。

◆getopt()
│ #include
│ int getopt(int argc, char * const argv[], const char *optstring);

│ extern char *optarg;
│ extern int optind, opterr, optopt;

※コマンドライン引数argc, argvにたいし、getoptを呼び出す毎にオプション文字(-を除く)を得る
※optstringには受け付けるオプション文字を与える。
※文字の後の:は、オプションに引数があることを示す。
※引数へのポインタが変数optargに代入される。
※オプション文字列の先頭に+を置くと、オプション対象の操作は非オプション文字列が現れた時点で終了
※デフォルトで、argvの順序を変更しオプションを前にもってくる。
※指定外のオプションが見つかると標準エラーにエラーを出力し、optoptにオプション文字を保存し、’?’を返す。
※変数opterrに0を代入することでエラーの出力を抑止。
※オプションがそれ以上ないと-1を返す。そのときoptindは、オプションでない最初のargvを示す。

※オプション解析API. ショートオプションだけを認識する

※呼び出す毎に「次のオプション」を返し、オプションがなくなれば-1を返すので、「!= -1」でチェックしながらwhileループを回す。

※関連するグローバル変数
char* optarg  現在処理中のオプションパラメータ
int optind    現在処理中のargvでのインデックス
int optopt    現在処理中のオプション文字
int opterr    真ならエラー時にgetopt()がメッセージ表示をする

※「-」で終了した場合は、optindは「-」を指して終了する
※「–」で終了した場合は、optindは、「–」の次を指して終了する

※GNU libcのgetopt()では、オプションがオプション以外のファイル名などの後に現れても受け付ける。伝統的実装ではオプションは常に先に書かねばならない
例)

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
    int flags, opt;
    int nsecs, tfnd;

    nsecs = 0;
    tfnd = 0;
    flags = 0;
    while ((opt = getopt(argc, argv, "nt:")) != -1) {
        switch (opt) {
        case 'n':
            flags = 1;
            break;
        case 't':
            nsecs = atoi(optarg);
            tfnd = 1;
            break;
        default: /* '?' */
            fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    }

    printf("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);

    if (optind >= argc) {
        fprintf(stderr, "Expected argument after options\n");
        exit(EXIT_FAILURE);
    }

    printf("name argument = %s\n", argv[optind]);

    /* Other code omitted */

    exit(EXIT_SUCCESS);
}

◆getopt_long()

#define _GNU_SOURCE
#include <getopt.h>

int getopt_long(int argc, char * const argv[],
    const char *optdecl,
    const struct option *longoptdecl,
    int *longindex);

struct option {
    const char *name;
    int has_arg;
    int *flags;
    int val;
};

extern char *optarg;
extern int optind, opterr, optopt;

※ロングオプションも解析できるAPI
※第3引数まではgetopt()と同じ

※第4引数に struct optionという構造体の配列を使ってロングオプションの仕様を与える。配列の最後はすべてのメンバを0にする
│ name  ロングオプション名文字列
│ has_arg  no_argument(0)、パラメータをとらない
│     required_argument(1)、パラメータ必要
│     optional_argument(2)、とるかもしれない
│ flag  NULL、valメンバの値を返す
│     非NULL、0を返し、*flagsにvalメンバの値代入
│ val    falgsで指定される返却値
⇒例えばflagをNULLにして、valを文字’h’としてロングオプション”help”にひもづけておけば、–helpにたいしてショートオプション-hを返すこともできる
⇒flagの非NULLの使い方としては、flagにポインタを与えておき、直接valの値をポインタの指す変数に代入するという方法がある。

例)

#include <stdio.h>
#include <stdlib.h>

#define _GNU_SOURCE
#include <getopt.h>

static void do_head(FILE *f, long nlinse);

#define DEFAULT_N_LINES 10

static struct option longopts[] = {
    {"lines", required_argument, NULL, 'n'},
    {"help",  no_argument,       NULL, 'h'},
    {0,0,0,0}
};

int
main(int argc, char *argv[])
{
    int opt;
    long nlines = DEFAULT_N_LINES;
    
    while ((opt = getopt_long(argc, argv, "n:", longopts, NULL)) != -1) {
        switch (opt) {
        case 'n':
            nlines = atoi(optarg);
            break;
        case 'h':
            fprintf(stdout, "Usage: %s [-n LINES] [file file...]\n", argv[0]);
            exit(1);
        case '?':
            fprintf(stderr, "Usage: %s [-n LINES] [file file...]\n", argv[0]);
            exit(1);
        }
    }
    
    if (optind == argc) {
        do_head(stdin, nlines);
    } else {
        int i;
    
        for (i = optind; i < argc; i++) {
            FILE *f;
    
            f = fopen(argv[i], "r");
            if (!f) {
                perror(argv[i]);
                exit(1);
            }
            do_head(f, nlines);
            fclose(f);
        }
    }
    exit(0);
}

static void
do_head(FILE *f, long nlines)
{
    int c;
    
    if (nlines <= 0) return;
    while ((c = getc(f)) != EOF) {
        if (putchar(c) < 0) exit(1);
        if (c == '\n') {
            nlines--;
            if (nlines == 0) return;
        }
    
}

◆getpid(2)
プロセスIDを得る

◆gets()
│ #include <stdio.h>
│ char *gets(char *s);
※stdin から配列 *s にファイル末尾直前か、改行文字の直前まで文字を読み込む。改行文字は捨てられる。読み込まれた文字列の末尾には空文字が付加される。成功時にはsを返すが、読み込めなかった場合は NULL を返す。
※gets(3)
※バッファサイズを示す引数がない
⇒バッファオーバーフローを起こす
⇒この関数は使用しないこと

◆gmtime()
│ #include <time.h>
│ struct tm *gmtime(const time_t *timer);
※暦時間 *timer を協定世界時(UTC)に変換する。変換した詳細時間型のポインタを返す。UTCが有効でない場合は、NULL を返す。

◆isalnum()
│ #include <ctype.h>
│ int isalnum(int c);
※英数字判定。英数字には非0を返し、非英数字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆isalpha()
│ #include <ctype.h>
│ int isalpha(int c);
※英字判定。英字には非0を返し、非英字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆iscntrl()
│ #include <ctype.h>
│ int iscntrl(int c);
※制御文字判定。制御文字には非0を返し、非制御文字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆isdigit()
│ #include <ctype.h>
│ int isdigit(int c);
※10進数字判定。10進数字には非0を返し、非10進数字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆isgraph()
│ #include <ctype.h>
│ int isgraph(int c);
※図形文字(空白を除く印字文字)判定。図形文字には非0を返し、非図形文字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆islower()
│ #include <ctype.h>
│ int islower(int c);
※英小字判定。英小字には非0を返し、非英小字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆isprint()
│ #include <ctype.h>
│ int isprint(int c);
※印字文字判定。印字文字には非0を返し、非印字文字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆ispunct()
│ #include <ctype.h>
│ int ispunct();
※区切り文字判定。区切り文字には非0を返し、非区切り文字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。
※区切り文字は、空白以外のisalnum関数が偽の印字文字。

◆isspace()
│ #include <ctype.h>
│ int isspace();
※空白文字判定。空白文字には非0を返し、非空白文字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。
※標準空白類文字は、空白に加え、FF(\f),LF(\n),CR(\r),HT(\t),VT(\v).

◆isupper()
│ #include <ctype.h>
│ int isupper(int c);
※英大字判定。英大字には非0を返し、非英大字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。

◆isxdigit()
│ #include <ctype.h>
│ int isxdigit(int c);
※16進数字判定。16進数字には非0を返し、非16進数字には0を返す。検査する文字 c は0-UCHAR_MAXもしくはEOFであり、多バイト文字を与えた場合の動作は処理系依存となる。
※16進数字は、0~9、A~F、a~f

◆labs()
│ #include <stdlib.h>
│ long int labs(long int);
※長整数の絶対値を計算する。結果が表現できない場合の動作は未定義。多く、最小負数LONG_MINの返却値は表現できないのでそのままとなる。

◆ldexp()
│ #include <math.h>
│ double ldexp(double x, int n);
※仮数部xと2の指数部nから浮動小数点数を合成する。結果が大きすぎたり小さすぎたりすると範囲エラーとなる。

◆ldiv()
│ #include <stdlib.h>
│ ldib_t ldiv(long int numer, log int denom);
※分子 numerの分母denomによる除算の商(QUOTient)と剰余(REMainder)を計算し、ldiv_t型の構造体を返す。
│ 例)
│ ldiv_t d;
│ d=ldiv(1000000L, 123456L)
│ printf(“%ld %ld”,d.quot,d.rem);

◆localeconv()
│ #include <locale.h>
│ struct lconv *localeconv(void);
※現在地域の既定による書式の値を保持する構造体lconvへのポインタを返す。
│ 例)
│ struct lconv *a;
│ a=localeconv();

◆localtime()
│ #include <time.h>
│ struct tm *localtime(const time_t *timer);
※暦時間 *timerを、localtimeで表した詳細時間に変換し、構造体へのポインタを返す。

◆log()
│ #include <math.h>
│ double log(double x);
※eを底とするxの対数を計算する。自然対数。xが負の場合は定義域エラー。0の場合は範囲エラー。

◆log10()
│ #include <math.h>
│ double log10(double x);
※10を底とするxの対数を計算する。常用対数。xが負の場合は定義域エラー。0の場合は範囲エラー。

◆longjmp()
│ #include <setjmp.h>
│ void longjmp(jmp_buf env, int val);
※setjmp関数形式マクロによって退避された環境envを回復する。回復によって関数間の移動がなされ、setjmpマクロが値valを返したようにプログラムは実行される。ただし、setjmpマクロは0を返せない。また、longjmp()の実行の結果、longjmp呼び出し側には戻らないので、戻り値も存在しない。

◆malloc()
│ #include <stdlib.h>
│ void *malloc(size_t size);
※区画の大きさがsizeバイト以上の領域(実際の大きさは不確定)を割り当てる。領域は初期化しない。
※返却値は、割付られた領域へのポインタである。領域が割付できなかった場合はNULLを返す。

◆mblen()
│ #include <stdlib.h>
│ int mblen(const char *s, size_t n);
※多バイト文字*sを構成しているバイト数を計算する。検査するのは先頭のnバイトまで。

◆mbstowcs()
│ #include <stdlib.h>
│ size_t mbstowcs(wchar_t *pwcs, const char *s,
│  size_t n);
※初期シフト状態で始まる多バイト文字列 *s を対応するワイド文字列に変換し、n個のコードまで、配列 *pwcs に格納する。空文字以降は変換されず、空文字を除く変更した配列の要素数を返す。無効な多バイト文字があった場合は、size_tでキャストした-1を返す。

◆mbtowc()
│ #include <stdlib.h>
│ int mbtowc(wchar_t *pwc, const char *s, size_t n);
※多バイト文字 *s をワイド文字 *pwc に変換する。*sの最大nバイトに一致するワイド文字コードの値を決定する。多バイト文字を構成しているバイト数を返すが、空文字なら0、無効な多バイト文字のときは-1を返す。

◆memchr()
│ #include <string.h>
│ void *memchr(const void *s, int c, size_t n);
※オブジェクト *s の先頭の n バイトの文字の中の文字 c の最初の出現に位置づけし、その文字へのポインタを返す。発見できない場合は、NULLを返す。

◆memcmp()
│ #include <string.h>
│ int memcmp(const void *s1,
const void *s2, size_t n);
※オブジェクト *s1 *s2 の最初の n バイトの文字を比較し、負、0、正の整数を返す。
※境界整列のための詰め物の内容は不定なので比較において問題を生じる可能性がある。

◆memcpy()
│ #include <string.h>
│ void *memcpy(void *s1, const void *s2, size_t n);
※オブジェクト *s1 に、*s2 の最初の n バイトの文字を複写する。s1を返す。空文字\000があっても複写はおこなわれるが、空文字が自動的に付加されることはない。オブジェクトが重複している場合の動作は未定義。

◆memmove()
│ #include <string.h>
│ void *memmove(void *s1, const void *s2, size_t n);
※オブジェクト *s1 に、*s2 の最初の n バイトの文字を複写する。オブジェクトが重複している場合も複写は正しく行われる。

◆memset()
│ #include <string.h>
│ void *memset(void *s, int c, size_t n);
※オブジェクト(記憶域)*s の最初の n バイトを c の値に設定(set)する。sを返す。
例)
│ static char buf[128];
│ memset(buf, 0, sizeof(buf));

◆mktime()
│ #include <time.h>
│ time_t mktime(struct tm *tmptr);
※地域時間を表現している詳細時間 *tmptr を暦時間に変換して返す。暦時間に表現できない場合は、(time_t)でキャストされた-1を返す。

◆modf()
│ #include <math.h>
│ double modf(double x, double *iptr);
※浮動小数点値 x を、整数部と小数部に分割し、*iptr に整数部をdoubleで格納し、符号付小数部を返す。

◆offsetof()
│ #include <stddef.h>
│ size_t offsetof(s_name, m_name);
※構造体メンバのオフセット値(構造体の最初を起点とするバイト単位)を示すマクロ。
│ s_name 構造体名
│ m_name メンバ名

◆perror()
│ #include <stdio.h>
│ void perror(const char *s);
※errnoの値に対するエラーメッセージを標準エラー出力ストリームに出力する。sがNULLか、*sが空文字の場合は、処理系定義のエラーメッセージと改行を出力し、sが文字列をさせば、その文字列、コロン、空白、処理系定義のエラーメッセージ、改行を出力する。返却値はなし。

◆pow()
│ #include <math.h>
│ double pow(double x, double y);
※x の y 乗を求める。
※x == 0 && y <= 0 か、x < 0 で y が汎整数値でない場合は、定義域エラーとなる。

◆printf()
│ #include <stdio.h>
│ int printf(const char *format, …);
※出力書式文字列 *format の制御のもとに、つづく可変個の実引数を変換し、標準出力ストリームに出力する。第1引数がstdoutであるfprintf関数と等価。
※転送されたバイト数を返す。出力エラーの場合は負の値を返す。

※問題点
標準入力から1行よんで、そのままprintfするようなケースでは、文字列に「%」が入っていると問題が発生する。(引数をとろうとするが指定されていないので、メモリ配置次第で何が起こるかわからない)
⇒致命的
⇒標準入力から読んだ文字列をそのまま出力する場合には、面倒でもfputs()をstdoutにむけるか、改行文字を取り除いてからputs()を使う

※バッファリング
printfの出力は通常設定では一端バッファに保持される
出力は以下条件でおこる

①バッファサイズを超えた
②fflush(stdout)で強制的に書きだしたとき
③改行コードが到来したとき

※FILE構造体のバッファ使用については setvbuf をみよ

◆putc()
│ #include <stdio.h>
│ int putc(int c, FILE *stream);
※文字のファイル出力。マクロとして実現されていることがある場合を除いてfputc関数と等価。
│ c 出力文字
│ *stream 出力ストリーム
※cはunsigned charに変換した上で書き込まれる。通常は書かれた文字cを返却するが、エラー時にはEOFを返す。
※歴史的にバイト単位入出力のような小さい操作はマクロで実装した方が速いとされて存在していたもの。

◆putchar()
│ #include <stdio.h>
│ int putchar (int c);
※実引数にstdoutをもつputc関数と等価。
⇒putc(c, stdout)
※stdout固定のfputc()相当
※putchar(3)

◆puts()
│ #include <stdio.h>
│ int puts(const char *s);
※stdoutに、文字列 *s を書き込む。出力に改行文字を付け加える。空文字はかかれない。成功した場合は非負の値を返し、書き込みエラーが生じた場合はEOFを返す。

※fputs()と異なり、出力がsdtout固定、かつ\nが付加される。

◆qsort()
│ #include <stdlib.h>
│ void qsort(
│  void *base,
│  size_t n,
│  size_t size,
│  int (*fnc)(const void*, const void*)
│ );
※配列データを並べ替える。一般的にはクイックソートによる。返却値は存在しない。
│ *base ソートする配列の格納場所
│ n 要素の個数
│ size 要素の大きさ
│ fnc intを返す比較用の関数。
│  (*fnc) 関数 fnc へのポインタ
│  (const void *, const void*) 2つのconst void*型引数をとる。
※比較関数
①返す値(引数a, 引数b)
│ a < b のとき 0 より小さい整数 │ a > b のとき 0 より大きい整数
│ a == b のとき 0
②整数比較の例

int int_comp(const void *_a, const void *_b)
{
  int a = *(int *)_a;
  int b = *(int *)_b;
  
  if (a < b) { return -1; } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
}

※比較関数の仮引数は,どのような型の変数でも受け取れるように void 型のポインタ
※受け取った変数の値を参照するために,実際の型へキャスト
※上例では,一度 int 型のポインタにキャストしてから,さらに間接参照によって int 型の変数へ値を代入している.

◆raise()
│ #include <signal.h>
│ int raise(int sig);
※シグナル番号 sig を実行中のプログラムに送信する。成功した場合は0を、不成功の場合は非0を返す。

◆rand()
│ #include <stdlib.h>
│ int rand(void);
※0~RAND_MAXの範囲の擬似乱数整数列を計算し、その値を返す。

◆realloc()
│ #include <stdlib.h>
│ void *realloc(void *ptr, size_t size);
※再割付けにより、領域 *ptr の大きさを size バイトに変更する。新旧の大きさの小さい方までの内容は変わらない。また、割付けできなった場合も内容は変わらない。
※ptrがNULLの場合は、mallocと同等の動作をする。
※ptrがcalloc, malloc, realloc関数が返した値と一致しない場合の動作は未定義。既に開放済みの場合の動作も見て意義。※sizeが0で、ptrがNULLでない倍は、freeと同等の動作をする。
※再割付が成功した場合は、割り付けられた領域へのポインタを返す。領域が割り付けられなかった場合はNULLを返す。

◆regcomp()
│ #include <sys/types.h>
│ #include <regex.h>
│ int regcomp(regex_t *reg, const char *pattern,
│   int flags);
※文字列で表現されている正規表現パターン pattern を専用のデータ型 (regex_t)に変換しregに書き込む。
※regの指すメモリを割り当ててポインタを渡す。
⇒内部で確保されるメモリがあるので、それを開放するためにregfree()関数を使用する
※成功したら0を返し、失敗したらエラーコードを返す。

◆regerror()
│ #include <sys/types.h>
│ #include <regex.h>
│ size_t regerror(int errcode, const regex_t *reg,
│   char *msgbuf, size_t msgbuf_size);
※regcomp()が返すエラーコードをメッセージに変換する

◆regexec()
│ #include <sys/types.h>
│ #include <regex.h>
│ int regexec(const regex_t *reg, const char *string,
│   size_t nmatch, regmartch_t pmatch[], int flags);
※regcomp()で設定した regex_t 型メモリを使って実際の文字列stringを照合
※適合するなら0、しなければ定数REG_NOMATCHを返す。

◆regfree()
│ #include <sys/types.h>
│ #include <regex.h>
│ void regfree(regex_t *reg);
※regcomp()関数で確保した領域を開放

◆remove()
│ #include <stdio.h>
│ int remove(const char *filename);
※ファイルをアクセス不能(通常は削除)する。
※ファイル名文字列 *filename で指定される。
※成功した場合は、0を、失敗した場合は非0を返す。

◆rename()
│ #include <stdio.h>
│ int rename(const char *old, const char *new);
※ファイル名 *old なるファイルを *new という名に改名
※成功した場合は0を、失敗した場合は非0を返す。
※既に new と同じファイル名が存在している場合の動作は処理系依存。

◆rewind()
│ #include <stdio.h>
│ void rewind(FILE *stream);
※ストリーム *stream のファイル位置指示子をファイルの先頭に設定しファイル先頭に移動
※返却値無し。
※ファイル終了指示子、ファイルエラー指示子も初期化される。
※fseek()の特殊な状況