stdio.h头文件(常用输入输出函数)
printf()
函数:
把输出发送到一个叫作缓冲区(buffer)的中间存储区域。
- 当缓冲区满、遇到换行字符或需要输入的时候迫使
printf()
的输出被发送到屏幕上。
- 可以使用
fflush()
函数刷新缓冲区
printf()
的返回值是待显示字符的个数
printf()
中如果你不想预先指定字段宽度,希望通过程序来指定,那么可以用*修饰符代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是多少。也就是说,如果转换说明是%*d
,那么参数列表中应包含*和 d对应的值。这个技巧也可用于浮点值指定精度和字段宽度。(%*.*f
)
scanf()
函数:
scanf()函数每次读取都会跳过所有的空白字符,直至遇到第1个非空白字符才开始读取。
- 读取整数(%d):
scanf()
希望发现一个数字字符或者一个符号(+或-)。如果遇到一个非数字字符,它便认为读到了整数的末尾。scanf()
把非数字字符放回输入。意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。
- 读取字符(%c):读取单个字符
- 读取字符串(%s):
scanf()
会读取除空白以外的所有字符。意味着只能读取一个单词。
- 无法利用字段宽度让只有一个%s的
scanf()
读取多个单词。如果使用字段宽度,scanf()
在字段末尾或第1个空白字符处停止读取。
- 格式字符串中的普通字符:
scanf()
允许把普通字符放在格式字符串中。但除空格字符外的普通字符必须与输入字符串严格匹配。
- 假设在两个转换说明中加一个逗号:
scanf("%d,%d", &n, &m);``scanf()
函数将其解释成:用户将输入一个数字、一个逗号,然后再输入一个数字。也就是说,用户必须像下面这样进行输入两个整数:
- 由于格式字符串中,%d后面紧跟逗号,所以必须在输入第一个数后再输入一个逗号。
- 对于
scanf()
,一定要记得在变量名前加上地址运算符。
scanf()
的返回值=scanf()
成功读取的项数。如果没有读取任何项,或者需要读取一个数字而用户却输入一个非数值字符串,即类型不匹配,scanf()
便返回0。
- 当
scanf()
检测到“文件结尾”时,会返回EOF
(EOF是stdio.h中定义的特殊值,通常用#define
指令把EOF定义为-1
)。
scanf()
中如果把*放在%和转换字符之间时,会使得scanf()
跳过相应的输出项。
- 示例:
scanf("%*d %*d %d", &n);
其中的scanf()
指示:跳过两个整数,把第3个整数拷贝给n。
- 在程序需要读取文件中特定列的内容时,这项跳过功能很有用。
scanf()
函数检测到文件结尾时返回EOF。
getchar()
函数:
读取下一个输入字符
- 使用int数组时
getchar
只能赋值数字,无法赋值其他字符容易出错。
- getchar()和 putchar()不需要转换说明,因为它们只处理字符。
- 在C语言中,用
getchar()
读取文件检测到文件结尾时将返回EOF
。
- 把
getchar()
的返回值和EOF
作比较。如果两值不同,就说明没有到达文件结尾。
- 检测文件结尾:
while ((ch = getchar()) != EOF)
- 不能把
getchar()
和 scanf()
这两个函数混用
getchar()
读取每个字符,包括空格、制表符和换行符;
scanf()
在读取数字时则会跳过空格、制表符和换行符
- 以 int 类型读取字符(这样做可以检测 EOF)
putchar()
函数:
打印一个字符
gets()
函数:
读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在这些字符的末尾添加一个空字符使其成为一个 C字符串。
- 经典用法:
gets(words);
- words是一个char型数组。如果输入的字符串过长,会导致缓冲区溢出,可能出现问题。
- 过去通常用fgets()来代替gets(),其在处理输入方面与gets()略有不同。
- C11标准新增的gets_s()函数也可代替gets()。该函数与gets()函数更接近,而且可以替换现有代码中的gets()。但它是stdio.h输入/输出函数系列中的可选扩展。
puts()
函数:
只用于显示字符串,而且自动在显示的字符串末尾加上换行符。
- 该函数在遇到空字符时就停止输出,所以必须确保有空字符。
fgets(,,)
函数:
- 第1个参数是数组,
- 第2个参数指明了读入字符的最大数量。通过限制读入的字符数来解决溢出的问题。该函数专门设计用于处理文件输入。
- 如果该参数的值是n,那么fgets()将读入n-1个字符,或者读到遇到的第一个换行符为止。
- 如果fgets()读到一个换行符,会把它储存在字符串中。
- fgets()函数的第3 个参数指明要读入的文件。
- 如果读入从键盘输入的数据,则以
stdin(标准输入)
作为参数
- fgets()函数把换行符放在字符串的末尾,通常要与 fputs()函数配对使用,除非该函数不在字符串末尾添加换行符。
- 使用循环语句fgets()读不到换行会一直读,直到读完一整行,这样可以某种程度上无视数组大小的限制。
- 示例:
while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
fputs(,)
函数:
是puts()针对文件定制的版本。
- 第2个参数指明要写入数据的文件。如果要打印在显示器上,
stdout(标准输出)
作为该参数
- 不在字符串末尾添加换行符。
- 注意,gets()丢弃输入中的换行符,但是
puts()
在输出中添加换行符。
- 另一方面,
fgets()
保留输入中的换行符,fputs()
不在输出中添加换行符。
- 使用示例:
fputs(words, stdout);
gets_s()
函数:
和fgets()
类似,都用一个参数限制读入的字符数。
- gets_s()只从标准输入中读取数据,所以不需要第3个参数。
- 如果gets_s()读到换行符,会丢弃它而不是储存它。
- 如果gets_s()读到最大字符数都没有读到换行符,首先会把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。
- 而fgets()会将它们保留在输入行。只要输入行未超过最大字符数,gets_s()和gets()几乎一样,完全可以用gets_s()替换gets()。
string.h头文件(字符串函数)
C库提供了多个处理字符串的函数,ANSI C把这些函数的原型放在string.h头文件中。要注意的是sprintf()
函数,其原型在stdio.h头文件
中。
strlen()
函数
strcat()
函数
- 用于拼接字符串。
- 接受两个字符串作为参数
- 把第2个字符串的备份附加在第1个字符串末尾
- 把拼接后形成的新字符串作为第1个字符串
- 第2个字符串不变。
- 删除第一个字符串原来末尾的“\0”
- 该函数返回第1个参数,即拼接第2个字符串后的第1个字符串的地址。
- 注意,该函数无法检查第1个数组是否能容纳第2个字符串
strncat()
函数
strcmp()
函数
- 用于字符串比较。
- 该函数通过比较运算符来比较字符串。如果两个字符串参数相同,该函数就返回0,否则返回非零值。
- 可以用
strcmp()
比较储存在不同大小数组中的字符串。
- 如果在字母表中第1个字符串位于第2个字符串前面,就返回负数;反之则返回正数
strcmp()
比较所有的字符,按机器排序序列进行比较
strncmp()
函数
- 可以比较到字符不同的地方,也可以只比较第3个参数指定的字符数。
stricmp()
函数
- 比较两个字符串忽略大小写后的大小
- 返回值和上述相同
strcpy()
函数
- 用于拷贝整个字符串。
- 相当于字符串赋值运算符。
- 第1个参数不必指向数组的开始。
- 第2个参数指向的字符串被拷贝至第1个参数指向的数组中。
- 拷贝出来的字符串被称为目标字符串,最初的字符串被称为源字符串。
- 该函数返回类型是 char*,返回的是第 1个参数的值,即一个字符的地址。
strncpy()
函数
- 该函数的第 3 个参数指明可拷贝的最大字符数。
- 如果拷贝到第n个字符时还未拷贝完整个源字符串,就不会拷贝空字符,此时需要有处理程序。
strncpy(qwords[i], temp, TARGSIZE - 1);
qwords[i][TARGSIZE - 1] = '\0';//确保储存的是一个字符串。
sprintf()
函数
- 把数据写入字符串,而不是打印在显示器上。
sprintf(,”%”,)
- 第1个参数是目标字符串的地址。其余参数和printf()相同。
strpbrk()
函数
- 参数都为字符串
- 如果第一个参数中包含第二个参数中的任意字符,返回指向 s1 字符串首位置的指针;反之则返回空字符。
strchr()
函数
- 第一个参数为字符串,第二个参数为字符
- 如果字符串中包含该字符,返回该字符的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);反之则返回空指针。
strrchr()
函数
- 第一个参数为字符串,第二个参数为字符
- 该函数返回字符串中某字符的最后一次出现的位置(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果未找到c字符,则返回空指针。
strset()
函数
- 第一个参数为字符串,第二个参数为字符,第三个参数为数字
- 将字符串签名n个字符都设为指定字符
strstr()
函数
- 参数都为字符串
- 该函数返回指向第一个参数中第二个参数出现的首位置。如果在第一个参数中没有找到第二个参数,则返回空指针。
size_t类型
- 是sizeof运算符返回的类型
- 声明示例:
size_t strlen(const char * s);
- 该函数返回s字符串中的字符数,不包括末尾的空字符。
atoi/l/f()函数
- 用于把字母数字转换成整数
- 该函数接受一个字符串作为参数,返回相应的整数值。
- atoi()、atol()和atof()函数把字符串形式的数字分别转换成int、long和double类型的数字。
strtol()、strtoul()和strtod()函数把字符串形式的数字分别转换成long、unsigned long和double类型的数字。
格式转换是按照AXCII表来的,’0’转换完是48,一定要注意不是0。
使用技巧:
查找字符串并分析时
当比较字符串时
- 使用strcpy()或strncpy()代替赋值运算符把字符串赋给字符数组。
Ctype.h头文件
字符测试函数名称 |
如果是下列参数,返回值为真 |
isalnum() |
字母或数字 |
isdigit() |
数字 |
isxdigit() |
十六进制字符 |
isalpha() |
字母 |
islower() |
小写字母 |
isupper() |
大写字母 |
iscntrl() |
控制字符,如Ctrl+B |
isprint() |
可打印字符 |
isblank() |
标准的空白字符(空格、水平制表符或换行符)或任何其他本地化指定为空白的字符 |
isspace() |
空白字符(空格、换行符、回车符、换页符、垂直制表符、水平制表符或其他本地化定义的字符) |
isgraph() |
除空格以外的任何可打印字符 |
ispunct() |
标点符号(除空格或字母数字以外的任何可打印字符) |
字符映射函数名称 |
行为 |
tolower() |
如果参数是大写字符,该函数返回小写字符,否则返回原始参数 |
toupper() |
如果参数是小写字符,该函数返回小大写字符,否则返回原始参数 |
stdlib.h头文件
内存分配函数 |
效果 |
malloc(size_t size) |
分配一块内存区域 |
calloc(size_t num, size_t size) |
分配一块内存区域,并初始化为0 |
realloc(void *ptr, size_t new_size) |
改变先前分配的内存区域的大小 |
free(void *ptr) |
释放先前分配的内存区域 |
程序控制函数 |
效果 |
exit(int status) |
终止当前程序的执行 |
abort(void) |
生成一个异常信号,导致程序异常终止 |
system(const char *command) |
执行一个命令 |
转换函数 |
效果 |
atoi(const char *str) |
将字符串转换为整数 |
atol(const char *str) |
将字符串转换为长整数 |
atof(const char *str) |
将字符串转换为浮点数 |
strtol(const char *str, char **endptr, int base) |
将字符串转换为长整数 |
strtod(const char *str, char **endptr) |
将字符串转换为双精度浮点数 |
随机数生成函数 |
效果 |
rand(void) |
生成一个伪随机数 |
srand(unsigned int seed) |
设置随机数生成器的种子 |
搜索和排序函数 |
效果 |
qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *)) |
对数组进行排序 |
bsearch(const void *key, const void *base, size_t num, size_t size, int (*compar)(const void *, const void *)) |
在已排序的数组中二分查找 |
其他实用工具函数 |
效果 |
abs(int j) |
返回整数的绝对值 |
labs(long int j) |
返回长整数的绝对值 |
div(int numerator, int denominator) |
执行除法运算并返回商和余数 |
ldiv(long int numerator, long int denominator) |
执行长整数除法运算并返回商和余数 |
mbstowcs(wchar_t *restrict pwcs, const char *restrict s, size_t n) |
将多字节字符串转换为宽字符字符串 |
wcstombs(char *restrict s, const wchar_t *restrict pwcs, size_t n) |
将宽字符字符串转换为多字节字符串 |
math.h头文件
常数 |
含义 |
M_PI |
圆周率 π 的值 |
M_E |
自然对数的底数 e 的值 |
M_LOG2E |
log2(e) 的值 |
M_LOG10E |
log10(e) 的值 |
M_LN2 |
自然对数 ln(2) 的值 |
M_LN10 |
自然对数 ln(10) 的值 |
M_PI_2 |
π/2 的值 |
M_PI_4 |
π/4 的值 |
M_1_PI |
1/π 的值 |
M_2_PI |
2/π 的值 |
M_2_SQRTPI |
2/√π 的值 |
M_SQRT2 |
√2 的值 |
M_SQRT1_2 |
1/√2 的值 |
幂函数 |
效果 |
pow(x, y) |
计算 x 的 y 次幂,返回double型 |
sqrt(x) |
计算 x 的平方根 |
cbrt(x) |
计算 x 的立方根 |
三角函数 |
效果 |
sin(x) |
计算 x(以弧度为单位)的正弦值 |
cos(x) |
计算 x(以弧度为单位)的余弦值 |
tan(x) |
计算 x(以弧度为单位)的正切值 |
asin(x) |
计算 x 的反正弦值 |
acos(x) |
计算 x 的反余弦值 |
atan(x) |
计算 x 的反正切值 |
atan2(y, x) |
计算 y/x 的反正切值 |
指数和对数函数 |
效果 |
exp(x) |
计算 e 的 x 次幂 |
log(x) |
计算 x 的自然对数 |
log10(x) |
计算 x 的以10为底的对数 |
log2(x) |
计算 x 的以2为底的对数 |
超越函数 |
效果 |
sinh(x) |
计算 x 的双曲正弦值 |
cosh(x) |
计算 x 的双曲余弦值 |
tanh(x) |
计算 x 的双曲正切值 |
其他函数 |
效果 |
fabs(x) |
计算 x 的绝对值 |
ceil(x) |
计算大于或等于 x 的最小整数 |
floor(x) |
计算小于或等于 x 的最大整数 |
fmod(x, y) |
计算 x 除以 y 的余数 |
round(x) |
将 x 四舍五入到最近的整数 |
trunc(x) |
将 x 截断为整数 |