– 全て覚える必要はなく、使える関数だけ選択し、慣れるにしたがって利用関数を増やしていく
– ソースプログラム -> コンパイル -> オブジェクトモジュール + [標準ライブラリ] -> リンク -> 実行モジュール
– (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;
}
[/code]
### 文字処理関数 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;
}
[/code]
$ ./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;
}
[/code]
### 時間処理関数 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
入出力、数学、文字、時間に加えて、ハードウェア周りか。
ハードウェア周りもマスターしたいな。