【Spring Boot 源码学习】@SpringBootApplication 注解
引言
在 Huazie 前面的博文 《Spring Boot 核心运行原理介绍》中,我们初步了解了 Spring Boot
核心运行原理,知道了 @EnableAutoConfiguration
是用来开启自动配置的注解。但创建过 Spring Boot 项目的读者肯定会说,我们并没有直接看到这个注解,实际上前面我也提到,它是由组合注解 @SpringBootApplication
引入的。
在 Huazie 前面的博文 《Spring Boot 核心运行原理介绍》中,我们初步了解了 Spring Boot
核心运行原理,知道了 @EnableAutoConfiguration
是用来开启自动配置的注解。但创建过 Spring Boot 项目的读者肯定会说,我们并没有直接看到这个注解,实际上前面我也提到,它是由组合注解 @SpringBootApplication
引入的。
上篇介绍了 ThreadPoolExecutor
配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。
还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。
函数声明 | 函数功能 |
---|---|
double tan(double x) |
计算 以弧度 x 为单位的角度的正切值(double) |
float tanf(float x) |
计算 以弧度 x 为单位的角度的正切值(float) |
long double tanl(long double x) |
计算 以弧度 x 为单位的角度的正切值(long double) |
double tanh(double x); |
计算 x 的双曲正切值(double) |
float tanhf(float x); |
计算 x 的双曲正切值(float) |
long double tanhl(long double x); |
计算 x 的双曲正切值(long double) |
off_t tell(int fd); |
用于返回文件指针当前位置相对于文件开头的偏移量 |
long int telldir(DIR *dirp); |
获取目录流的当前位置 |
int textheight(char *string); |
用于获取当前文本模式下字符的高度 |
int textwidth(char *string); |
用于获取当前文本模式下字符的宽度 |
time_t time(time_t *timer); |
可以用于获取从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数 |
FILE *tmpfile(void); |
可以用于在临时目录中创建一个唯一的临时文件,并返回文件指针 |
char *tmpnam(char *s); |
用于创建一个唯一的临时文件名 |
int toascii(int c); |
将一个字符转换为其对应的 ASCII 码值 |
int tolower(int c); |
可以用于将一个 ASCII 字符转换为小写字母 |
int toupper(int c); |
可以用于将一个 ASCII 字符转换为大写字母 |
double trunc(double x); |
截取 x 的小数部分,并返回整数部分(double) |
float truncf(float x); |
截取 x 的小数部分,并返回整数部分(float) |
long double truncl(long double x); |
截取 x 的小数部分,并返回整数部分(long double) |
void tzset(void); |
可以用于设置时区信息 |
double tgamma(double x); |
用于计算 Gamma 函数(double) |
float tgammaf(float x); |
用于计算 Gamma 函数(float) |
long double tgammal(long double x); |
用于计算 Gamma 函数(long double) |
函数声明 | 函数功能 |
---|---|
double tan(double x) |
计算 以弧度 x 为单位的角度的正切值(double) |
float tanf(float x) |
计算 以弧度 x 为单位的角度的正切值(float) |
long double tanl(long double x) |
计算 以弧度 x 为单位的角度的正切值(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double tanh(double x); |
计算 x 的双曲正切值(double) |
float tanhf(float x); |
计算 x 的双曲正切值(float) |
long double tanhl(long double x); |
计算 x 的双曲正切值(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
off_t tell(int fd); |
用于返回文件指针当前位置相对于文件开头的偏移量 |
参数:
1 |
|
在上面这个示例中,
tell()
函数获取了当前的文件偏移量。read()
函数读取了一些数据,并再次使用 tell()
函数来获取新的文件偏移量。close()
函数关闭文件。注意:tell()
函数和 lseek
函数的功能类似,但有一个重要的区别:tell()
函数只用于查询当前位置,而不能修改文件指针的位置。如果要修改文件指针的位置,请使用 lseek()
函数。
下面我们来看看,使用 lseek()
函数来演示上面的 tell()
函数的示例 :
1 |
|
函数声明 | 函数功能 |
---|---|
long int telldir(DIR *dirp); |
获取目录流的当前位置 |
参数:
DIR
类型结构体的指针1 |
|
函数声明 | 函数功能 |
---|---|
int textheight(char *string); |
用于获取当前文本模式下字符的高度 |
int textwidth(char *string); |
用于获取当前文本模式下字符的宽度 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
time_t time(time_t *timer); |
可以用于获取从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数 |
参数:
time_t
类型对象的指针,如果不想使用此参数,可以将它设置为 NULL
1 |
|
在上面的示例中,
time()
函数来获取当前时间的秒数;ctime()
函数将其转换为可读的日期和时间格式;函数声明 | 函数功能 |
---|---|
FILE *tmpfile(void); |
可以用于在临时目录中创建一个唯一的临时文件,并返回文件指针 |
1 |
|
在上述的示例中,
tmpfile()
函数创建一个临时文件;fputs()
函数将字符串 "这是一个临时文件"
写入该文件;rewind()
函数将文件指针移动到文件开始处;fgets()
函数从临时文件中读取数据并将其存储到字符串数组 str
中;注意: 使用 tmpfile()
创建的临时文件只在程序运行期间存在,并在程序终止时自动删除。如果需要在程序运行期间保留临时文件,请使用 tmpnam()
或 mkstemp()
等函数来创建文件。
函数声明 | 函数功能 |
---|---|
char *tmpnam(char *s); |
用于创建一个唯一的临时文件名 |
参数:
s
等于 NULL
,则函数会返回指向静态内存区的指针,该内存区包含了唯一的临时文件名1 |
|
在上面的示例中,
tmpnam()
函数创建一个唯一的临时文件名;tmpname
中;注意: 使用 tmpnam()
创建的临时文件名只在程序运行期间存在,不具有真正唯一性,因此可能存在一定程度的风险。如果需要创建一个具有真正唯一性的临时文件,请考虑使用 mkstemp()
或类似的函数。
函数声明 | 函数功能 |
---|---|
int toascii(int c); |
将一个字符转换为其对应的 ASCII 码值 |
参数:
1 |
|
注意 : toascii()
函数已经过时,不建议在新代码中使用。在 C99
标准中,改用更安全的 isascii()
函数来检查字符是否为 7-bit ASCII
字符,并使用位掩码操作或其他算法来将非 ASCII
字符转换为相应的 7-bit ASCII
码值。
知识点: 7-bit ASCII
,也称为美国信息交换标准代码 (American Standard Code for Information Interchange
),是一种基于英语的字符编码系统,使用 7
个二进制位(即一个字节)表示每个字符。它涵盖了拉丁字母、数字、标点符号和一些特殊符号,共计 128
个字符。
函数声明 | 函数功能 |
---|---|
int tolower(int c); |
可以用于将一个 ASCII 字符转换为小写字母 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
int toupper(int c); |
可以用于将一个 ASCII 字符转换为大写字母 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
double trunc(double x); |
截取 x 的小数部分,并返回整数部分(double) |
float truncf(float x); |
截取 x 的小数部分,并返回整数部分(float) |
long double truncl(long double x); |
截取 x 的小数部分,并返回整数部分(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
void tzset(void); |
可以用于设置时区信息 |
UNIX/Linux 下示例:
1 |
|
windows 下示例:
1 |
|
在上述示例代码中,
rawtime
和 timeinfo
,分别用于存储当前时间和时间结构体。GetTimeZoneInformation()
函数获取当前系统时区信息,并将其存储在 tzinfo
变量中。WideCharToMultiByte()
函数将 tzinfo.StandardName
转换为 UTF-8
编码的字符串,并将其存储在 standard_name
变量中。putenv_s()
函数将 standard_name
设置为环境变量 TZ
的值,并使用 tzset 函数更新本地时区信息。localtime()
函数将 rawtime
转换为时间结构体 timeinfo
。asctime()
函数将时间结构体 timeinfo
转换为字符串格式,并输出到标准输出流中。standard_name
分配的内存空间,并正常结束程序。函数声明 | 函数功能 |
---|---|
double tgamma(double x); |
用于计算 Gamma 函数(double) |
float tgammaf(float x); |
用于计算 Gamma 函数(float) |
long double tgammal(long double x); |
用于计算 Gamma 函数(long double) |
1 |
|
知识点: 伽玛函数(Gamma
函数),也叫欧拉第二积分,是阶乘函数在实数与复数上扩展的一类函数。
函数声明 | 函数功能 |
---|---|
char * strdup(const char *s); |
用于将一个以 NULL 结尾的字符串复制到新分配的内存空间中 |
int stricmp(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
char *strerror(int errnum); |
用于将指定的错误码转换为相应的错误信息 |
int strcmpi(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
int strncmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等 |
int strncmpi(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
char *strncpy(char *dest, const char *src, size_t n); |
用于将一个字符串的一部分拷贝到另一个字符串中 |
int strnicmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
char *strnset(char *str, int c, size_t n); |
用于将一个字符串的前n个字符都设置为指定的字符 |
char *strpbrk(const char *str1, const char *str2); |
用于在一个字符串中查找任意给定字符集合中的字符的第一次出现位置 |
char *strrchr(const char *str, int character); |
在给定的字符串中查找指定字符的最后一个匹配项 |
char *strrev(char *str); |
将给定字符串中的所有字符顺序颠倒,并返回颠倒后的字符串 |
char *strset(char *str, int character); |
用于设置给定字符串中的所有字符为指定的值,并返回修改后的字符串 |
size_t strspn(const char *str1, const char *str2); |
计算字符串 str1 中包含在字符串 str2 中的前缀子字符串长度,并返回该长度值 |
char *strstr(const char *str1, const char *str2); |
在字符串 str1 中查找第一个出现的字符串 str2,如果找到了,则返回指向该位置的指针;否则,返回 NULL |
double strtod(const char *str, char **endptr); |
将字符串 str 转换为一个浮点数(double 类型),并返回该浮点数。如果发生了转换错误,则返回 0.0,并且可以通过 endptr 指针返回指向第一个无法转换的字符的指针。 |
char *strtok(char *str, const char *delim); |
用于将一个字符串分割成多个子字符串 |
long int strtol(const char *str, char **endptr, int base); |
将字符串 str 转换为一个长整型数(long int 类型) |
char *strupr(char *str); |
将字符串 str 中的所有小写字母转换为大写字母,并返回指向该字符串的指针 |
void swab(const void *src, void *dest, ssize_t nbytes); |
将源缓冲区中的每两个相邻字节进行互换,然后将结果存储到目标缓冲区中 |
int system(const char *command); |
执行一个 shell 或 cmd 命令,并等待命令的完成 |
函数声明 | 函数功能 |
---|---|
char * strdup(const char *s); |
用于将一个以 NULL 结尾的字符串复制到新分配的内存空间中 |
注意: strdup()
函数返回指向新分配的内存空间的指针,如果空间不足则返回 NULL
。调用者负责释放返回的指针所指向的内存空间。 strdup()
函数与strcpy()
函数类似,但是它会动态地分配内存空间,而 strcpy()
需要调用者提供足够大的目标缓冲区。
1 |
|
函数声明 | 函数功能 |
---|---|
int stricmp(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 |
|
函数声明 | 函数功能 |
---|---|
char *strerror(int errnum); |
用于将指定的错误码转换为相应的错误信息 |
参数:
返回值:
指向错误信息字符串的指针,该字符串描述了与错误码相关的错误
1 |
|
函数声明 | 函数功能 |
---|---|
int strcmpi(const char *s1, const char *s2); |
用于比较两个字符串的字母序是否相等,忽略大小写 |
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 |
|
看到这里,可能会疑惑 上面不是已经有了 忽略大小写的字符串比较了嘛?
那 strcmpi
和 stricmp
有什么区别呢?
虽然它们的实现功能相同,但是不同的编译器或操作系统可能会提供其中一个或两个函数。在具备这两个函数的系统中,strcmpi
常常作为 VC(Visual C++)
和 Borland C++
的扩展库函数,而 stricmp
则是 POSIX
标准中定义的函数,在许多 类UNIX系统 上可用。因此,如果需要编写可移植的代码,则应该使用 stricmp
函数,而不是 strcmpi
函数。
函数声明 | 函数功能 |
---|---|
int strncmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等 |
参数:
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 |
|
函数声明 | 函数功能 |
---|---|
int strncmpi(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
参数:
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 |
|
注意: strncmpi
函数不是 C
语言标准库中的函数,但在某些编译器或操作系统中可能会提供。
函数声明 | 函数功能 |
---|---|
char *strncpy(char *dest, const char *src, size_t n); |
用于将一个字符串的一部分拷贝到另一个字符串中 |
参数:
1 |
|
当源字符串长度小于 n
时,strncpy()
函数将在目标字符串的末尾填充 \0
字符以达到指定的拷贝长度 n
1 |
|
如果源字符串长度大于等于 n
个字符,strncpy()
函数将会拷贝源字符串的前 n
个字符到目标字符串中,并且不会自动添加末尾的 \0
字符。这种情况下,目标字符串可能不是以 \0
字符结尾,因此需要手动在拷贝后的目标字符串中添加 \0
字符。
函数声明 | 函数功能 |
---|---|
int strnicmp(const char *s1, const char *s2, size_t n); |
用于比较两个字符串的前n个字符是否相等,忽略大小写 |
参数:
返回值:
s1
和 s2
代表的字符串相等(忽略大小写),则返回 0
;s1
比 s2
小,则返回负数;s1
比 s2
大,则返回正数。1 |
|
函数声明 | 函数功能 |
---|---|
char *strnset(char *str, int c, size_t n); |
用于将一个字符串的前n个字符都设置为指定的字符 |
参数:
1 |
|
注意: strnset()
函数是非标准函数,并不是所有的编译器和操作系统都支持该函数。如果需要跨平台兼容,请使用标准库函数 memset()
来实现类似的功能
1 |
|
上述示例使用了标准库函数 memset
来将 str
的前 5
个字符都设置为 *
函数声明 | 函数功能 |
---|---|
char *strpbrk(const char *str1, const char *str2); |
用于在一个字符串中查找任意给定字符集合中的字符的第一次出现位置 |
参数:
注意: 如果在str1
中没有找到str2
中的任何字符,则 strpbrk
函数返回NULL
指针
1 |
|
函数声明 | 函数功能 |
---|---|
char *strrchr(const char *str, int character); |
在给定的字符串中查找指定字符的最后一个匹配项 |
参数:
返回值:
1 |
|
函数声明 | 函数功能 |
---|---|
char *strrev(char *str); |
将给定字符串中的所有字符顺序颠倒,并返回颠倒后的字符串 |
参数:
注意:因为 strrev()
函数是一个非标准的库函数,许多编译器可能并不支持该函数,所以在使用该函数之前,请确保你的编译器支持它。
1 |
|
函数声明 | 函数功能 |
---|---|
char *strset(char *str, int character); |
用于设置给定字符串中的所有字符为指定的值,并返回修改后的字符串 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
size_t strspn(const char *str1, const char *str2); |
计算字符串 str1 中包含在字符串 str2 中的前缀子字符串长度,并返回该长度值 |
参数:
1 |
|
上述示例代码运行后,如果出现 error: 'strndup' was not declared in this scope
,说明当前的编译器不支持 strndup()
函数。
因为 strndup()
函数是 C11
新增的函数,因此可能不是所有编译器都支持。
那我们就用如下的方式来替换一下 :
1 |
|
函数声明 | 函数功能 |
---|---|
char *strstr(const char *str1, const char *str2); |
在字符串 str1 中查找第一个出现的字符串 str2,如果找到了,则返回指向该位置的指针;否则,返回 NULL |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
double strtod(const char *str, char **endptr); |
将字符串 str 转换为一个浮点数(double 类型),并返回该浮点数。如果发生了转换错误,则返回 0.0,并且可以通过 endptr 指针返回指向第一个无法转换的字符的指针。 |
参数: |
1 |
|
函数声明 | 函数功能 |
---|---|
char *strtok(char *str, const char *delim); |
用于将一个字符串分割成多个子字符串 |
参数:
返回值: 分割后的第一个子字符串,并在每次调用时修改传入的原始字符串 str,使其指向下一个要被分割的子字符串
1 |
|
在上述的示例中,
str
和 字符集合 delim
;strtok()
函数将字符串 str
按照字符集合 delim
中的分隔符进行分割。每次调用 strtok()
函数时,它会返回分割出的第一个子字符串,并且会修改 str
指向下一个将要被分割的子字符串。strtok()
函数,并输出返回的每个子字符串,直到没有更多的子字符串可以分割为止函数声明 | 函数功能 |
---|---|
long int strtol(const char *str, char **endptr, int base); |
将字符串 str 转换为一个长整型数(long int 类型) |
参数:
2
到 36
之间的有效数字或者 0
。为 0
表示采用默认的进制数,即可以解释成合法的整数的最大进制数(一般是 10
)返回值:
0
,并且可以通过 endptr
指针返回指向第一个无法转换的字符的指针。1 |
|
函数声明 | 函数功能 |
---|---|
char *strupr(char *str); |
将字符串 str 中的所有小写字母转换为大写字母,并返回指向该字符串的指针 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
void swab(const void *src, void *dest, ssize_t nbytes); |
将源缓冲区中的每两个相邻字节进行互换,然后将结果存储到目标缓冲区中 |
参数:
1 |
|
上面示例中,我在一开始演示时,因为没有加上 #include <unistd.h>
这个头文件,导致出现如下错误:
函数声明 | 函数功能 |
---|---|
int system(const char *command); |
执行一个 shell 或 cmd 命令,并等待命令的完成 |
参数:
shell
或 cmd
命令。下面演示 执行 ls -l
的 shell
命令,笔者是在 windows
环境下运行,故会出错,详见运行结果那里
1 |
|
再来看下,演示使用 dir
命令,在 windows
下可以输出当前目录下的所有文件和子目录
1 |
|
函数声明 | 函数功能 |
---|---|
unsigned int sleep(unsigned int seconds); |
它是 C 语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为止。 |
void Sleep(DWORD milliseconds); |
它是 Windows API 中的一部分,与 sleep 函数类似,它可以使当前线程挂起一段时间。 |
int sopen(const char* filename, int access, int sharemode, int shflag, ...); |
它是 Microsoft Visual C++ 中的一个函数,用于打开文件并返回文件句柄。与标准库中的 fopen 函数不同,sopen 函数支持以二进制方式打开文件,并且可以指定文件读写方式、共享模式和文件访问权限等参数。 |
void sound(int frequency); |
用于发出声音,sound 函数会持续发出声音,直到调用 nosound 函数停止 |
int spawnl(int mode, const char *cmdname, const char *arg0, ..., NULL); |
它是在 Windows 平台上使用的函数,用于启动另一个程序,并等待该程序运行结束后再继续执行本程序 |
int spawnle(int mode, const char *cmdname, const char *arg0, ..., const char *envp[]); |
它是在 Windows 平台上使用的函数,可以启动另一个程序,并通过指定的环境变量传递参数 |
int sprintf(char *str, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中 |
int snprintf(char *str, size_t size, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中,类似于 sprintf 函数,但它可以限制输出字符串的长度,避免缓冲区溢出 |
double sqrt(double x); |
计算 x 的平方根(double) |
float sqrtf(float x); |
计算 x 的平方根 (float) |
long double sqrtl(long double x); |
计算 x 的平方根 (long double) |
void srand(unsigned int seed); |
用于初始化伪随机数生成器 |
int sscanf(const char *str, const char *format, ...); |
用于从字符串中读取数据并进行格式化转换 |
int stat(const char *path, struct stat *buf); |
用于获取文件或目录的属性信息,例如文件大小、创建时间、修改时间等。这些属性信息都被保存在一个名为 struct stat 的结构体中。 |
int stime(const time_t *t); |
它是是 Unix/Linux 系统中的一个系统调用函数,用于设置系统时间 |
char *stpcpy(char *dest, const char *src); |
用于复制一个字符串到另一个字符串缓冲区,并返回目标字符串的结尾指针 |
char* strcat(char* dest, const char* src); |
用于将一个字符串拼接到另一个字符串的末尾 |
char* strchr(const char* str, int c); |
用于查找字符串中第一次出现指定字符的位置,并返回该位置的指针 |
int strcmp(const char* str1, const char* str2); |
用于比较两个字符串是否相等 |
char* strcpy(char* dest, const char* src); |
用于将一个字符串复制到另一个字符串缓冲区中 |
size_t strcspn(const char* str, const char* charset); |
用于查找字符串中第一次出现指定字符集合中任何字符的位置,并返回该位置的索引 |
函数声明 | 函数功能 |
---|---|
unsigned int sleep(unsigned int seconds); |
它是 C 语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为止。 |
void Sleep(DWORD milliseconds); |
它是 Windows API 中的一部分,与 sleep 函数类似,它可以使当前线程挂起一段时间。 |
sleep 函数参数:
Sleep 函数参数:
1 |
|
在使用 sleep()
函数时,将会使当前线程或者进程暂停指定的时间,以便给其他进程或线程执行机会,同时也可以用来控制程序的运行速度。
虽然 sleep()
函数很简单,但是需要注意以下几点:
sleep()
的精度并不高,它所挂起的时间可能会略微超过要求的时间。sleep()
函数是阻塞式的,即在调用 sleep()
函数期间,该进程不能进行任何其他操作,包括响应信号等。sleep()
函数期间,如果发生信号,那么 sleep()
函数将被中断,该进程将继续运行。1 |
|
由于 Sleep()
函数是阻塞式的,因此该函数调用期间,当前线程将被阻塞。在函数调用结束后,该线程将恢复运行。
在 Windows
系统下使用 Sleep()
函数时,需要注意以下几点:
Sleep()
函数以毫秒为单位指定时间,精度比 sleep()
函数更高。Sleep()
函数期间,当前线程将被阻塞,不能进行任何其他操作,包括响应信号等。Sleep()
函数期间,如果发生信号,那么 Sleep()
函数将被中断,该线程将继续运行。函数声明 | 函数功能 |
---|---|
int sopen(const char* filename, int access, int sharemode, int shflag, ...); |
它是 Microsoft Visual C++ 中的一个函数,用于打开文件并返回文件句柄。与标准库中的 fopen 函数不同,sopen 函数支持以二进制方式打开文件,并且可以指定文件读写方式、共享模式和文件访问权限等参数。 |
参数:
_O_RDONLY
:只读方式打开文件_O_WRONLY
:只写方式打开文件_O_RDWR
:读写方式打开文件_O_APPEND
:在文件末尾追加数据_O_CREAT
:如果文件不存在,则创建文件_O_TRUNC
:如果文件已存在,清空文件内容_O_EXCL
:与 _O_CREAT
配合使用,如果文件已经存在则打开失败_SH_DENYRW
:独占方式打开文件,其他进程不能读取或写入该文件_SH_DENYWR
:共享读取方式打开文件,其他进程不能写入该文件_SH_DENYRD
:共享写入方式打开文件,其他进程不能读取该文件_SH_DENYNO
:共享方式打开文件,其他进程可以读取和写入该文件_S_IWRITE
:文件可写_S_IREAD
:文件可读_O_CREAT
参数,则需要指定文件的访问权限1 |
|
指定文件共享模式,如果没有对应的宏常量,则可以定义如下:
1 |
函数声明 | 函数功能 |
---|---|
void sound(int frequency); |
用于发出声音 |
void nosound(void); |
sound 函数会持续发出声音,直到调用 nosound 函数停止 |
参数:
1 |
|
Windows 下如果上述出现 error: 'sound' was not declared in this scope
,可以使用如下:
1 |
|
注意: 在 Windows
平台上建议使用 Beep()
函数代替 sound()
函数,因为 Beep()
函数不需要特殊的硬件支持,并且可移植性更好。
函数声明 | 函数功能 |
---|---|
int spawnl(int mode, const char *cmdname, const char *arg0, ..., NULL); |
它是在 Windows 平台上使用的函数,用于启动另一个程序,并等待该程序运行结束后再继续执行本程序 |
参数:
P_WAIT
或 P_NOWAIT
NULL
结尾1 |
|
1 |
|
如果在使用 spawnl()
函数时遇到了 "Error from spawnl: Invalid argument"
错误,有可能是由于参数传递不正确或要执行的程序不存在等原因导致的。
以下是一些可能导致该错误的情况:
cmdname
参数包含非法字符或格式不正确。NULL
结尾。函数声明 | 函数功能 |
---|---|
int spawnle(int mode, const char *cmdname, const char *arg0, ..., const char *envp[]); |
它是在 Windows 平台上使用的函数,可以启动另一个程序,并通过指定的环境变量传递参数 |
参数:
P_WAIT
或 P_NOWAIT
NULL
结尾1 |
|
1 |
|
函数声明 | 函数功能 |
---|---|
int sprintf(char *str, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
int snprintf(char *str, size_t size, const char *format, ...); |
用于将格式化的字符串输出到指定的缓冲区中,类似于 sprintf 函数,但它可以限制输出字符串的长度,避免缓冲区溢出 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
double sqrt(double x); |
计算 x 的平方根(double) |
float sqrtf(float x); |
计算 x 的平方根 (float) |
long double sqrtl(long double x); |
计算 x 的平方根 (long double) |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
void srand(unsigned int seed); |
用于初始化伪随机数生成器 |
参数:
1 |
|
注意: 如果不设置种子值,则每次程序运行时都会得到相同的随机数序列。因此,我们在实际开发中,常常使用时间戳或其他随机值来作为种子值,以确保生成的随机数具有更好的随机性。
函数声明 | 函数功能 |
---|---|
int sscanf(const char *str, const char *format, ...); |
用于从字符串中读取数据并进行格式化转换 |
参数:
1 |
|
在上述的示例代码中,我们使用 sscanf()
函数从字符串 "hello world 123"
中读取一个字符串和一个整数,并输出到控制台。
注意: 在格式字符串中,%s
表示读取一个字符串,%d
表示读取一个整数。另外,%*s
表示读取并忽略一个字符串。
函数声明 | 函数功能 |
---|---|
int stat(const char *path, struct stat *buf); |
用于获取文件或目录的属性信息,例如文件大小、创建时间、修改时间等。这些属性信息都被保存在一个名为 struct stat 的结构体中。 |
参数:
struct stat
结构体的指针,用于存储获取到的属性信息返回值:
0
;-1
并设置相应的错误码(存储在 errno
变量中)1 |
|
函数声明 | 函数功能 |
---|---|
int stime(const time_t *t); |
它是是 Unix/Linux 系统中的一个系统调用函数,用于设置系统时间 |
参数:
返回值:
0
;-1
并设置相应的错误码(存储在 errno
变量中)1 |
|
在如上的示例代码中,
time()
函数获取当前时间,并输出到控制台;2022 年 1 月 1 日
,并等待一秒钟以确保时间设置完成。注意: stime()
函数只能在 Linux/Unix
系统上使用,并且需要 root
权限才能调用。另外,在修改系统时间时应谨慎行事,以避免对系统和应用程序造成不可预料的影响。
函数声明 | 函数功能 |
---|---|
char *stpcpy(char *dest, const char *src); |
用于复制一个字符串到另一个字符串缓冲区,并返回目标字符串的结尾指针 |
参数:
返回值: 一个指向目标字符串结尾的指针
1 |
|
在上述的示例代码中,我们使用 stpcpy()
函数将源字符串 "Hello world"
复制到目标字符串 dest
中,并输出两个字符串以及目标字符串的结尾指针。
注意: stpcpy()
函数只能在支持 ISO C99
或 POSIX.1-2001
标准的系统上使用,对于其他系统,可能需要使用 strcpy()
函数代替。此外,应始终确保目标字符串缓冲区具有足够的空间来存储源字符串,以避免发生缓冲区溢出。
函数声明 | 函数功能 |
---|---|
char* strcat(char* dest, const char* src); |
用于将一个字符串拼接到另一个字符串的末尾 |
参数:
返回值: 一个指向目标字符串结尾的指针
1 |
|
函数声明 | 函数功能 |
---|---|
char* strchr(const char* str, int c); |
用于查找字符串中第一次出现指定字符的位置,并返回该位置的指针 |
参数:
1 |
|
注意: strchr()
函数只能查找单个字符,如果要查找一个子字符串,应使用 strstr()
函数代替。另外,在查找字符时,需要将字符转换为整数值传递给 strchr()
函数,以避免发生类型错误。
函数声明 | 函数功能 |
---|---|
int strcmp(const char* str1, const char* str2); |
用于比较两个字符串是否相等 |
参数:
返回值: 一个整数,表示两个字符串之间的大小关系
str1
小于 str2
,则返回负整数;str1
大于 str2
,则返回正整数;str1
等于 str2
,则返回 0。1 |
|
函数声明 | 函数功能 |
---|---|
char* strcpy(char* dest, const char* src); |
用于将一个字符串复制到另一个字符串缓冲区中 |
参数:
返回值: 一个指向目标字符串结尾的指针
1 |
|
注意: strcpy()
函数只能用于复制以 \0
结尾的字符串,否则可能导致未定义的行为或内存损坏。在调用 strcpy()
函数之前,应确保目标字符串缓冲区具有足够的空间来容纳源字符串,以避免发生缓冲区溢出。
函数声明 | 函数功能 |
---|---|
size_t strcspn(const char* str, const char* charset); |
用于查找字符串中第一次出现指定字符集合中任何字符的位置,并返回该位置的索引 |
参数:
1 |
|
在上述的示例代码中,我们使用 strcspn()
函数在字符串 "Hello world"
中查找字符集合 "owd"
中的任何字符,并输出找到的字符及其在字符串中的位置索引。
函数声明 | 函数功能 |
---|---|
void setlinestyle( int linestyle, unsigned upattern, int thickness ); |
设置当前绘图窗口的线条样式、线型模式和线条宽度 |
void *setmem(void *dest, size_t n, int c); |
用于将指定内存区域的每个字节都设置为指定的值 |
int setmode(int fd, int mode); |
它是 Windows 系统下的特定库函数,用于将指定文件的 I/O 模式设置为文本模式或二进制模式 |
void setpalette(int colornum, int color); |
设置调色板的颜色 |
void setrgbpalette(int colornum, int red, int green, int blue); |
用于设置当前绘图窗口的调色板中某个颜色的 RGB 值 |
void settextjustify(int horiz, int vert); |
用于设置文本输出的对齐方式 |
void settextstyle(int font, int direction, int charsize); |
用于设置当前文本输出的字体、方向和大小 |
void settime(struct time *timep); |
设置当前系统时间 |
void setusercharsize(int multx, int dirx, int multy, int diry); |
用于设置用户定义的字符大小 |
int setvbuf(FILE *stream, char *buf, int type, unsigned size); |
用于设置文件流的缓冲方式 |
void setviewport(int left, int top, int right, int bottom, int clipflag); |
用于设置绘图窗口的视口范围 |
void setvisualpage(int pagenum); |
用于设置图形窗口中用户可见的页面 |
void setwritemode(int mode); |
用于设置绘画操作的写入模式 |
void (*signal(int signum, void (*handler)(int)))(int); |
用于设置指定信号的处理方式。当系统接收到某个信号时,会调用相应的信号处理函数来处理该信号。在调用 signal 函数时,需要指定要处理的信号以及相应的信号处理函数。 |
double sin(double x); |
用于计算一个角度(以弧度为单位)的正弦值(double) |
float sinf(float x); |
用于计算一个角度(以弧度为单位)的正弦值(float) |
long double sinl(long double x); |
用于计算一个角度(以弧度为单位)的正弦值(long double) |
void sincos(double x, double* sinVal, double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosf(float x, float* sinVal, float* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosl(long double x, long double* sinVal, long double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
double sinh(double x); |
用于计算一个数的双曲正弦值 |
float sinhf(float x); |
用于计算一个数的双曲正弦值 |
long double sinhl(long double x); |
用于计算一个数的双曲正弦值 |
函数声明 | 函数功能 |
---|---|
void setlinestyle( int linestyle, unsigned upattern, int thickness ); |
设置当前绘图窗口的线条样式、线型模式和线条宽度 |
参数:
16
位的无符号整数,用二进制位表示线型模式,其中 1
表示绘制线条,0
表示空白。例如,如果 upattern
的值是 0x00FF
,则表示绘制一段线条,然后空白一段,重复这个过程直到结束。如果 upattern
的值是 0x5555
,则表示绘制一段虚线。线条样式 | 值 | 描述 |
---|---|---|
SOLID_LINE | 0 | 实线 |
DOTTED_LINE | 1 | 虚线 |
CENTER_LINE | 2 | 点线 |
DASHED_LINE | 3 | 长短线 |
USERBIT_LINE | 4 | 双点线 |
1 |
|
函数声明 | 函数功能 |
---|---|
void *setmem(void *dest, size_t n, int c); |
用于将指定内存区域的每个字节都设置为指定的值 |
参数:
·注意: setmem() 并不是标准 C 函数,而是 POSIX 标准库函数,因此可能并不被所有平台所支持。如果您的编译器或操作系统不支持 setmem() 函数,可以使用标准 C 库函数 memset() 来代替
1 |
|
在上面的示例程序中,
malloc()
函数分配了 10
字节的内存空间,并将其赋值给指针变量 str。setmem()
函数将 str
指向的内存区域的每个字节都设置为 'A'
。str
的内容并使用 free()
函数释放了分配的内存空间。函数声明 | 函数功能 |
---|---|
int setmode(int fd, int mode); |
它是 Windows 系统下的特定库函数,用于将指定文件的 I/O 模式设置为文本模式或二进制模式 |
参数:
fileno()
函数将文件指针转换为文件描述符_O_BINARY
:二进制模式_O_TEXT
:文本模式注意: 在 Windows
系统中,文本模式和二进制模式之间的区别在于换行符的处理方式。在文本模式下,Windows
将回车符(\r
)和换行符(\n
)组成的字符序列映射为单个换行符(\n
),因此在读取文本文件时可以正确处理换行符。在二进制模式下,Windows
不对回车符和换行符做任何转换,因此在读取文本文件时可能会出现问题。
1 |
|
在上面的示例程序中,我们首先使用 setmode()
函数将标准输入流的模式从二进制模式切换到文本模式;如果调用成功,则返回 0
,否则返回 -1
,并将错误信息存储在全局变量 errno
中。在程序中,我们使用 perror()
函数来输出错误信息。如果调用成功,则输出一条提示信息。
注意: setmode()
函数只适用于 Windows
系统下的 C/C++
编程,并且不是标准库函数,因此在跨平台编程时应该避免使用它。在 Unix/Linux
系统下,也可以使用 fcntl()
函数来设置文件描述符的模式。
函数声明 | 函数功能 |
---|---|
void setpalette(int colornum, int color); |
设置调色板的颜色 |
参数:
RGB
值,也可以是一个预定义颜色名称,例如 RED
或 BLUE
。1 |
|
函数声明 | 函数功能 |
---|---|
void setrgbpalette(int colornum, int red, int green, int blue); |
用于设置当前绘图窗口的调色板中某个颜色的 RGB 值 |
参数:
0~255
。RGB
值,取值范围为 0~255
。1 |
|
在上述的这个示例程序中,
setbkcolor()
函数设置背景颜色为白色,然后清除原有屏幕使前面设置生效。setrgbpalette()
函数将第 5
种颜色设置为蓝绿色,并使用 setcolor()
函数将绘图颜色设为索引值 5
(即蓝绿色);line()
函数绘制了一条斜线。函数声明 | 函数功能 |
---|---|
void settextjustify(int horiz, int vert); |
用于设置文本输出的对齐方式 |
参数:
LEFT_TEXT
:左对齐CENTER_TEXT
:居中对齐RIGHT_TEXT
:右对齐TOP_TEXT
:顶部对齐CENTER_TEXT
:居中对齐BOTTOM_TEXT
:底部对齐1 |
|
在上述的示例程序中,我们使用 settextjustify()
函数将文本输出的对齐方式设置为居中对齐,然后使用 outtextxy()
函数在窗口的中心输出一行文本。
注意: 在使用 settextjustify()
函数设置对齐方式时,必须指定正确的参数值,并且同时考虑水平和垂直方向的对齐方式,否则可能会导致文本输出位置错误。
函数声明 | 函数功能 |
---|---|
void settextstyle(int font, int direction, int charsize); |
用于设置当前文本输出的字体、方向和大小 |
参数:
DEFAULT_FONT
:默认字体TRIPLEX_FONT
:粗体三线字体SMALL_FONT
:小号字体SANS_SERIF_FONT
:无衬线字体GOTHIC_FONT
:哥特式字体SCRIPT_FONT
:手写字体HORIZ_DIR
:水平方向(从左到右)VERT_DIR
:垂直方向(从下到上)DEFAULT_WIDTH
和 DEFAULT_HEIGHT
:默认大小TRIPLEX_WIDTH
和 TRIPLEX_HEIGHT
:大号尺寸SMALL_WIDTH
和 SMALL_HEIGHT
:小号尺寸1 |
|
在上述的示例程序中,我们使用 settextstyle()
函数将文本输出的字体设置为粗体三线字体、方向设置为水平方向、大小设置为大号尺寸,然后使用 outtextxy()
函数在窗口的指定位置输出一行文本。
注意: 在使用 settextstyle()
函数设置文本样式时,必须指定正确的参数值,并且根据具体需求灵活选择字体、方向和大小,否则可能会导致文本输出不符合预期。
函数声明 | 函数功能 |
---|---|
void settime(struct time *timep); |
设置当前系统时间 |
参数: |
1 |
|
在上述的程序中,
struct time
类型的变量 t
,用于存储当前系统时间。然后使用 gettime()
函数获取当前时间,并将小时、分钟、秒和百分之一秒等信息存储到 t
变量的对应成员变量中。printf()
函数输出了当前的分钟数、小时数、百分之一秒数和秒数。这里使用了 %d
占位符来指定输出整数类型的值。注意 : 这个程序依赖于 DOS
系统提供的日期和时间相关函数,可能无法在其他操作系统或环境下运行。此外,直接修改系统时间可能会对计算机的正常运行产生影响,因此应该谨慎使用。
在现代的 Windows
操作系统中,DOS
环境已经被废弃,因此这个程序可能无法正常工作。如果要获取和修改当前系统时间,可以使用操作系统提供的相关 API
或系统调用接口实现。例如,在 Windows
平台上,可以使用 GetSystemTime()
和 SetSystemTime()
等函数来获取和设置系统时间。
函数声明 | 函数功能 |
---|---|
void setusercharsize(int multx, int dirx, int multy, int diry); |
用于设置用户定义的字符大小 |
参数:
1
或 -1
。当 dirx
的值为 1
时,字符不进行左右翻转;当 dirx
的值为 -1
时,字符进行左右翻转1
或 -1
。当 diry
的值为 1
时,字符不进行上下翻转;当 diry
的值为 -1
时,字符进行上下翻转。1 |
|
在上述这个示例程序中,我们使用 setusercharsize()
函数将当前字符的大小设置为水平方向放大 2
倍、垂直方向放大 3
倍,然后使用 outtextxy()
函数在窗口的指定位置输出一行文本。
注意: 在使用 setusercharsize()
函数设置字符大小时,必须指定正确的参数值,并且考虑到水平和垂直方向的缩放倍数,否则可能会导致字符输出不符合预期。
函数声明 | 函数功能 |
---|---|
int setvbuf(FILE *stream, char *buf, int type, unsigned size); |
用于设置文件流的缓冲方式 |
参数:
stdin
)、标准输出流(stdout
)或标准错误流(stderr
),也可以是通过 fopen()
函数打开的文件指针NULL
。如果 buf
参数为 NULL
,则 setvbuf()
函数将自动为文件流分配一块缓冲区_IONBF
:不使用缓冲区,直接从或向设备读写数据_IOLBF
:行缓冲,每行数据结束后刷新缓冲区_IOFBF
:全缓冲,填满缓冲区后才进行读写操作buf
参数不为 NULL
,则 size
参数指定了缓冲区大小;如果 buf
参数为 NULL
,则 size
参数指定了系统为缓冲区分配的大小。size
参数只对全缓冲方式有效,行缓冲和无缓存方式忽略该参数1 |
|
在上述的示例程序中,
input
和 output
,分别表示输入文件和输出文件。fopen()
函数打开输入文件和输出文件,并将返回的文件指针保存到对应的变量中。setvbuf()
函数分别为输入文件和输出文件设置缓冲方式。对于输入文件,使用 _IOFBF
缓冲类型和大小为 512
字节的缓冲区;对于输出文件,使用 _IOLBF
缓冲类型和大小为 132
字节的缓冲区(此处 bufr
缓冲区为空指针)。在设置完缓冲方式后,程序根据 setvbuf()
函数的返回值判断是否设置成功,如果返回值不为 0,则说明设置失败,否则说明设置成功,并输出相应的提示信息。fclose()
函数关闭输入文件和输出文件。注意: 在使用文件流进行读写操作时,必须在适当的时候进行缓冲区清理操作,以避免数据丢失或者读取到过期数据等问题。另外,需要根据具体需求选择合适的缓冲方式和缓冲区大小,以实现最优的性能和稳定性。
函数声明 | 函数功能 |
---|---|
void setviewport(int left, int top, int right, int bottom, int clipflag); |
用于设置绘图窗口的视口范围 |
参数:
CLIP_ON
:开启裁剪模式,只显示视口内的图形;CLIP_OFF
:关闭裁剪模式,显示整个画面。1 |
|
在上面的示例程序中,
rectangle()
函数绘制了一个红色的矩形;setviewport()
函数将视口范围设置为矩形 (150, 150) - (250, 250);rectangle()
函数绘制了一个绿色的矩形,但这里只有在视口范围的矩形才显示出来。注意: 在使用 setviewport()
函数设置视口范围时,必须指定正确的参数值,并考虑到裁剪模式的影响,否则可能会导致图形显示不符合预期。
函数声明 | 函数功能 |
---|---|
void setvisualpage(int pagenum); |
用于设置图形窗口中用户可见的页面 |
参数:
在双缓冲绘图中,我们通常会使用两个页面来绘制图像,一个是前台页面,另一个是后台页面。当我们绘制完一个完整的画面时,可以通过调用 setactivepage()
函数将后台页面切换到前台页面以显示出来。而 setvisualpage()
函数则用于设置用户当前看到的页面,它实际上是将指定的页面置于前台,从而更新屏幕上显示的内容。
1 |
|
上述示例将在屏幕上绘制两个页面,并允许用户通过按任意键查看第二个页面。
注意: setvisualpage()
函数只能用于已经创建的图形窗口,且参数 pagenum
必须在 0
到 getmaxpages()
函数返回值之间。
函数声明 | 函数功能 |
---|---|
void setwritemode(int mode); |
用于设置绘画操作的写入模式 |
参数:
COPY_PUT
:0,复制模式(默认),新绘制的图形将完全覆盖旧图形XOR_PUT
:1,异或模式,新绘制的图形将与旧图形进行异或运算后显示。在这种模式下,如果一个像素既在新图形中出现过,也在旧图形中出现过,则它最终不会被显示出来;如果一个像素只在新图形中出现过,或者只在旧图形中出现过,则它将会被显示出来。OR_PUT
:2,或模式,新绘制的图形将与旧图形进行或运算后显示。在这种模式下,如果一个像素既在新图形中出现过,也在旧图形中出现过,则它最终会被显示出来;如果一个像素只在新图形中出现过,或者只在旧图形中出现过,则它将会被显示出来。1 |
|
注意: setwritemode()
函数只对紧随其后的绘画操作生效,它不会影响之前已经绘制的图形。因此,在更改写入模式之前,必须先完成之前的绘画操作。
函数声明 | 函数功能 |
---|---|
void (*signal(int signum, void (*handler)(int)))(int); |
用于设置指定信号的处理方式。当系统接收到某个信号时,会调用相应的信号处理函数来处理该信号。在调用 signal 函数时,需要指定要处理的信号以及相应的信号处理函数。 |
参数:
SIGINT
(中断信号):通常由用户按下 “Ctrl + C
“ 产生,用于中断正在运行的程序。SIGALRM
(闹钟信号):用于在指定的时间后向进程发送信号,可以用于实现定时器等功能。SIGFPE
(浮点异常信号):在发生浮点运算异常时发送该信号。SIGSEGV
(段错误信号):在访问非法的内存地址时发送该信号。void handler(int)
返回值:
SIG_DFL
或 SIG_IGN
)。SIG_ERR
。1 |
|
在上面的示例中,
signal()
函数设置了一个处理 SIGINT
信号的处理程序 sigint_handler()
。函数声明 | 函数功能 |
---|---|
double significand(double x); |
用于分离浮点数 x 的尾数部分(double) |
float significandf(float x); |
用于分离浮点数 x 的尾数部分(float) |
参数:
1 |
|
注意: 在某些旧版本的编译器中,可能没有实现 significand 函数。这个时候可以考虑使用其他类似的函数来替代,如 frexp
、modf
等。
函数声明 | 函数功能 |
---|---|
double sin(double x); |
用于计算一个角度(以弧度为单位)的正弦值(double) |
float sinf(float x); |
用于计算一个角度(以弧度为单位)的正弦值(float) |
long double sinl(long double x); |
用于计算一个角度(以弧度为单位)的正弦值(long double) |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
void sincos(double x, double* sinVal, double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosf(float x, float* sinVal, float* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
void sincosl(long double x, long double* sinVal, long double* cosVal); |
用于同时计算一个角度(以弧度为单位)的正弦值和余弦值 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
double sinh(double x); |
用于计算一个数的双曲正弦值 |
float sinhf(float x); |
用于计算一个数的双曲正弦值 |
long double sinhl(long double x); |
用于计算一个数的双曲正弦值 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
void *sbrk(intptr_t increment); |
它是一个 Unix 系统的函数,用于调整程序的堆空间。 |
double scalb(double x, double n); |
计算 x 乘以 2 的 n 次幂(double) |
float scalbf(float x, float n); |
计算 x 乘以 2 的 n 次幂(float) |
long double scalbl(long double x, double n); |
计算 x 乘以 2 的 n 次幂(long double) |
double scalbln(double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(double) |
float scalblnf(float x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(float) |
long double scalblnl(long double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(long double) |
double scalbn(double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(double) |
float scalbnf(float x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(float) |
long double scalbnl(long double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(long double) |
int scanf(const char *format, ...); |
从标准输入中读取指定格式的数据 |
void sector( int x, int y, int stangle, int endangle, int xradius, int yradius ); |
画并填充椭圆扇区(Windows BGI) |
void segread(struct SREGS *sregs); |
它是一个 DOS 函数,用于从内存段(segment )中读取内容。 |
void setactivepage(int pagenum); |
用于切换当前显示的页面 |
void setallpalette(struct palettetype *palette); |
用于设置图形界面的整个调色板 |
void setaspectratio( int xasp, int yasp ); |
设置图形纵横比 |
void setbkcolor(int color); |
用于设置当前绘图窗口的背景色 |
void setbuf(FILE *stream, char *buffer); |
用于设置标准输入流、标准输出流或标准错误流的缓冲方式 |
void setcolor(int color); |
设置当前绘图颜色 |
void setfillpattern(char *upattern, int color); |
用于设置当前绘图窗口的填充图案 |
void setfillstyle(int pattern, int color); |
用于设置当前绘图窗口的填充样式,即用什么颜色或图案来填充绘制的图形 |
void setgraphmode(int mode); |
设置当前的图形模式 |
int setjmp(jmp_buf env); |
用于在程序执行过程中设置跳转点,并将当前程序状态保存到一个缓冲区中。当程序需要从该跳转点继续执行时,可以使用 longjmp() 函数恢复之前保存的程序状态并返回到该跳转点。 |
函数声明 | 函数功能 |
---|---|
void *sbrk(intptr_t increment); |
它是一个 Unix 系统的函数,用于调整程序的堆空间。 |
参数:
返回值:
(void *)-1
1 |
|
在上述示例中,
sbrk()
函数将堆顶位置向上移动 64 字节;mem
中;如果 sbrk 调用失败(即返回值等于 (void *)-1)
,则程序通过 perror()
函数输出错误信息并返回 1
;0
表示程序成功运行。函数声明 | 函数功能 |
---|---|
double scalb(double x, double n); |
计算 x 乘以 2 的 n 次幂(double) |
float scalbf(float x, float n); |
计算 x 乘以 2 的 n 次幂(float) |
long double scalbl(long double x, double n); |
计算 x 乘以 2 的 n 次幂(long double) |
注意:如果 n
超过了可表示的范围,或者结果溢出,则函数可能返回正无穷大、负无穷大或 NaN
。
1 |
|
函数声明 | 函数功能 |
---|---|
double scalbln(double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(double) |
float scalblnf(float x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(float) |
long double scalblnl(long double x, long int n); |
计算 x 乘以 2 的指定长整数 n 次幂(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double scalbn(double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(double) |
float scalbnf(float x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(float) |
long double scalbnl(long double x, int n); |
计算 x 乘以 2 的指定整数 n 次幂(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
int scanf(const char *format, ...); |
从标准输入中读取指定格式的数据 |
详细内容 可参考 《scanf》
1 |
|
在上述示例中,实现了从标准输入中读取一个字符串,并输出欢迎消息。
name
的字符数组,长度为 20;scanf()
函数从标准输入中读取一个字符串,存储到 name
数组中;printf()
函数输出欢迎消息,其中 %s
表示字符串格式化符号,会被 name
所代替。函数声明 | 函数功能 |
---|---|
void sector( int x, int y, int stangle, int endangle, int xradius, int yradius ); |
画并填充椭圆扇区(Windows BGI) |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
void segread(struct SREGS *sregs); |
它是一个 DOS 函数,用于从内存段(segment )中读取内容。 |
1 |
|
上述的这个示例程序,使用了 <dos.h>
头文件中的 segread()
函数和 struct SREGS
结构体,并打印出数据段(DS
)、代码段(CS
)和堆栈段(SS
)的值。
函数声明 | 函数功能 |
---|---|
void setactivepage(int pagenum); |
用于切换当前显示的页面 |
1 |
|
上述示例将在屏幕上绘制两个页面,并允许用户通过按任意键查看第二个页面。
函数声明 | 函数功能 |
---|---|
void setallpalette(struct palettetype *palette); |
用于设置图形界面的整个调色板 |
参数:
1 |
|
函数声明 | 函数功能 |
---|---|
void setaspectratio( int xasp, int yasp ); |
设置图形纵横比 |
参数:
1 |
|
注意: 因为 BGI 图形库在 Windows 上的实现是基于 Win32 API 的简单封装,并且没有提供缩放功能,所以上述程序在 Windows BGI 下不支持缩放功能,也就是 setaspectratio 没有效果。
函数声明 | 函数功能 |
---|---|
void setbkcolor(int color); |
用于设置当前绘图窗口的背景色 |
参数:
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
0 | BLACK | 黑 |
1 | BLUE | 蓝 |
2 | GREEN | 绿 |
3 | CYAN | 青 |
4 | RED | 红 |
5 | MAGENTA | 洋红 |
6 | BROWN | 棕 |
7 | LIGHTGRAY | 淡灰 |
8 | DARKGRAY | 深灰 |
9 | LIGHTBLUE | 淡兰 |
10 | LIGHTGREEN | 淡绿 |
11 | LIGHTCYAN | 淡青 |
12 | LIGHTRED | 淡红 |
13 | LIGHTMAGENTA | 淡洋红 |
14 | YELLOW | 黄 |
15 | WHITE | 白 |
1 |
|
注意: 在修改背景颜色后,需要使用 cleardevice()
函数清除先前绘制的图形并更新背景颜色,不然背景颜色的修改不会生效。
函数声明 | 函数功能 |
---|---|
void setbuf(FILE *stream, char *buffer); |
用于设置标准输入流、标准输出流或标准错误流的缓冲方式 |
参数:
FILE *stream
: 目标文件流指针(如 stdin, stdout, stderr 或 fopen() 返回的指针)。必须指向已打开的文件流。char *buffer
: 缓冲区指针。1 |
|
在上述这个示例程序中,我们打开了一个名为 test.txt
的文件,并使用 setbuf()
函数将其设置为不带缓冲。然后,我们向文件中写入一行文本,关闭文件并退出程序。
由于我们已经将文件设置为不带缓冲,因此写入的数据将直接写入磁盘,而不会在内存中留下缓冲区。
函数声明 | 函数功能 |
---|---|
void setcolor(int color); |
设置当前绘图颜色 |
参数:
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
0 | BLACK | 黑 |
1 | BLUE | 蓝 |
2 | GREEN | 绿 |
3 | CYAN | 青 |
4 | RED | 红 |
5 | MAGENTA | 洋红 |
6 | BROWN | 棕 |
7 | LIGHTGRAY | 淡灰 |
8 | DARKGRAY | 深灰 |
9 | LIGHTBLUE | 淡兰 |
10 | LIGHTGREEN | 淡绿 |
11 | LIGHTCYAN | 淡青 |
12 | LIGHTRED | 淡红 |
13 | LIGHTMAGENTA | 淡洋红 |
14 | YELLOW | 黄 |
15 | WHITE | 白 |
1 |
|
函数声明 | 函数功能 |
---|---|
void setfillpattern(char *upattern, int color); |
用于设置当前绘图窗口的填充图案 |
参数:
在调用 setfillpattern()
函数之前,需要先定义一个名为 upattern
的字符数组,并将其用作填充图案。这个图案通常使用一个 8
字节的字节数组表示,每个元素包含一个 8
比特位的掩码,用于表示该位置是否应该被绘制斜线或其他样式。
1 |
|
上述程序使用了 Windows BGI 图形库来创建一个空白的图形窗口,并在其中填充一种斜线筛子图案。
何为斜线筛子图案,参考如下程序打印:
1 |
|
函数声明 | 函数功能 |
---|---|
void setfillstyle(int pattern, int color); |
用于设置当前绘图窗口的填充样式,即用什么颜色或图案来填充绘制的图形 |
参数:
如下是支持的填充样式:
填充样式值 | 英文枚举 | 中文描述 |
---|---|---|
0 | EMPTY_FILL |
空填充(无填充) |
1 | SOLID_FILL |
实心填充 |
2 | LINE_FILL |
横线填充 |
3 | LTSLASH_FILL |
细斜线填充(左斜) |
4 | SLASH_FILL |
粗斜线填充(左斜) |
5 | BKSLASH_FILL |
粗反斜线填充(右斜) |
6 | LTBKSLASH_FILL |
细反斜线填充(右斜) |
7 | HATCH_FILL |
网格阴影填充 |
8 | XHATCH_FILL |
交叉网格填充 |
9 | INTERLEAVE_FILL |
交错线填充 |
10 | WIDE_DOT_FILL |
稀疏点状填充 |
11 | CLOSE_DOT_FILL |
密集点状填充 |
12 | USER_FILL |
用户自定义填充模式 |
setfillstyle()
函数还支持使用用户自定义的填充样式。如果要使用用户自定义的填充样式,需要调用 setuserchars()
函数来设置填充字形,然后将填充样式参数设置为 USER_FILL
。
1 |
|
在上述的示例程序中,
setfillstyle()
函数将填充样式设置为斜线筛子图案(即 SLASH_FILL
样式),颜色设置为红色。rectangle()
函数在图形窗口中绘制一个矩形,并使用 floodfill()
函数将该矩形填充为红色的斜线筛子图案。函数声明 | 函数功能 |
---|---|
void setgraphmode(int mode); |
设置当前的图形模式 |
1 |
|
函数声明 | 函数功能 |
---|---|
int setjmp(jmp_buf env); |
用于在程序执行过程中设置跳转点,并将当前程序状态保存到一个缓冲区中。当程序需要从该跳转点继续执行时,可以使用 longjmp() 函数恢复之前保存的程序状态并返回到该跳转点。 |
参数:
jmp_buf
类型返回值:
setjmp()
函数返回 0
,除非它是从 longjmp()
函数调用返回的,这种情况下,它返回非零值。
1 |
|
在上述的示例程序中,
buf
的 jmp_buf
类型的缓冲区,并将其作为参数传递给 setjmp()
函数,当前程序状态将保存到 buf 缓冲区中,并返回一个整形,用 ret
变量存储;此时 ret
的值为 0,则说明是第一次调用 setjmp()
函数,主函数内打印输出 ”main() before foo()“
foo()
函数,打印输出 ”foo() before longjmp()“
;longjmp()
函数,将会返回到 setjmp()
函数调用的位置,并传递了一个值 1
。因为 longjmp()
调用一定会返回 setjmp()
函数调用的位置,因此 foo()
函数的后面一行代码永远不会被执行。setjmp()
函数返回 ret
的值为 1,则说明是从 longjmp()
函数中返回的,主函数内打印输出 ”main() after longjmp()“
。