lC言語 組込み関数(1) '97. 8. 9  
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
.C言語_ 3 フォ-マットコ-ド 6 演算子 9 FOR  集合デ-タ  目的別
1 表示してみる 4 変数と定数 7 条件判断 10 WHIILE  ポインタ     
2 エスケ-プ コ-ド 5 デ-タ入力 8 分岐   未使用  関数   ★ 
exit( ) のインクルードファイルが違っていました。stdio.h → (正)process.h
字数指定コピー memcpy() の、コピー元(s)と コピー先(d)が、逆になっていました。 '98. 5 訂正。
出力(表示)関数   入力   文字列のコピー  文字列/数値変換   文字列の比較   三角関数など   乱数   プログラムを終了  スタックの残り  

include ファイルの中にはたくさんの関数が入っていますが、以下はその一部です。
これ以外にも、MS-DOS のサブルーチンを呼び出す _dos_open などの DOS コールや、 far_strupr などの long 型のポインタを扱う関数など多数あります。

プロトタイプの見方(返り値, 関数名, 引数 の意味。)
 例 
返り値型関数名(引数型引数)
doublsin(doublex)

関数の返り値を利用するには
プロトタイプで示されている型と同じ型の変数を用意して、そこに代入します。
#include <必要なインクルードファイル>
プロトタイプで示されている返り値の型 変数名;  変数を宣言します。
変数 = 関数名(引数);   変数に処理結果が代入されます。
引数は、プロトタイプで示されている型の変数(または定数)を書きます。
 例 
#include <math.h>
doubl X;
X = sin(1.047);
  メモ
角度の単位はラジアン(rad)
60°= 60×2π/360°= 1.047 rad

変数に代入しないでそのまま利用する場合。
 例 
#include <stdio.h> ← printf を使うために必要。
#include <math.h> ← sin を使うために必要。
printf("%f",sin(1.047) );

返り値
void : 返り値はありません。
int : int 型の数値。
char * : char 型の変数または変数配列への、ポインタ。
size_t : stdlib.h で定めているユーザー定義型。unsigned の別名。
time_t : time.h で定めているユーザー定義型。unsigned の別名。
struct tm * : time.h で宣言されている構造体 tm へのポインタ。
FILE * : stdio.h で定めているユーザー定義型 FILE へのポインタ。
 FILE は stdio.h で定義されているストラクチャの構造の別名です。
 stdio.h では、ストラクチャの構造を宣言しているだけです。
 関数が実行されるとファイルを操作するためのデータが作られ、そのポインタが返されます。
 データを使うには、そのポインタを使ってアクセスします。
NULL : 数値 0 および 空文字 \0 の別名。
 (数値 0, 空文字 \0 は、16進数では 00 で、同じデータです。)

引数
const : その引数が関数によって変更されないことを意味します。
int c : int 型の変数または定数。X, Y, 41, 'A' など。
 c はそのデータがキャラクタ(文字)であるという意味です。
double x : double 型の変数または定数。X, Y,12345678 など。
 x はそのデータが数値であるという意味です。
char *s : char 型変数配列のポインタまたは文字列定数。X,"ABC"など。
 s はそのデータが文字列(String)であるという意味です。
 ただし、%d, %c など、変数を指定するフォーマットコードが使用できる関数の場合は、変数のポインタではなく、変数そのもの(または定数)を書きます。
FILE *stream : FILE(上記の 返り値 参照)へのポインタ。
 stream は、そのデータがストリーム(データの入出力先)を示すという意味です。
 基本的なストリームを指定するためのポインタはCコンパイラが用意しているので、宣言する必要はありません。
 stdin : 標準入力。(キーボード)
 stdout : 標準出力。(ディスプレー)
 stderr : 標準エラー出力。リダイレクトされている場合でも標準出力に出力します。
 標準入出力は、プログラムの起動時に変更(リダイレクト)できます。
 リダイレクトについては MS-DOS のページ参照。
 ... : 任意個の引数を表わしています。

出力(表示)関数 (Include = stdio.h)
返り値型関数名(引数型 引数)
intprintf("文字列およびフォーマットコード", 変数名または定数)
複数の変数または定数を使用するときは , で区切って書きます。
解説書には次のように書かれている場合もあります。
"文字列およびフォーマットコード" → const char *format と書かれている
変数名または定数 → ... と書かれている
""の中の文字列はそのまま表示されます。
文字列の中にフォーマットコードが書かれているときは、
右側に書かれている変数に置き換えられて表示されます。
従って、フォーマットコードと変数は同じ数だけ書きます。

文字配列の文字を表示する場合
文字配列の文字は、配列のポインタまたは文字列そのものを指定します。
ポインタを使う例
char s[12]="ABC";
printf("%s\n",s);
 %s は s の文字列に置き換えて表示されます。

文字列を直接使う例
printf("%s\n","ABC");
 %s は "" の中の ABC に置き換えて表示されます。

文字列変数に改行コードが含まれている場合は、一つのフォーマットコードによって表示されるのは改行コードまでだけです。
複数行を表示する場合は、表示する行数と同じ数のフォーマットコードを書きます。
char s[12]="ABC\nDEF\nGHI\n"; を表示する場合。
printf("%s\n%s\n%s\n",s);

ストリーム(出力先)を指定出力
int fprintf(FILE *stream,"文字列およびフォーマットコード",char *s)
引数の FILE *stream は、ストリームを FILE 型のポインタで指定するという意味です。(詳細は後記の「文字列の入力」参照。)
あらかじめ決められているポインタを使うこともできます。
stdout : 標準出力(ディスプレー)。この指定を省略したものが printf 。
stderr : 標準エラー出力。=そのプログラムがリダイレクトされている場合でも標準出力に表示します。

fprintf(stderr,"入力の値が違っています。\n");
出力先にファイルを指定することもできますが、そのためには fopen を使って、引数 stream の値を決めておく必要があります。
 → (2) のページ fopen 参照。


文字列の入力 (include = stdio.h)
char * gets(char *s)
標準入力(キーボード)から、ポインタ s で示される配列に、1行分の文字列を入力します。
改行コードは入力されません。文字列の最後には \0 が付加されます。
用意した配列より長い文章を入力すると、誤動作します。
返り値には、ポインタ s がそのまま返されます。
用例 → データ入力のページ参照。

最大入力文字数指定入力 (include = conio.h)
char * cgets(char *s)
最大入力文字数を決めて1行の文字列を入力します。
char S[128] の配列を用意した場合は、S[0] に最大入力文字数(この場合は 128-2=126)を代入しておきます。
指定した文字数以上は入力できませんから、誤動作を防止できます。
S[1] には、実際に入力された字数(Byt数)が代入されます。
キーボードから入力した文字列は、S[2] からに代入されます。
返り値は S[2] のポインタ。
例  char s[125]={3}; /* 最大入力文字数=3 を指定。*/
printf("文字列を入力して下さい。\n");
cgets(s);
printf("s[0]=%d s[1]=%d s[2]=%s \n",s[0],s[1],&s[2]);

ストリーム/最大入力文字数 指定入力 (include = stdio.h)
char * fgets(char *s,int n,FILE *stream)
入力元(ストリーム stream) と、最大入力文字数 n を指定して、s でポイントされる変数配列に入力します。
改行コード \n が \0 (NULL)に変換されるので、入力できるのは1行だけです。
ファイルから入力する場合は、あらかじめファイルをオープンしておく必要があります。
 → (2) のページ fopen 参照。

フォーマット 指定入力 (Include = stdio.h)
int scanf("フォーマットコード",格納先の変数名)

ストリーム/フォーマット 指定入力 (Include = stdio.h)
int fscanf(FILE *fp, "フォーマットコード",格納先の変数名)

例  fscanf(fp, "%s\n%s\n%s\n",buf)
fp で示されるファイルから、buf でポイントされる変数配列に、3行の文字列を入力します。
ファイルの指定方法は、(2) のページにある fopen 参照。

キー入力判定 (Include = stdio.h)
int kbhit(void)
キーボードのキーが押されたかどうかを調べます。
返り値は、キーが押されていない場合は 0 が返されます。


文字列のコピー関数 (Include = string.h)
char * strcpy (char * s, const char *t)
t でポイントされる文字配列を、s でポイントされる配列にコピーします。
t でポイントされる配列は、const の指定があるので、内容は変化できません。
返り値には、ポインタ s がそのまま返されます。
用例
#include <stdio.h>
#include <string.h>
main()
{
char S[4];
char T[4]="ABC";
strcpy(S,T); /* 配列 T の内容を C にコピーします。*/
strcpy(S,"DEF"); /* 文字列も使用できます。*/
}
メモ : 配列名 S, T は、&S[0], &T[0] と同じくポインタです。(ポインタのページ参照。)
ストリング(String:ひも 一列) : 文字列(文章など)
ターゲット(Target:標的 目標) : 処理の対象のデータ
ソース(Source:原因 出所) : 元のデータ。コピー元のデータ。
デスティネーション(Destination:目的地 目標) : コピー先。


字数を指定してコピー (include = string.h)
void *memcpy(void *d, const void *s, size_t count)
s でポイントされる文字配列を、d でポイントされる配列に、count バイトだけ、コピーします。
コピー元の s で示される文字列はそのままです。
メモ : 全角文字は2バイトで数えます。
例  memcpy(&D[2],S,5);
S の先頭から5バイトだけ、D の3バイト目からにコピーされます。

同じ変数内では正しくコピーされない場合があります。
例  S と D が同じなら、上例の場合は次のような順番にコピーされます。
123456789ABC
121456789ABC
121256789ABC
121216789ABC これ以後、コピーした文字がまたコピーされる。
121212789ABC

同じ変数内でもコピー (include = string.h)
void *movmem(const void *s, void *d, size_t count)
上記の memcpy と同じですが、コピー元の文字列をそのまま別な場所にコピーして、それから指定された処理を行うので、同じ変数内でも常に正しくコピーされます。

文字列の連結 (include = string.h)
char *strcat(char *s, const char *t)
s でポイントされる文字列に、t でポイントされる文字列を付け加えます。
返り値には、s がそのまま返されます。

文字列を逆にする (include = jstring.h)
char *jstrrev(char *s)
s でポイントされる文字列を逆並びにします。(あいう→ういあ)
返り値にはポインタ s がそのまま返ります。

文字列の字数を得る (include = jstring.h)
int jstrlen(const char *s)
s でポイントされる文字列の字数を返します。

文字列のサイズを得る (include = string.h)
int strlen(const char *s)
s でポイントされる文字列のバイト数を返します。

文字列/数値変換
int atoi(const char *s) (include = stdlib.h)
long atol(const char *s) (include = stdlib.h)
double atof(const char *s) (include = stdlib.h または math.h)
s でポイントされる文字列(数字)を、数値に変換します。
返り値は、それぞれの型の数値です。

文字列の比較関数 (include = jstring.h)
int jstrcmp(const char *s, const char *t)
s = ソース。  t = ターゲット(比較対象)
s でポイントされる文字列を、t でポイントされる文字列と比較します。
日本語の文字列も50音順に比較されます。
単語を50音順に並べ替えたりするような場合に使います。

文字には50音順に番号(文字コード)が付いています。
文字列比較は、文字コードの大小が比較されます。
例えば、(0x82A0)と(0x82A4)では、の方が大きいと判定されます。
A(0x41)とB(0x42)では、Bの方が大きいと判定されます。
文字には1バイトコードと2バイトコードがあるので、両方が混ざった文字列では全体のコードの大きさと文字の順番が合わない場合がありますが、それは修正されます。

返り値は、基準の文字列(*s)が大きい場合はプラスの値、小さい場合はマイナスの値、等しい場合には0が返されます

英数文字列の比較 (include = string.h)
int strcmp(const char *s, const char *t)
文字コードを単純に比較します。


三角関数 Sin (Include = math.h)
doubl sin (double x)
引数 x の単位は、rad です。(例 60°=60/360*2π =π/3 ≒1.047 rad)
用例
#include <stdio.h>
#include <math.h>
main()
{
double x = 60./360*2*3.1415;
printf("%f \n",sin(x) );
} /* 0.866010 と表示されます。*/
#include <stdio.h>
#include <math.h>
#define KAKU(x)((x)/360*2*3.1415)
main()
{
printf("%f \n",sin(KAKU(60.) ) );
} /* マクロを使用した場合。*/
メモ : 引数の 60 に小数点を付けないと、60/360 の値が整数値(0)になります。(変数と定数のページ参照。)

cos, tan, asin, acos, atan, sinh, cosh, tabh の書式も同じです。

指数・対数 関数 (Include = math.h)
doubl exp(doubl x) ex  例  printf("%f",exp(1.2) );
doubl log(doubl x) ln(X)
doubl log10(doubl x) log10(X)
doubl sqrt(doubl x) ルートX
doubl pow(doubl x,doubl y) Xy

その他の数学関数
int max(int x, int y) x と y の、大きい方の値 (Include = stdlib.h)
int min(int x, int y) x と y の、小さい方の値 (Include = stdlib.h)
doubl fabs(doubl x) |X| 絶対値 (Include = math.h)
doubl fmod(doubl x,doubl y) 剰余 X/Y の余り。 (Include = math.h)

乱数 (include = stdlib.h)   詳細 → [C言語]のページ
0〜32767の乱数を発生します。
void srand(unsigned int seed); 初期化を行います。
int rand(void); 乱数を発生します。
いちど srand を実行すると、rand は seed を種にして乱数を発生します。
srand を使用しなかったり、seed に定数を指定すると、プログラムを起動するたびに同じような(まったく同じ)乱数を発生します。

用例
seed には、現在の時刻(=秒を表わす数値)をそのまま使っています。
#include <stdio.h> /* printf を使うために必要。*/
#include <time.h> /* clock を使うために必要。*/
#include <stdlib.h>
void main()
{
srand( clock() );
printf("%d %d %d \n",rand(),rand(),rand());
}
メモ : 関数 clock の返り値は long なので、srand には下位だけが引数としてコピーされます。

乱数の範囲を変更するには、
0〜10 (10+1)*((long)rand())/32768
10〜15 (15-10+1)*((long)rand())/32768+10
メモ : ((float)rand())/32767 = 0〜1.000000 。
     ((float)rand())/32768 = 0〜0.999969 。
 上記の場合は整数計算をしているので、計算毎に小数は捨てられる。



終了コードを持ってプログラムを終了 (include = stdlib.h)
終了コードが必要な場合や、プログラムの途中で終了させる場合に使用します。

void exit(int n)
用例
#include <stdlib.h>
#include <process.h>
main()
{

exit(0); /* プログラムはここで終了します。*/

}
終了コード(0〜255 上例では 0 )は、必要がなくても記述する必要があるようです。
このプログラムをバッチファイルの中で使用している場合には、終了コードはエラーコードとして返されます。

異常終了 (include = stdlib.h または process.h)
void abort(void)
Abnormal program termination と表示して、プログラムを終了します。
引数も返り値もありません。

終了処理 (include = stdlib.h)
プログラムが終了するときに自動的に呼び出される関数を指定します。
int atexit(void (*func)(void))
関数はポインタで指定します。
関数のポインタについては、関数のページ参照。
返り値は 0 で、設定できなかった場合は 0 以外の値を返します。
複数指定した場合は、設定した逆の順番に実行されます。

用例
#include <stdio.h>
#include <stdlib.h>
void func() /* 関数の宣言/定義。*/
{printf("終了しました。\n"); }
void main()
{
void (*F)()=func; /* 関数へのポインタを宣言/定義。*/
atexit(F); /* 終了処理の関数に設定。*/
}

関数のポインタについては、関数のページ参照。

スタックの残り (include = malloc.h)
size_t stackavail(void)
スタックの残りバイト数(おおよその値)が返されます。

例  printf("%u\n",stackavail() );

T

C言語  関数  組込み1  
 
  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html