STEP 7 - 標準関数 │ ├ ヘッダファイル ├ プロトタイプ宣言 ├ メモリ割り当て関数 │ ├ malloc関数 │ └ free関数 ├ データ変換の関数 │ ├ atoi関数 │ ├ atol関数 │ ├ atof関数 │ ├ toupper関数 │ ├ tolower関数 │ ├ itoa関数 │ └ ltoa関数 ├ 文字列を操作する関数 │ ├ string.h │ ├ strcpy関数 │ ├ strlen関数 │ ├ strcat関数 │ ├ strcmp関数 │ ├ strncpy関数 │ └ strncat関数 ├ 時間に関する関数 │ ├ time.h │ └ time関数 └ 計算用の関数 └ math.h |
Written by Yuki. http://ftc.suki.net/ |
printf や scanf 等、予め用意されているものが標準関数である。
<ヘッダファイル> 最初に必ず書くインクルード句は、それ自体が一つの関数であり、これがヘッダファイルになっている。 #include <stdio.h> ' <stdio.h>の中に関数が用意されており #include でプログラムに取り込む。 ヘッダファイルの例 stdio.h ' Standard Input/Output(標準入出力) stdlib.h , math.h , time.h , string.h , conio.h 等。
<プロトタイプ宣言> ヘッダファイルには関数の使用法等が書かれたプロトタイプ宣言が入っている。 ヘッダファイルを書かないと、最初から入っている標準関数を使用できなくなる。 ↓戻り値データ型 char *gets(char *); ' get関数の使用書式 ↑引数データ型 ・gets関数 戻り値 : char型のポインタ 引数 : char型のポインタ
<メモリ割り当て関数> コンピュータのメモリ上に一定量の領域の確保・解放を行う関数。stdlib.h(Standard Libraly)が必要。 ・malloc関数 void *malloc(size_t); ' Memory Allocate(unsigned int) 引数のバイト数分のメモリを確保する。 引数は確保するバイト数。戻り値は void型のポインタ。データ型不定アドレス。 (使用例)メモリを 40バイト確保して、戻り値を整数型ポインタへ記憶する。 #include <stdlib.h> int *p; p=(int *)malloc(sizeof(int)*10); ' 整数型ポインタの為に戻り値のアドレスを型キャストする。 ↑この場で 4バイト。×10で 40バイト確保。 ・free関数 void free(void *); ' 実際には前の voidは書かない。括弧内はポインタであること。 malloc関数等で確保したメモリを解放する(変数・配列は不可)。引数は解放するアドレスを指すポインタ。 ※malloc関数で確保したメモリは解放しない限り存在し続けるので、使ったら直に解放した方が良い。 こういった引数に変動を与える関数は、基本的にポインタを使用する。
<データ変換の関数> (1)int型の値を文字列に変換したり、その逆を行ったりする関数。stdlib.hが必要。 ・atoi関数(Ascii to Integer) int atoi(char *); 引数の文字列を int型の数値へ変換する。引数は文字列の先頭アドレスだが、 数値に変換できる値でなくてはならない。戻り値は int型に変換された数値、ないし 0になる。 (使用例) int i[3]; char str[]="256"; char *sp=str; i[0]=atoi("100"); ' 配列の 1番目に文字列 100を数値にして代入。 i[1]=atoi(str); ' 2番目に文字列変数の内容、つまり "256" を数値にして代入。 i[2]=atoi(sp); ' 3番目にポインタの内容を(結果的に "256" を数値にして)代入。 i[0]=atoi("abc"); ' 文字等、数値に変換できない場合は、0が代入される。 printf("%d\n",i[0]); ・atol関数(Ascii to Long Integer) long integer atol(char *); 文字列を long型に変換する。戻り値が long型である以外は、atoiと同じ。 例えば printf等で "%d" が "%l" に変わる。 ・atof関数(Ascii to Float) double atof(char *); ' この関数は double型で書かなければならない。 基本は変わらないが float ではなく double で記述する。 (使用例) float f; f=(float)atof("3.14"); ' 戻り値と型が一致しないので、型キャストする。 (2)英文字の大文字を小文字(又、その逆)に変換する。stdlib.hが必要。 ・toupper関数 int toupper(int); 英文字の小文字を大文字へ変換する。引数は小文字のキャラクターコード。戻り値は変換された大文字のコード。 ・tolower関数 int tolower(int); 英文字の大文字を小文字へ変換する。引数は大文字のキャラクターコード。戻り値は変換された小文字のコード。 (使用例) char ch; ch=toupper('a'); ' 変数chに小文字の aを代入。97と判断され関数により printf("%c\n",ch); ' 大文字の 65(A)に変換される。%cなので 'A'と出力される。 ch=tolower(ch); ' 65を関数により97に変換し、変数にいれる。 printf("%c\n",ch); ' 変数の値を%cで出力。'a'が表示される。 ※大文字のキャラクターコードなので、intの範囲は 65〜90 の間になる。 小文字の場合は 97〜122 の間で指定する。 ※'1'や'\'等が代入された場合、入っている文字をそのまま出力する。 尚、この関数では文字列は扱えない。 (3)数値を文字列に変換する関数。atoi , atol関数と全く逆の関数。但し書式は違う。 ・itoa関数(Integer to Ascii) char *itoa(int,char *,int); ' それぞれを第一引数・第二引数・第三引数という。 @ A B int型の数値を文字列へ変換する。 引数@は変換するint型の数値。 引数Aは変換した文字列を格納するメモリ上の先頭アドレス(変換したものを代入する対象)。 引数Bは何進数で変換するかを指定する(2なら2進・8なら8進・10なら10進数で変換する)。 戻り値はAのアドレス。 ・ltoa関数(Long to Ascii) char *ltoa(long int,char *,int); itoaと基本的に変わらない。@が int から long に変わっているだけである。 (使用例) char str[256]; itoa(100,str,10); ' 100を10進数で文字列へ変換。 puts(str); ' 文字列 "100"の入ったstrを出力。 ltoa(200l,str,10); puts(str);
<文字列を操作する関数> ヘッダファイル string.h ・strcpy関数(String Copy) char *strcpy(char *,char *); @ A Aのアドレスの文字列を@のアドレスの文字列へコピーする。 引数@は、コピー先の char型配列のアドレス。 引数Aは、コピー元の char型配列のアドレス。 戻り値は@のアドレス。 ・strlen関数(String Length) int strlen(char *); 引数の文字列の長さ(文字数)をカウントする。但しヌル文字はカウントしない。 引数は調べる対象となる文字列の先頭アドレス。戻り値はカウントされた文字数。 (使用例) #include <string.h> char str[]="01234"; ' ヌル文字含め 6文字。 int i; i=strlen(str); ' iには 5が入る。 ・strcat関数(String Conatenate) char *strcat(char *,char *); @ A @の文字列にAの文字列を連結する。 引数@は、連結先の char型配列のアドレス。 引数Aは、連結元の char型配列のアドレス。 戻り値は@のアドレス。 (使用例) char str00[256]="012"; char str01[256]="abc"; char str02[256]; char *sp; ' 戻り値用にポインタ変数を置く。 sp=strcpy(str02,str00); ' str02 に str00 の内容 "012" をコピー。この時 sp には@の puts(sp); ' 先頭アドレスの内容、つまりコピーされた内容が入る。 sp=strcat(str00,str01); ' str00 と str01 を連結。この場合 sp には、@・Aの連結結果が入る。 puts(sp); ' 連結された内容は str00 に入り、str01 は元のままである。 ・strcmp関数(String Compare) int strcmp(char *,char *); @ A @とAの文字列を比較する。辞書の並びを基準に大小を比較する。引数は@・Aとも比較する文字列。 戻り値は整数で、その整数が正の時(@>A)は、@の文字がAの文字より後という事になる。 0の時は、@とAの文字列が同じである事を表す。負の時(@<A)は、@がAより前にある事を表す。 str00[]="abc",str01[]="abc" の時、戻り値は 0。 str00[]="abc",str01[]="aba" の時、cは aより後。よって戻り値は正(値は 1)。 str00[]="abc",str01[]="abd" の時、cは dより前。よって戻り値は負(値は -1)。 ・strncpy関数(String N Copy) char *strncpy(char *,char *,int); @ A B Aの文字列を@へ、Bで指定した数(文字数)だけコピーする。 引数@は、コピー先アドレス。 引数Aは、コピー元アドレス。 引数Bは、文字数の指定。 戻り値は@のコピー先のアドレス。 (使用例) char str00[]="01234"; ' str00 に文字列を入力。 char str01[256]; strncpy(str01,str00,3); ' str01 に str00 の 3文字をコピー。 puts(str01); ' str01 の内容は "012" になる。 ・strncat関数(String N Cancatenate) char *strncat(char *,char *,int); @ A B @の文字列へ、Aの文字列からBで指定した数(文字数)だけ連結する。 引数@は、連結先アドレス。 引数Aは、連結元の文字列アドレス。 引数Bは、文字数の指定。 戻り値は@の連結先のアドレス。 (使用例) char str00[256]="012"; char str01[256]="abc"; ' この関数では連結する側にも要素数を指定しておく必要がある。 strncat(str00,str01,2); ' str00 へ str01 の内容の頭 2文字を連結する。 puts(str00); ' str00 の内容は "012ab" となる。
<時間に関する関数> ヘッダファイル time.h ・time関数 ↓intと同じ型。 time_t time(time_t *); ↑int型でも良い。 1970/01/01 から現在までの経過時間を秒数で返す。引数は、経過秒数を格納する変数のアドレス。 (使用例) #include <time.h> int i,j; time_t ti,tj; ' 時間を確実に使うための変数。実際には intと変わらない。 tj=time(&ti); ' tjに時間計測の結果が代入される。 j=(int)time((time_t *)&i); ' 型キャストし、iに時間計測の結果を格納し、 printf("%d %d\n",ti,tj); ' 更に型キャストして、戻り値を jに代入する。 printf("%d %d\n",i,j); ' それぞれに経過時間の数値が入る。
<計算用の関数> ヘッダファイル math.h ・殆どの関数の戻り値と引数は double型。 abs(x)のみ、引数・戻り値は int型。
← ← Back to BeforeStep | Go to NextStep → → |