C言語の標準ライブラリ関数

– 全て覚える必要はなく、使える関数だけ選択し、慣れるにしたがって利用関数を増やしていく
– ソースプログラム -> コンパイル -> オブジェクトモジュール + [標準ライブラリ] -> リンク -> 実行モジュール
– (1)ハードウェアにアクセスする関数、(2)数学処理、(3)一般ユーザでも記述可能な処理、(4)メモリ処理のような特殊動作関数 がある。(1)(2)(4)の独自開発は負担が大きい。

### 標準ライブラリ関数一覧
stdio.h: 入出力処理
stdlib.h: 一般ユーティリティ、数値変換や記憶割り当てなどサポート
string.h: 文字列操作
ctype.h: 文字操作
math.h: 数学処理
time.h: 時間処理

### 入出力関数 stdio.h
https://en.wikipedia.org/wiki/C_file_input/output

### 一般ユーティリティ関数 stdlib.h
abort, abs, atexit, atof, atoi, atol, bsearch, calloc, div, exit, free, getenv, labs, ldiv, malloc, qsort, rand, realloc, srand, strtod, strtol, strtoul, systemなど

### 文字列処理関数 string.h
https://en.wikipedia.org/wiki/C_string_handling

int main(void){

	char *p, s1[80], s2[80], s3[] = "abcdefg";
	int n;

	strcpy(s1, "ABC");
	strcpy(s2, "XYZ");
	printf("s1=%s s2=%s\n", s1, s2);

	n = strlen(s1);
	printf("s1 length=%d\n", n);

	if(strcmp(s1, s2) > 0)
		printf("left is large\n");
	if(strcmp(s1, s2) < 0)
		printf("right is large\n");
	if(strcmp(s1, s2) == 0)
		printf("equal\n");
	
	strcat(s1, "1234");
	strcat(s1, s2);
	strncat(s1, s3, 4);
	printf("文字連結=%s\n", s1);

	p = strchr(s3, 'c');
	puts(p);
	p = strstr(s3, "def");
	puts(p);

	return 0;
}
&#91;/code&#93;

### 文字処理関数 ctype.h
<a href="https://en.wikipedia.org/wiki/C_character_classification">https://en.wikipedia.org/wiki/C_character_classification</a>

int main(void){

	int c, c2;

	printf("------isalnum:\n");
	for (c=0; c<=127; c++)
		if(isalnum(c)) putchar(c);
	
	printf("------isalpha:\n");
	for (c=0; c<=127; c++)
		if(isalpha(c)) putchar(c);

	printf("------isdigit:\n");
	for (c=0; c<=127; c++)
		if(isdigit(c)) putchar(c);

	printf("------islower:\n");
	for (c=0; c<=127; c++)
		if(islower(c)) putchar(c);

	printf("------isupper:\n");
	for (c=0; c<=127; c++)
		if(isupper(c)) putchar(c);

	printf("------isxdigit:\n");
	for (c=0; c<=127; c++)
		if(isxdigit(c)) putchar(c);

	printf("------isprint:\n");
	for (c=0; c<=127; c++)
		if(isprint(c)) putchar(c);

	printf("------isgraph:\n");
	for (c=0; c<=127; c++)
		if(isgraph(c)) putchar(c);

	printf("------ispunct:\n");
	for (c=0; c<=127; c++)
		if(ispunct(c)) putchar(c);

	printf("------iscntrl:\n");
	for (c=0; c<=127; c++)
		if(iscntrl(c)) putchar(c);

	printf("------isspace:\n");
	for (c=0; c<=127; c++)
		if(isspace(c)) putchar(c);

	printf("------tolower:\n");
	c = 'A';
	c2 = tolower(c);
	printf("c=%c tolower=%c\n", c, c2);

	printf("------toupper:\n");
	c = 'b';
	c = toupper(c);
	printf("toupper=%c\n", c);

	return 0;
}
&#91;/code&#93;
$ ./dev
------isalnum:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz------isalpha:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz------isdigit:
0123456789------islower:
abcdefghijklmnopqrstuvwxyz------isupper:
ABCDEFGHIJKLMNOPQRSTUVWXYZ------isxdigit:
0123456789ABCDEFabcdef------isprint:
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~------isgraph:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~------ispunct:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~------iscntrl:
------isspace:
------tolower:
c=A tolower=a
------toupper:
toupper=B

### 数学処理関数 math.h
sin, cos, tan, log, log10, pow, sqrtなど
関数の戻り値はdouble, 引数はdouble, 角度はラジアン
<a href="https://en.wikipedia.org/wiki/C_mathematical_functions">https://en.wikipedia.org/wiki/C_mathematical_functions</a>

#include <stdio.h>
#include <math.h>

int main(void){

	double x, r;

	printf(" x sin(x) cos(x)\n");
	for (x=0.0; x<=90.0; x+=15.0){
		r = x * 3.14159 / 180.0;
		printf("%6.2f %8.5f %8.5f\n", x, sin(r), cos(r));
	}

	return 0;
}
&#91;/code&#93;

### 時間処理関数 math.h
時間処理を行う時は複数の関数を組み合わせて使用する
<a href="https://en.wikipedia.org/wiki/C_date_and_time_functions">https://en.wikipedia.org/wiki/C_date_and_time_functions</a>

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

int main(void){

	time_t mytime;
	struct tm *ltime;
	char *p;

	time(&mytime);
	ltime = localtime(&mytime);
	p = asctime(ltime);
	printf("japan time: %s", p);

	p = ctime(&mytime);
	printf("ctime:  %s", p);

	printf("year=%d\n", ltime->tm_year+1900);
	printf("month=%d\n", ltime->tm_mon+1);
	printf("day=%d\n", ltime->tm_mday);
	printf("hour=%d\n", ltime->tm_hour);
	printf("minute=%d\n", ltime->tm_min);
	printf("second=%d\n", ltime->tm_sec);

	return 0;
}

$ ./dev
japan time: Fri May 15 23:23:52 2020
ctime: Fri May 15 23:23:52 2020
year=2020
month=5
day=15
hour=23
minute=23
second=52

int main(void){

	clock_t start, end;
	int keika;
	char s[80];

	start = clock();
	printf("started. put [enter], then end.");
	gets(s);
	end = clock();
	keika = (end - start) / CLOCKS_PER_SEC;
	printf("end: %d second passed. \n", keika);

	return 0;
}

### その他関数
atoi(), atol(), atof(), rand(), system(), exit()

int main(void){

int i, n;

srand(555);
printf("0 ~ 32767:\n");
for(i=1; i<=10; i++) printf("%d ", rand()); printf("\n0.0 ~ 1:\n"); for(i=1; i<=10; i++) printf("%5.3f ", rand() / (RAND_MAX+1.0)); printf("\n1 ~ 6:\n"); for(i=1; i<=10; i++){ n = (int)(rand() / (RAND_MAX+1.0) * 6.0); ++n; printf("%d ", n); } printf("\n"); return 0; } [/code] $ ./dev 0 ~ 32767: 1897361756 511234109 2040558095 299669925 1854125204 1147783809 1808688013 1528174380 1122472434 999190120 0.0 ~ 1: 0.224 0.826 0.696 0.201 0.311 0.565 0.758 0.135 0.223 0.791 1 ~ 6: 1 3 4 3 3 3 3 1 2 4 入出力、数学、文字、時間に加えて、ハードウェア周りか。 ハードウェア周りもマスターしたいな。