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