EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
有很多工程师喜欢自己封装一些标准库已有的函数,其实自己封装的函数,并不一定比标准库好,有时候反而代码更冗余,且有bug。下面就来分享一下C语言常见的一些标准库。
6 A6 I% w7 n$ H. N% Y) B9 n! l % E) ?% e: B! P8 a5 y2 l% G. H5 G
, B; X" d. o" H# X r# L" I
1 p5 {& B5 j7 P
标准头文件包括: $ `9 R: \- D2 z+ e% \! ~9 ^! c
) U& W z) P: ~$ q1 m r- ( I3 E) k8 o+ N: j- f- l
2 f3 |0 F2 s, ]3 E* \ <asset.h> <ctype.h> <errno.h> <float.h><limits.h> <locale.h> <math.h> <setjmp.h><signal.h> <stdarg.h> <stddef.h> <stdlib.h><stdio.h> <string.h> <time.h>一、标准定义(<stddef.h>) . a6 X! B) d' x, M8 q, p0 r, o" Q/ Y& B( r6 A/ G, s
文件<stddef.h>里包含了标准库的一些常用定义,无论我们包含哪个标准头文件,<stddef.h>都会被自动包含进来。
* j2 n' v8 J3 f& _* R" j v% t+ {9 t8 E' ?" i# q* y% q# Q2 R3 A! K
1 }" B7 m' ~) u4 e1 f; Q
这个文件里定义: ! `/ W) i) Z- h' F8 H
类型size_t(sizeof运算符的结果类型,是某个无符号整型); * W. ^9 k' a0 q0 h2 j" B& l% O, x4 _! w6 }) |- v: C
/ J2 w/ B( J6 e. }# a% X$ B7 \3 `! L) k, }- w1 S
* V4 [" x! {- ?( B
) P, V+ A* X% z* m; u+ I3 f4 h' H类型ptrdiff_t(两个指针相减运算的结果类型,是某个有符号整型); # q7 Z# |8 f% Z7 L$ L1 T d: X n( Q
0 P! T. h9 K( C: w# k/ w& a $ x, p1 G' ~: t" I$ J& S/ |/ B% i2 a! t1 d
类型wchar_t(宽字符类型,是一个整型,其中足以存放本系统所支持的所有本地环境中的字符集的所有编码值。这里还保证空字符的编码值为0); ; V. `& E4 [9 e3 }/ D) P$ x( h$ R7 I# u+ [# B1 m6 m* ?
. t+ \( Y- a# r
, E6 Q6 Y' R* r! o符号常量NULL(空指针值); # a3 A! [( L4 C- f
% s$ v2 T; n0 p9 G
2 g9 G5 y* I0 ~' u4 `; t . }8 b n/ I: Q& e8 d6 G k7 I
5 A2 ?/ M6 i) {' u3 _宏offsetot (这是一个带参数的宏,第一个参数应是一个结构类型,第二个参数应是结构成员名。 & N8 [) E9 O6 P2 C) x! Z: O- K
# \# Y" t+ } l) P% Y- " Q7 R1 q. ^* a" l( X
- z! R/ `+ H T1 Z) G5 M/ c$ E
offsetot(s,m)求出成员m在结构类型t的变量里的偏移量)。 5 F6 z% \. ^0 m9 c
( c K# ?6 y" @) M$ S" @/ t x: T# w8 }$ V x
, }0 c/ W8 j) E' J! W& G# a. O* J `2 A* L) _
注:其中有些定义也出现在其他头文件里(如NULL)。
- a1 a |% W* R! A' `' _9 q" A1 p: j4 b y5 D$ c5 I! w
/ T1 c# G% F+ H8 x/ Z) B 0 s5 Z! Q' b8 O' C7 a) Y6 k; `0 W9 H. N# P
二、错误信息(<errno.h>)
2 _0 P2 X4 _: `2 l<errno.h>定义了一个int类型的表达式errno,可以看作一个变量,其初始值为0,一些标准库函数执行中出错时将它设为非0值,但任何标准库函数都设置它为0。
! T! A3 D& e0 l9 @) J" \/ P, c) z9 H! P7 u# Z
! i3 l. n- V* C<errno.h>里还定义了两个宏EDOM和ERANGE,都是非0的整数值。数学函数执行中遇到参数错误,就会将errno置为EDOM,如出现值域错误就会将errno置为ERANGE。
# S0 t% t5 F5 l }5 o0 U1 P9 u+ H5 B
5 i* p2 b% B% K- v) m8 W0 m, H
3 K# B; a1 \& N Z: C0 R三、输入输出函数(<stdio.h>)
9 z7 v( h P1 z/ \3 W8 K/ O) X/ q文件打开和关闭:
* Z% s: N! }+ B( A! i
/ _7 h5 q4 A7 \9 P- G9 f6 W! ]5 r8 M& z# X+ B
FILE *fopen(const char *filename, const char *mode);int fclose(FILE * stream);字符输入输出:3 z* F8 r9 s/ m& R% ^9 d
- 2 K4 Z! V" V- k$ C0 _
8 s; [4 v% X" d" Y6 p# j5 r% U int fgetc(FILE *fp);int fputc(int c, FILE *fp);getc和putc与这两个函数类似,但通过宏定义实现。通常有下面定义:
2 z0 [, Z$ T1 v! L2 s2 |5 D- * Q. ^; Q. g* o. y! _
" m. l: h2 C, ^5 @9 \7 M; ^1 J) }7 I6 h2 Z( u
#define getchar() getc(stdin)#define putchar(c) putc(c, stdout)int ungetc(int c, FILE* stream); //把字符 c 退回流 stream格式化输入输出: 4 o% ~! t( n! c! f9 j3 n
) O! F% K ]( t; ?4 Z: I# M: N/ g
2 v( w' i ^( s6 n int scanf(const char *format, ...);int printf(const char *format, ...);int fscanf(FILE *stream, const char *format, ...);int fprintf(FILE *stream, const char *format, ...);int sscanf(char *s, const char *format, ...);int sprintf(char *s, const char *format, ...);行式输入输出: / z1 j3 s. q. {, }: E* Z4 n
/ G; p9 R8 P" l7 a. J0 t# ?
( X' e6 a3 [0 | b% a/ Q
0 H& B0 x2 ?. M$ G2 _# X char *fgets(char *buffer, int n, FILE *stream);int fputs(const char *buffer, FILE *stream);char *gets(char *s);int puts(const char *s);直接输入输出: : a! r7 u1 ~/ s
5 ^8 K$ x/ S+ U. B) {- 4 ]: w2 {6 Y" l; X' c" r3 _ I1 W! S
3 y% h O F4 e size_t fread(void *pointer, size_t size, size_t num, FILE *stream);size_t fwrite(const void *pointer, size_t size, size_t num, FILE *stream);
$ t$ d. `1 g9 B+ h |