7.8. 其它函数
标准库提供了很多功能各异的函数。本节将对其中特别有用的函数做一个简要的概述。
更详细的信息以及其它许多没有介绍的函数请参见附录 B。
7.8.1. 字符串操作函数
strcat(s, t) 将 t 指向的字符串连接到 s 指向的字符串的末尾
strncat(s, t, n) 将 t 指向的字符串中前 n 个字符连接到 s 指向的字符串的末尾
strcmp(s, t) if s<t return <0, s==t return 0, s>t return >0
strncmp(s, t, n) 同 strcmp 相同,但只在前 n 个字符中比较
strcpy(s, t) 将 t 指向的字符串复制到 s 指向的位置
strncpy(s, t, n) 将 t 指向的字符串中前 n 个字符复制到 s 指向的位置
strlen(s) 返回 s 指向的字符串的长度
strchr(s, c) 在 s 指向的字符串中查找 c,若找到,则返回指向它第一次出现的位置的指针,否则返回 NULL
strrchr(s, c) s 指向的字符串中查找 c,若找到,则返回指向它最后一次出现的位置的指针,否则返回 NULL
7.8.2. 字符类别测试和转换函数
头文件
isalpha(c) 若 c 是字母,则返回一个非 0 值,否则返回 0
isupper(c) 若 c 是大写字母,则返回一个非 0 值,否则返回 0
islower(c) 若 c 是小写字母,则返回一个非 0 值,否则返回 0
isdigit(c) 若 c 是数字,则返回一个非 0 值,否则返回 0
isalnum(c) 若 isalpha(c)或 isdigit(c),则返回一个非 0 值,否则返回 0
isspace(c) 若 c 是空格、横向制表符、换行符、回车符,换页符或纵向制表符,则返回一个非 0 值
toupper(c) 返回 c 的大写形式
tolower(c) 返回 c 的小写形式
7.8.3. ungetc 函数
标准库提供了一个称为 ungetc 的函数,它与第 4 章中编写的函数 ungetch 相比功能更
受限制。
int ungetc(int c, FILE *fp)
该函数将字符 c 写回到文件 fp 中。如果执行成功,则返回 c,否则返回 EOF。每个文件只能
接收一个写回字符。ungetc 函数可以和任何一个输入函数一起使用,比如 scanf、getc 或
getchar。
7.8.4. 命令执行函数
函数 system(char* s)执行包含在字符申 s 中的命令,然后继续执行当前程序。s 的
内容在很大程度上与所用的操作系统有关。下面来看一个 UNIX 操作系统环境的小例子。语
句
system(“date”);
将执行程序 date,它在标准输出上打印当天的日期和时间。system 函数返回一个整型的状
态值,其值来自于执行的命令,并同具体系统有关。在 UNIX 系统中,返回的状态是 exit 的
返回值。
7.8.5. 存储管理函数
函数 malloc 和 calloc 用于动态地分配存储块。函数 malloc 的声明如下:
void *malloc(size_t n)
当分配成功时,它返回一个指针,指针指向 n 字节长度的未初始化的存储空间,否则返回
NULL。函数 calloc 的声明为
void *calloc(size_t n, size_t size)
当分配成功时,它返回一个指针,该指针指向的空闲空间足以容纳由 n 个指定长度的对象组成的数组,否则返回 NULL, 该存储空间被初始化为 0。
根据请求的对象类型,malloc 或 calloc 函数返回的指针满足正确的对齐要求。下面的
例子进行了类型转换:
int *ip;
ip = (int *) calloc(n, sizeof(int));
free(p)
函数释放 p 指向的存储空间,其中,p 是此前通过调用 malloc 或 calloc 函数得到的指针。 存储空间的释放顺序没有什么限制, 但是, 如果释放一个不是通过调用 malloc或 calloc 函数得到的指针所指向的存储空间,将是一个很严重的错误。使用已经释放的存储空间同样是错误的。下面所示的代码是一个很典型的错误代码段,它通过一个循环释放列表中的项目:
for (p = head; p != NULL; p = p->next) /* WRONG */
free(p);
正确的处理方法是,在释放项目之前先将一切必要的信息保存起来,如下所示:
for (p = head; p != NULL; p = q) {
q = p->next;
free(p);
}
8.7 节给出了一个类似于 malloc 函数的存储分配程序的实现。该存储分配程序分配的存储块可以以任意顺序释放。
7.8.6. 数学函数
sin(x) x 的正弦函数,其中 x 用弧度表示
cos(x) x 的余弦函数,其中 x 用弧度表示
atan2(y, x) y/x 的反正切函数,其中,x 和 y 用弧度表示
exp(x) 指数函数 ex
log(x) x 的自然对数(以 e 为底) ,其中,x>0
log10(x) x 的常用对数(以 10 为底) ,其中,x>0
pow(x, y) 计算 xy的值
sqrt(x) x 的平方根(x≥0)
fabs(x) x 的绝对值
7.8.7. 随机数发生器函数
函数 rand()生成介于 0 和 RAND_MAX 之间的伪随机整数序列。其中 `RAND_MAX` 是在头文件<stdlib.h>中定义的符号常量。下面是一种生成大于等于 0 但小于 1 的随机浮点数的方法:
`#define frand() ((double) rand() / (RAND_MAX+1.0))`
(如果所用的函数库中已经提供了一个生成浮点随机数的函数,那么它可能比上面这个函数具有更好的统计学特性。 )
函数 srand(unsigned)设置 rand 函数的种子数。我们在 2.7 节中给出了遵循标准的rand 和 srand 函数的可移植的实现。