C.ライブラリ関数

 Copyright(C) 27Jan2003 coskx TNCT

このページではよく使われるライブラリ関数について解説している。通常,ライブラリ関数は「関数リファレンス」にてプロ トタイプ宣言と引数と関数の型(返す値)で記述される。また解説する側もその方がすっきりして気持ちがよいが,初めて学ぶものにとっては読みにくくて仕方 がない。特に引数にポインタが記述されているとお手上げである。この解説ではあえて,厳密さはには欠けるが,使い方に重点をおいて記述した。

内容は以下のとおりである。
1 printfとscanf
2 数学関数
3 文字操作関数
4 文字列操作関数
5 コンソール入出力関数(キーボード入力関数,コンソール画面出力関数)
6 テキストファイル入出力関数
7 バイナリファイル入出力関数

C.1 printf と scanf

printfとscanfはコンソール出力表示とキーボード入力によく使われる関数である。
(printfやscanfが標準で組み込まれているライブラリ関数であることは説明していなかったが,これらは関数である。)
printfやscanfを使う時には「#include <stdio.h>」をプログラム先頭に書いておく

printf使用の例
変数として以下を仮定する。
int a=10,b=123,c=1234;
double p=12.12,q=123.123;
char c1='A',c2='B';
char str[]="abcdefg";

printf使用例

実行結果

printf("a=%d b=%d c=%d\n",a,b,c); a=10 b=123 c=1234
printf("a=%d b=%d c=%d\n",321,654,987); a=321 b=654 c=987
printf("a=%5d b=%5d c=%5d\n",a,b,c); *1 a=   10 b=  123 c= 1234
printf("a=%05d b=%05d c=%05d\n",a,b,c); *2 a=00010 b=00123 c=01234
printf("a=%x b=%x c=%x\n",a,b,c); *3 a=a b=7b c=4d2
printf("p=%f q=%f\n",p,q); p=12.120000 q=123.123000
printf("p=%10.5f q=%10.3f\n",p,q); *4 p=  12.12000 q=   123.123
printf("p=%.5f q=%.3f\n",p,q); *5 p=12.12000 q=123.123
printf("p=%15.5le q=%15.3le\n",p,q); *6 p=   1.21200e+001 q=     1.231e+002
printf("p=%.5le q=%.3le\n",p,q); *7 p=1.21200e+001 q=1.231e+002
printf("c1=%c c2=%c\n",c1,c2); c1=A c2=B
printf("c1=%d c2=%d\n",c1,c2); c1=65 c2=66
printf("c1=%x c2=%x\n",c1,c2); *8 c1=41 c2=42
printf("str=[%s]\n",str); str=[abcdefg]
printf("str=[%10s]\n",str); *9 str=[   abcdefg]
printf("str=[%-10s]\n",str); *10 str=[abcdefg   ]
printf("\\\"\'%%\t\n"); *11 \"'%[タブ]

*1 %5d     5マス分に整数を表示
*2 %05d    5マス分に整数を表示し,左側の空白には0を埋める
*3
%x      16進数表現
*4
%10.3f 10マス分で,小数点以下3桁で表示
*5
%.3f   何マス分かは指定しないが,小数点以下3桁で表示
*6
%15.3le 15マス分で,小数点以下3桁で指数表示 「e+002」は「×102
のこと
*7
%.3le   何マス分かは指定しないが,小数点以下3桁で指数表示
*8 %x    整数の16進表示 65(10進)→41(16進),66(10進)→42(16進)
*9 %10s    10マス分左詰で文字列表示
*10
%-10s   10マス分右詰で文字列表示
*11 「\\」は「\」を,「\"」は「"」を,「\'」は「'」を,「%%」は「%」を,「\t」は「タブ」を意味する。

scanf使用の例
変数として以下を仮定する。
int a,b,c;
double p,q;
char str[100];
char txt[100];

scanfの使用例

キーボード入力例

結果

scanf("%d %d %d",&a,&b,&c);*1 11 22 33 11→a 22→b 33→c
scanf("%d,%d,%d",&a,&b,&c);*2 11,22,33 11→a 22→b 33→c
scanf("%d/ %d& %d",&a,&b,&c);*3 11/22&33 11→a 22→b 33→c
scanf("%lf %lf",&p,&q);*4 123.123 456.456 123.123→p 456.456→q
scanf("%lf, %lf",&p,&q);*5 123.123, 456.456 123.123→p 456.456→q
scanf("%s",str);*6 abcdefg abcdefg→str
scanf("%s %s",str,txt);*7 abcdefg xyz abcdefg→str xyz→txt
scanf("%s,%s",str,txt);*8 abcdefg,xyz 失敗

*1 スペースを区切り文字として3つの整数を3つの整数型変数に読み込む
*2 カンマ(,)を区切り文字として3つの整数を3つの整数型変数に読み込む
*3 「/」や「&」を区切り文字として3つの整数を3つの整数型変数に読み込む
  このように数値を読み込むときは,区切り文字は何でも良い
*4 スペースを区切り文字として2つの実数を2つの実数型変数に読み込む
*5 カンマ(,)を区切り文字として2つの実数を2つの実数型変数に読み込む
*6 1つの文字列を文字型配列に読み込む
*7 スペースを区切り文字として2つの文字列を2つの文字型配列に読み込む
*8 カンマ(,)を区切り文字として2つの文字列を2つの文字型配列に読み込もうとするが失敗
  複数文字列を複数の%sを使って読み込む時は,区切り文字は必ずスペースを用いなければならない


 

C.2 数学関数

次の数学関数を使う時は「#include <math.h>」をプログラム先頭に書いておく。
角度の単位はdeg(度)ではなくrad(ラジアン)である。

数学関数
変数として以下を仮定する。
double x1,x2,yout;
double x,y,theta;
double a,b;
int m,n;

数学の表現

C言語のライブラリ関数の使用例

y=sin a x1
y=sin x
yout=sin(a*x1);
yout=sin(x);
y=cos a x1 yout=cos(a*x1);
y=tan a x1 yout=tan(a*x1);
θ=tan-1 x1 theta=atan(x1);
θ=tan-1 y/x theta=atan2(y,x);
y=a ebx yout=a*exp(b*x);
y=log10x yout=log10(x);
y=logex yout=log(x);
   _
y=x
yout=sqrt(x);
y=x1x2 yout=pow(x1,x2);
|x|(絶対値) y=fabs(x);
|n|(絶対値) m=abs(n); これには「#include <stdlib.h>」が必要

次の関数を使う時は「#include <stdlib.h>」をプログラム先頭に書いておく。

特殊関数
変数として以下を仮定する。
int m,n;

数学の表現

C言語のライブラリ関数の使用例

|n|(絶対値) m=abs(n);
乱数生成関数
呼び出すたびに異なる乱数を発生する
List C.2.1 参照

m=rand(); /*mは 0≦m<32768 の整数*/

乱数生成関数の初期化
List C.2.1 参照
srand(m);

List C.2.1 srand,randの使い方

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

int main()
{
    int i;
    srand( (unsigned)time( NULL ) );
    for(i=0;i<10;i++) {
        printf("%6d\n",rand());
    }
    return 0;
}

/***実行結果***
 15082
   418
  4018
 13899
 10704
 19523
  5401
 29815
  2413
 20303
***************/


C.3 文字操作関数

次の文字操作関数を使う時は「#include <ctype.h>」をプログラム先頭に書いておく。

文字操作関数
変数として以下を仮定する。
char cx,cy; /*cxは0以上0x7f以下でなければならない*/
int result;

意味

C言語のライブラリ関数の使用例

もしcxが小文字の文字コードだったら,大文字の
文字コードを返し,そうでなかったらcxをそのま
ま返す関数 toupper

cy=toupper(cx);

もしcxが大文字の文字コードだったら,小文字の
文字コードを返し,そうでなかったらcxをそのま
ま返す関数 tolower

cy=tolower(cx);
もしcxがアルファベット(大文字,小文字に関係
なく)なら1を返し,そうでなかったら0を返す関
数 isalpha

result=isalpha(cx);

if (isalpha(cx)) {
/*cxがアルファベットだったら*/

もしcxが大文字の文字コードだったら,1を返し,
そうでなかったら0を返す関数 isupper

result=isupper(cx);

if (isupper(cx)) {
/*cxが大文字だったら*/

もしcxが小文字の文字コードだったら,1を返し,
そうでなかったら0を返す関数 islower

result=islower(cx);

if (islower(cx)) {
/*cxが小文字だったら*/

もしcxが数字の文字コードだったら,1を返し,
そうでなかったら0を返す関数 isdigit

result=isdigit(cx);

if (isdigit(cx)) {
/*cxが数字だったら*/

もしcxが数字またはアルファベットの文字コード
だったら,1を返し,そうでなかったら0を返す関
数 isalnum

result=isalnum(cx);

if (isalnum(cx)) {
/*cxが数字またはアルファベットだったら*/

もしcxが標準空白文字類の文字コードだったら,
1を返し,そうでなかったら0を返す関数

標準空白文字類とは
' '(空白),'\t','\r','\n','\v','\f'
のことである。
 isspace

result=isspace(cx);

if (isspace(cx)) {
/*cxが標準空白文字類だったら*

C.4 文字列操作関数

次の文字列操作関数を使う時は「#include <string.h>」をプログラム先頭に書いておく。

文字列操作関数
変数として以下を仮定する。
char str1[8]="abcdef";
char str2[20]="pqr";
char str3[8];
char str4[8]="pqr";
char str5[8]="zzz";
char toolong[20]="abcdefghijk";
char ch='d';
int result;

意味

C言語のライブラリ関数の使用例

文字列の長さを返す関数 strlen

result=strlen("Hello"); →resultは5
result=strlen(str1);    →resultは6

文字列をコピーする関数 strcpy
引数はコピー先文字列,コピー元文字列の順

strcpy(str3,"morning"); →str3には"morning"がコピーされる
strcpy(str3,str1); →str3には"abcdef"がコピーされる
strcpy(str3,toolong); →str3に文字列が入りきらず,実行時にエラー発生

文字列を追加コピーする関数 strcat
引数はコピー先文字列,コピー元文字列の順

strcat(str2,"morning"); →str2は"pqrmorning"になる
strcat(str2,str1); →str2は"pqrabcdef"になる
strcat(str5,str1); →str5は"zzzabcdef"になろうとするが,
           str5は配列要素数が8なので配列があふれて実行時エラー

2つの文字列の辞書上での前後関係を求める
関数 strcmp

"abcdef"の方が"pqr"より辞書順では前である。
result=strcmp(str1,str2);  →resultには負の値が入る
result=strcmp(str2,str1);  →resultには正の値が入る
result=strcmp(str2,str4);  →resultには0が入る

文字列中から特定の文字を探して,何番目に
あったか求めるのに役立つ関数 strchr
引数は文字列,特定文字の順

まだポインタを学習していないため,当面は次のように使う。
result=strchr(str1,ch)-str1;   →resultには3が入る
result=strchr(str1,'c')-str1;  →resultには2が入る
result=strchr(str1,'e')-str1;  →resultには4が入る
result=strchr(str1,'g')-str1;  →resultには負の値が入る(見つからない)
実はstrchr()は特定文字を見つけたら,見つかった場所のアドレスを返している。
見つからなかった場合はNULLを返している。

文字列中から特定の文字列を探して,何番目に
あったか求めるのに役立つ関数 strstr
引数は文字列,特定文字列の順

まだポインタを学習していないため,当面は次のように使う。
result=strchr(str1,"abc")-str1;  →resultには0が入る
result=strchr(str1,"bcd")-str1;  →resultには1が入る
result=strchr(str1,"def")-str1;  →resultには3が入る
result=strchr(str1,"efg")-str1;  →resultには負の値が入る(見つからない)
実はstrstr()は特定文字を見つけたら,見つかった場所のアドレスを返している。
見つからなかった場合はNULLを返している。

>

C.4の親戚  文字列中からscanf,文字列中へprintf


次の関数は 「#include <stdio.h>」を書いてから使う便利な書式付文字列生成/読取関数である。
実用上は,よく使われるので,知っておく必要がある。

関数

使い方

書式付文字列読取関数
scanfの親戚

int sscanf(char buff[],char format[], ...)

char buff[]="123 456";
int a,b;
の時
sscanf(buff,"%d %d",&a,&b);

aに123,bに456が読み込まれる。

書式付文字列生成関数
printfの親戚

int sprintf(char buff[],char format[], ...)

char buff[128];
char fname[128];
int x=12;
int y=56;
の時
sprintf(buff,"x=%d y=%dとなる。",x,y);
sprintf(fname,"data%03d.txt",x);

buffには"x=12 y=56となる。"の文字列が,
fnameには"data012.txt"の文字列が出来る。



C.5 コンソール入出力関数(キーボード入力関数,コンソール画面出力関数)


これまでコンソール入力関数はscanfを紹介したが,もう少し低レベルな入出力関数がある。
コンソール入力(キーボード入力)関数の一覧

関数

関数の仕様

int getchar(void)

1文字を入力関数の返す値として返す。読み取りに失敗した時はEOFが返される。
使い方
int mychar; の宣言のもとで
mychar=getchar();

char *gets(char buff[])

あらかじめ用意されたchar型配列buffに文字列を入力。リターンキーが押されるまでを読み取る。
ただし,改行コードは取得文字列には含まれない。
  cf 関数fgetsは改行コードもあれば取得される。
読み取りに失敗した時はNULLが返される。
使い方
char mystr[128]; の宣言のもとで
gets(mystr);

int scanf(char format[], ...) 文字列や数値を書式付で読み取る。
関数の返す値は,正常に読み取ったデータの数。
読み取り個数が0この場合は0を,エラーの場合はEOFを返す。

これまでコンソール出力関数はprintfを紹介したが,もう少し低レベルな入出力関数がある。
コンソール出力関数の一覧

関数

関数の仕様

int putchar(int mychar)

1文字(mychar)をコンソール画面に出力する。エラーの場合はEOFを返す。
使い方
int mychar; の宣言のもとで
putchar(mychar);
putchar('A');
putchar('\n');
putchar("A");←これは誤り

int puts(char buff[])

char型配列buff中の文字列をコンソール画面に出力する。
文字列出力後,自動的に改行される。
  cf 関数fputsは文字列出力語,自動的には改行されない。
エラーの場合はEOFを返す。
使い方
char mystr[128]="Hello world"; の宣言のもとで
puts(mystr);
puts("How are you?");
puts('How are you?');←これは誤り

int printf(char format[], ...) 文字列や数値を書式付でコンソール画面に出力する。
関数の返す値は,正常に出力した文字の数。
エラーの場合は負の数を返す。

補足説明 
意外としつこいscanfとfscanf

補足説明 
キーボード入力と,入力バッファ
getchar scanfで不思議な振る舞いを見たらここを見ること

C.6 テキストファイル入出力関数


テキストファイル入力関数の一覧
FILE *fp;
fp=fopen(filename,"r");で得られたfpに対して以下の関数が使用できる。fpはストリームと呼ばれる。「r」はreadの意味。

関数

関数の仕様

int fgetc(ストリーム)

int getc(ストリーム)
も同じ意味

1文字をファイルから入力する。エラーの場合はEOFを返す。
int mychar; の宣言のもとで
mychar=fgetc(fp);
EOFでファイルの終わりを検出する時は,mycharはchar型でなくint型にする
(EOFはint型の定数なので)

char *fgets(char buff[],最大文字数,ストリーム)

あらかじめ用意されたchar型配列buffに文字列を入力。改行コードあるいはファイル終端までを読み取る。テキストファイルで言う1行を読み取る。
ただし,改行コードが行末にある場合には,改行コードも取得文字列に含まれる。
cf 関数getsは行末の改行コードは捨てられ,取得文字列には含まれない。
読み取りに失敗した時(ファイル終端に達してこれ以上読み込めない場合)はNULLが返される。
使い方
char mystr[128]; の宣言のもとで,(ここに取得文字列が格納される)
fgets(mystr,128,fp);

int fscanf(ストリーム,char format[], ...)

文字列や数値を書式付で読み取る。関数の返す値は,
正常に読み取ったデータの数。
読み取り個数が0この場合は0を,エラーの場合はEOFを返す。
使い方
int a,b; の宣言の元に
fscanf(fp,"%d %d",&a,&b);


補足説明 
意外としつこいscanfとfscanf

補足説明 関数fscanf()によるCSVファイルの読み取りについて
CSVファイル


テキストファイル出力関数の一覧
FILE *fp;
fp=fopen(filename,"w");で得られたfpに対して以下の関数が使用できる。fpはストリームと呼ばれる。「w」はwriteの意味。

関数

関数の仕様

int fputc(int mychar,ストリーム)

int putc(int mychar,ストリーム)
も同じ意味

1文字(mychar)をファイルに出力する。エラーの場合はEOFを返す。
使い方
int mychar; の宣言のもとで
fputc(mychar,fp);
fputc('A',fp);
fputc('\n',fp);
fputc("A",fp);←これは誤り

int fputs(char buff[],ストリーム)

char型配列buff中の文字列をファイルに出力する。
文字列出力後,改行コードは付加されない。
cf 関数putsは文字列出力語,自動的には改行される。
エラーの場合はEOFを返す。
使い方
char mystr[128]="Hello world\n"; の宣言のもとで
fputs(mystr,fp);
fputs("How are you?\n",fp);

int fprintf(ストリーム,char format[], ...) 文字列や数値を書式付でファイルに出力する。
関数の返す値は,正常に出力したバイト数。
エラーの場合は負の数を返す。
使い方
int a=3,b=5; の宣言の元に
fprintf(fp,"a=%d b=%d\n",a,b);


C.7 バイナリファイル入出力関数


バイナリファイルに対して使用する入力関数はつぎのとおりである。
FILE *fp;
fp=fopen(filename,"rb");で得られたfpに対して以下の関数が使用できる。fpはストリームと呼ばれる。「rb」はread binaryの意味。

関数

関数の仕様

int fread(void buff[],項目のバイト数n,項目の数m,ストリーム) ストリームからnバイトからなる項目をm個buffに読み込む。
返す値は読み込みに成功した項目数。
使い方
short int buff[512]; の宣言の元で
fread(buff,sizeof(short int),512,fp);

バイナリファイルに対して使用する出力関数はつぎのとおりである。
FILE *fp;
fp=fopen(filename,"wb");で得られたfpに対して以下の関数が使用できる。fpはストリームと呼ばれる。「wb」はwrite binaryの意味。

関数

関数の仕様

int fwrite(void buff[],項目のバイト数n,項目の数m,ストリーム) ストリームにnバイトからなる項目m個のbuffデータを書き込む。
返す値は書き込みに成功した項目数。
使い方
short int buff[512]; の宣言の元で
fwrite(buff,sizeof(short int),512,fp);


C.8 ファイル操作関数


関数

関数の仕様

ストリーム fopen(char filename[],char mode[])

ファイルをオープンし,ストリームを取得する。
ストリームは関数の返す値となっている。
失敗した時は関数の値としてNULLを返す。
使い方の例
FILE *fp; の宣言のもとで
fp=fopen("myfile.txt","r");
  「myfile.txt」をテキスト読み込みモードでオープンする。
fp=fopen("myfile.txt","w");
  「myfile.txt」をテキスト書き出しモードでオープンする。
fp=fopen("myfile.txt","a");
  「myfile.txt」をテキスト追加書き出しモードでオープンする。
   既存ファイルの終端に追加される。
fp=fopen("myfile","rb");
  「myfile」をバイナリ読み込みモードでオープンする。
fp=fopen("myfile","wb");
  「myfile」をバイナリ書き出しモードでオープンする。
fp=fopen("myfile","ab");
  「myfile」をバイナリ追加書き出しモードでオープンする。
   既存ファイルの終端に追加される。

fclose(ストリーム) ファイルをクローズする。
fclose(fp);
のように使う