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使用の例 | ||
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使用の例 | ||
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(ラジアン)である。
数学関数 | |
数学の表現 |
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> int main() |
C.3 文字操作関数 |
---|
次の文字操作関数を使う時は「#include <ctype.h>」をプログラム先頭に書いておく。
意味 C言語のライブラリ関数の使用例 もしcxが小文字の文字コードだったら,大文字の もしcxが大文字の文字コードだったら,小文字の result=isalpha(cx); if (isalpha(cx))
{ result=isupper(cx); if (isupper(cx))
{ result=islower(cx); if (islower(cx))
{ result=isdigit(cx); if (isdigit(cx))
{ result=isalnum(cx); if (isalnum(cx))
{ result=isspace(cx); if (isspace(cx))
{
文字操作関数
変数として以下を仮定する。
char
cx,cy; /*cxは0以上0x7f以下でなければならない*/
int result;
文字コードを返し,そうでなかったらcxをそのま
ま返す関数 touppercy=toupper(cx);
文字コードを返し,そうでなかったらcxをそのま
ま返す関数 tolowercy=tolower(cx);
もしcxがアルファベット(大文字,小文字に関係
なく)なら1を返し,そうでなかったら0を返す関
数 isalpha
/*cxがアルファベットだったら*/
もしcxが大文字の文字コードだったら,1を返し,
そうでなかったら0を返す関数 isupper
/*cxが大文字だったら*/
もしcxが小文字の文字コードだったら,1を返し,
そうでなかったら0を返す関数 islower
/*cxが小文字だったら*/
もしcxが数字の文字コードだったら,1を返し,
そうでなかったら0を返す関数 isdigit
/*cxが数字だったら*/
もしcxが数字またはアルファベットの文字コード
だったら,1を返し,そうでなかったら0を返す関
数 isalnum
/*cxが数字またはアルファベットだったら*/
もしcxが標準空白文字類の文字コードだったら,
1を返し,そうでなかったら0を返す関数
標準空白文字類とは
' '(空白),'\t','\r','\n','\v','\f'
のことである。
isspace
/*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 |
文字列をコピーする関数 strcpy |
strcpy(str3,"morning");
→str3には"morning"がコピーされる |
文字列を追加コピーする関数
strcat |
strcat(str2,"morning");
→str2は"pqrmorning"になる |
2つの文字列の辞書上での前後関係を求める 関数 strcmp |
"abcdef"の方が"pqr"より辞書順では前である。 |
文字列中から特定の文字を探して,何番目に あったか求めるのに役立つ関数 strchr 引数は文字列,特定文字の順 |
まだポインタを学習していないため,当面は次のように使う。 |
文字列中から特定の文字列を探して,何番目に あったか求めるのに役立つ関数 strstr 引数は文字列,特定文字列の順 |
まだポインタを学習していないため,当面は次のように使う。 |
C.4の親戚 文字列中からscanf,文字列中へprintf |
---|
次の関数は 「#include <stdio.h>」を書いてから使う便利な書式付文字列生成/読取関数である。 関数 使い方 char buff[]="123 456"; char buff[128];
実用上は,よく使われるので,知っておく必要がある。
書式付文字列読取関数
scanfの親戚
int sscanf(char
buff[],char format[], ...)
int
a,b;
の時
sscanf(buff,"%d
%d",&a,&b);
で
aに123,bに456が読み込まれる。
書式付文字列生成関数
printfの親戚
int sprintf(char
buff[],char format[], ...)
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が返される。 |
char *gets(char buff[]) |
あらかじめ用意されたchar型配列buffに文字列を入力。リターンキーが押されるまでを読み取る。 |
int scanf(char format[], ...) | 文字列や数値を書式付で読み取る。 関数の返す値は,正常に読み取ったデータの数。 読み取り個数が0この場合は0を,エラーの場合はEOFを返す。 |
これまでコンソール出力関数はprintfを紹介したが,もう少し低レベルな入出力関数がある。
コンソール出力関数の一覧
関数 |
関数の仕様 |
int putchar(int mychar) |
1文字(mychar)をコンソール画面に出力する。エラーの場合はEOFを返す。 |
int puts(char buff[]) |
char型配列buff中の文字列をコンソール画面に出力する。 |
int printf(char format[], ...) | 文字列や数値を書式付でコンソール画面に出力する。 関数の返す値は,正常に出力した文字の数。 エラーの場合は負の数を返す。 |
補足説明
意外としつこいscanfとfscanf
補足説明
キーボード入力と,入力バッファ
getchar scanfで不思議な振る舞いを見たらここを見ること
C.6 テキストファイル入出力関数 |
---|
テキストファイル入力関数の一覧
FILE
*fp;
fp=fopen(filename,"r");で得られたfpに対して以下の関数が使用できる。fpはストリームと呼ばれる。「r」はreadの意味。
関数 |
関数の仕様 |
int fgetc(ストリーム) |
1文字をファイルから入力する。エラーの場合はEOFを返す。 |
char *fgets(char buff[],最大文字数,ストリーム) |
あらかじめ用意されたchar型配列buffに文字列を入力。改行コードあるいはファイル終端までを読み取る。テキストファイルで言う1行を読み取る。 |
int fscanf(ストリーム,char format[], ...) |
文字列や数値を書式付で読み取る。関数の返す値は, |
補足説明
意外としつこい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 fputs(char buff[],ストリーム) |
char型配列buff中の文字列をファイルに出力する。 |
int fprintf(ストリーム,char format[], ...) | 文字列や数値を書式付でファイルに出力する。 関数の返す値は,正常に出力したバイト数。 エラーの場合は負の数を返す。 使い方 int a=3,b=5; の宣言の元に fprintf(fp,"a=%d b=%d\n",a,b); |
C.7 バイナリファイル入出力関数 |
---|
関数 |
関数の仕様 |
int fread(void buff[],項目のバイト数n,項目の数m,ストリーム) | ストリームからnバイトからなる項目をm個buffに読み込む。 返す値は読み込みに成功した項目数。 使い方 short int buff[512]; の宣言の元で fread(buff,sizeof(short int),512,fp); |
関数 |
関数の仕様 |
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[]) |
ファイルをオープンし,ストリームを取得する。 |
fclose(ストリーム) | ファイルをクローズする。 fclose(fp); のように使う |