C言語の標準ライブラリ関数について
C言語には多くの便利な標準ライブラリ関数があります。すべてを紹介することは省略しますが、関数リファレンスに役立つサイトをいくつか紹介します。以下のサイトなどが参考になるでしょう。
C言語リファレンス
UCRT 関数リファレンス (アルファベット順)
多くの関数の中から、基本編や応用編ではまだ説明していない、いくつかの関数を選び説明することにします。
数学関数
使用する際には、<math.h>
をインクルードします。
関数名 | 書式 | 説明 |
---|---|---|
sqrt | double sqrt( double arg ); | 引数argの平方根を計算する |
pow | double pow( double base, double exponent ); | 引数baseのexponent乗を計算する |
sin | double sin( double arg ); | 引数argの正弦sin(x)を計算する ※argはラジアン値を渡す |
cos | double cos( double arg ); | 引数argの余弦cos(x)を計算する ※argはラジアン値を渡す |
tan | double tan( double arg ); | 引数argの正接tan(x)を計算する ※argはラジアン値を渡す |
#include <stdio.h>
#include <math.h>
#define PI 3.14159
int main(void){
double x=2.0;
double y=3.0;
double z;
double rad;
double angle=30.0;//角度30度
z=sqrt(x);
printf("sqrt(%.0f)=%0f\n",x,z);
z = pow(x,y);
printf("%.0fの%.0f乗は%.0fです。\n",x,y,z);
rad = PI * angle / 180.0;//角度からラジアンを計算する
z = sin(rad);
printf("sin(%.0f)=%f\n",angle,z);
z = cos(rad);
printf("cos(%.0f)=%f\n",angle,z);
z = tan(rad);
printf("tan(%.0f)=%f\n",angle,z);
return 0
}
実行結果
sqrt(2)=1.414214
2の3乗は8です。
sin(30)=0.500000
cos(30)=0.866026
tan(30)=0.577350
ユーティリティ関数
使用する際には、<stdlib.h>
をインクルードします。
関数名 | 書式 | 説明 |
---|---|---|
atoi | int atoi( const char *str ); | 文字列strを整数に変換する 変換できない場合0が返る ※エラー検出がないためstrtol()の使用が推奨される |
strtol | long strtol( const char *str, char **str_end, int base ); | 文字列strを整数値の基数baseをもとに整数値に変換する 変換できない場合0が戻る str_endには変換できた最後の文字の次の文字が入る また、戻り値の型が対応する範囲を超えた場合、errnoに値が設定される |
rand | int rand(); | 0とRAND_MAXの間の疑似乱数を生成する |
srand | void srand( unsigned int seed); | rand 関数によって使用される擬似乱数ジェネレーターの開始シード値を設定する |
time | time_t time( time_t *arg ); | 1970/1/1 0:00:00から現在までの経過時間を秒単位で取得する<time.h> をインクルードする |
#include <stdio.h>
#include <stdlib.h>
int toInt(const char* str,long int *num){
char *endp;
long int number;
errno = 0;
number = strtol(str,&endp,10);
if(endp == str){
fprintf(stderr,"%sは数値に変換できません\n",str);
} else if(errno != 0){
if(errno == ERANGE){
if(number == LONG_MAX){
fprintf(stderr,"%sは範囲を超える値です\n",str);
}else if(number == LONG_MIN){
fprintf(stderr,"%sは範囲を下回る値です\n",str);
}
}
} else{
*num = number;
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
}
int main(int argc,char* argv[]){
int num;
long int numl;
int ret;
printf("(atoi)\n");
num = atoi(argv[1]);
printf("num=%d\n",num);
printf("(strtol)\n");
ret = toInt(argv[1],&numl);
if(ret==EXIT_SUCCESS) {
printf("num1=%ld\n",numl);
}
return 0;
}
実行結果
C:\c>a.exe a
(atoi)
num=0
(strtol)
aは数値に変換できません
C:\c>a.exe 10
(atoi)
num=10
(strtol)
num1=10
C:\c>a.exe -2147483648
(atoi)
num=-2147483648
(strtol)
num1=-2147483648
C:\c>a.exe -2147483649
(atoi)
num=2147483647
(strtol)
-2147483649は範囲を下回る値です
C:\c>a.exe 2147483648
(atoi)
num=-2147483648
(strtol)
2147483648は範囲を超える値です
C:\c>a.exe 2147483649
(atoi)
num=-2147483647
(strtol)
2147483649は範囲を超える値です
C:\c>a.exe 2147483647
(atoi)
num=2147483647
(strtol)
num1=2147483647
//1から100までの整数を生成する
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
int num;
//乱数の初期化
//rand 関数によって使用される開始シード値を設定します。
//シード値を時間にすることで毎回違う値が生成される
srand((unsigned int)time(NULL));
//制限を設けないとき
num=rand() ;
printf("rand()=%d\n",num);
// 1から100までの値を発生させる
num=num % 100 + 1;
printf("rand()%%100+1=%d\n",num);
}
実行結果
rand()=18338
rand()%100+1=39
文字処理関数
使用する際には、<ctype.h>
をインクルードします。
関数名 | 書式 | 説明 |
---|---|---|
isalpha | int isalpha( int ch ); | 引数chがアルファベット(大文字または小文字)かどうかを判定する 文字がアルファベットであれば非ゼロの値、そうでなければゼロを返す |
isdigit | int isdigit( int ch ); | 引数chが10進数字かどうかを判定する 文字が数字であれば非ゼロの値、そうでなければゼロを返す |
tolower | int tolower( int ch ); | 引数chを小文字に変換する 小文字に変換した文字コードを、変換できない場合は無変更の chを返す |
toupper | int toupper( int ch ); | 引数chを大文字に変換する 大文字に変換した文字コードを変換できない場合は無変換のchを返す |
#include <stdio.h>
#include <ctype.h>
int main(int argc,char* argv[]){
int ch;
int ret;
ch = (int)argv[1][0];
if(isalpha(ch)!=0){
printf("%cはアルファベットです\n",ch);
printf("tolower(%c)=%c\n",ch,tolower(ch));
printf("toupper(%c)=%c\n",ch,toupper(ch));
} else if(isdigit(ch)!=0){
printf("%cは数値です\n",ch);
}
return 0;
}
実行結果
C:\c>a.exe 1
1は数値です
C:\c>a.exe a
aはアルファベットです
tolower(a)=a
toupper(a)=A
C:\c>a.exe A
Aはアルファベットです
tolower(A)=a
toupper(A)=A
ソート関数
値を降順(大きい順)や昇順(小さい順)に並べ替える処理は、頻繁に使用されます。C言語の標準ライブラリにはqsortという関数が含まれており、この関数は関数ポインタを利用します。ソートを実行する際には、値の比較が必要ですが、比較する方法は値の型(整数、浮動小数点数、文字列、構造体など)によって変わります。そのため、qsort関数はプログラマが定義した比較関数を関数ポインタとして受け取ります。
#include <stdlib.h>
void qsort( void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) );
- void *ptr
- ソートする配列を指すポインタ
- size_t count
- ソートする配列の要素数
- size_t size
- 配列の各要素のバイト数
- int (*comp)
- 比較用の関数名
comp関数では、「0」正の整数 負の整数の3種類を比較結果として返却する
昇順のとき:p>qのとき正の整数、p=qのとき0、p <qのとき負の整数を返却する
降順のとき:p<qのとき正の整数、p=qのとき0、p >qのとき負の整数を返却する
以下に整数の配列の値を昇順、降順に並び替えるサンプルプログラムを示します。
#include <stdio.h>
#include <stdlib.h>
//昇順関数
int comp_asc(const void* p,const void *q)
{
// int型のポインタ変数にキャストする
int *x = (int*)p;
int *y = (int*)q;
//p<q:負の整数値、
//p>q:正の整数値、
//p=q:ゼロ
return *x-*y;
}
//降順関数
int comp_desc(const void* p,const void *q)
{
// int型のポインタ変数にキャストする
int *x = (int*)p;
int *y = (int*)q;
//p>q:負の整数値、
//p<q:正の整数値、
//p=q:ゼロ
return -1*(*x-*y);
}
int main(void){
int array[5]={10,45,23,8,67};
int n = sizeof(array)/sizeof(array[0]);
printf("昇順\n");
qsort(array,n,sizeof(array[0]),comp_asc);
for(int i=0;i<n;i++){
printf("array[%d]=%d\n",i,array[i]);
}
printf("降順\n");
qsort(array,n,sizeof(array[0]),comp_desc);
for(int i=0;i<n;i++){
printf("array[%d]=%d\n",i,array[i]);
}
return 0;
}
実行結果
昇順
array[0]=8
array[1]=10
array[2]=23
array[3]=45
array[4]=67
降順
array[0]=67
array[1]=45
array[2]=23
array[3]=10
array[4]=8
コメント