C言語 補足②

C言語の標準ライブラリ関数について

C言語には多くの便利な標準ライブラリ関数があります。すべてを紹介することは省略しますが、関数リファレンスに役立つサイトをいくつか紹介します。以下のサイトなどが参考になるでしょう。
C言語リファレンス
UCRT 関数リファレンス (アルファベット順)

多くの関数の中から、基本編や応用編ではまだ説明していない、いくつかの関数を選び説明することにします。

数学関数

使用する際には、<math.h>をインクルードします。

関数名書式説明
sqrtdouble sqrt( double arg );引数argの平方根を計算する
powdouble pow( double base, double exponent );引数baseのexponent乗を計算する
sindouble sin( double arg );引数argの正弦sin(x)を計算する
※argはラジアン値を渡す
cosdouble cos( double arg );引数argの余弦cos(x)を計算する
※argはラジアン値を渡す
tandouble 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>をインクルードします。

関数名書式説明
atoiint atoi( const char *str );文字列strを整数に変換する
変換できない場合0が返る
※エラー検出がないためstrtol()の使用が推奨される
strtollong strtol( const char *str, char **str_end, int base );文字列strを整数値の基数baseをもとに整数値に変換する
変換できない場合0が戻る
str_endには変換できた最後の文字の次の文字が入る
また、戻り値の型が対応する範囲を超えた場合、errnoに値が設定される
randint rand();0とRAND_MAXの間の疑似乱数を生成する
srandvoid srand( unsigned int seed);rand 関数によって使用される擬似乱数ジェネレーターの開始シード値を設定する
timetime_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>をインクルードします。

関数名書式説明
isalphaint isalpha( int ch );引数chがアルファベット(大文字または小文字)かどうかを判定する
文字がアルファベットであれば非ゼロの値、そうでなければゼロを返す
isdigitint isdigit( int ch );引数chが10進数字かどうかを判定する
文字が数字であれば非ゼロの値、そうでなければゼロを返す
tolowerint tolower( int ch );引数chを小文字に変換する
小文字に変換した文字コードを、変換できない場合は無変更の chを返す
toupperint 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

コメント

この記事へのコメントはありません。

関連記事

C言語 ~6日目~

C言語(基礎編)演習問題

C言語 応用編 ~6日目~

PAGE TOP