函数声明 | 函数功能 |
---|---|
| 它是一个 |
| 计算 x 乘以 2 的 n 次幂(double) |
| 计算 x 乘以 2 的 n 次幂(float) |
| 计算 x 乘以 2 的 n 次幂(long double) |
| 计算 x 乘以 2 的指定长整数 n 次幂(double) |
| 计算 x 乘以 2 的指定长整数 n 次幂(float) |
| 计算 x 乘以 2 的指定长整数 n 次幂(long double) |
| 计算 x 乘以 2 的指定整数 n 次幂(double) |
| 计算 x 乘以 2 的指定整数 n 次幂(float) |
| 计算 x 乘以 2 的指定整数 n 次幂(long double) |
| 从标准输入中读取指定格式的数据 |
| 画并填充椭圆扇区(Windows BGI) |
| 它是一个 |
| 用于切换当前显示的页面 |
| 用于设置图形界面的整个调色板 |
| 设置图形纵横比 |
| 用于设置当前绘图窗口的背景色 |
| 用于设置标准输入流、标准输出流或标准错误流的缓冲方式 |
| 设置当前绘图颜色 |
| 用于设置当前绘图窗口的填充图案 |
| 用于设置当前绘图窗口的填充样式,即用什么颜色或图案来填充绘制的图形 |
| 设置当前的图形模式 |
| 用于在程序执行过程中设置跳转点,并将当前程序状态保存到一个缓冲区中。当程序需要从该跳转点继续执行时,可以使用 longjmp() 函数恢复之前保存的程序状态并返回到该跳转点。 |
函数声明 | 函数功能 |
---|---|
| 它是一个 |
参数:
返回值:
(void *)-1
#include <unistd.h>
#include <stdio.h>
int main() {
void *mem = sbrk(64);
if (mem == (void *)-1) {
perror("sbrk");
return 1;
}
printf("Allocated 64 bytes at address %p\n", mem);
return 0;
}
在上述示例中,
sbrk()
函数将堆顶位置向上移动 64 字节;mem
中;如果 sbrk 调用失败(即返回值等于 (void *)-1)
,则程序通过 perror()
函数输出错误信息并返回 1
;0
表示程序成功运行。函数声明 | 函数功能 |
---|---|
| 计算 x 乘以 2 的 n 次幂(double) |
| 计算 x 乘以 2 的 n 次幂(float) |
| 计算 x 乘以 2 的 n 次幂(long double) |
注意:如果 n
超过了可表示的范围,或者结果溢出,则函数可能返回正无穷大、负无穷大或 NaN
。
#include <stdio.h>
#include <math.h>
int main() {
double x = 3.14159265359;
double y = scalb(x, 10);
printf("Before: %lf\n", x);
printf("After: %lf\n", y);
return 0;
}
函数声明 | 函数功能 |
---|---|
| 计算 x 乘以 2 的指定长整数 n 次幂(double) |
| 计算 x 乘以 2 的指定长整数 n 次幂(float) |
| 计算 x 乘以 2 的指定长整数 n 次幂(long double) |
#include <stdio.h>
#include <math.h>
int main() {
double x = 1.5;
float y = 2.25f;
long double z = 3.75l;
long int n = 3;
// 将x乘以2的3次幂
double result = scalbln(x, n);
printf("scalbln(%lf, %ld) = %lf\n", x, n, result);
float resultf = scalblnf(y, n);
printf("scalblnf(%f, %ld) = %f\n", y, n, resultf);
long double resultL = scalblnl(z, n);
printf("scalblnl(%Lf, %ld) = %Lf", z, n, resultL);
return 0;
}
函数声明 | 函数功能 |
---|---|
| 计算 x 乘以 2 的指定整数 n 次幂(double) |
| 计算 x 乘以 2 的指定整数 n 次幂(float) |
| 计算 x 乘以 2 的指定整数 n 次幂(long double) |
#include <stdio.h>
#include <math.h>
int main()
{
double x = 3.1415926;
float y = 3.1415926f;
long double z = 3.1415926L;
int n = 5;
printf("scalbn(%lf, %d) = %.20lf\n", x, n, scalbn(x, n));
printf("scalbnf(%f, %d) = %.20f\n", y, n, scalbnf(y, n));
printf("scalbnl(%Lf, %d) = %.20Lf\n", z, n, scalbnl(z, n));
return 0;
}
函数声明 | 函数功能 |
---|---|
| 从标准输入中读取指定格式的数据 |
详细内容 可参考 《scanf》
#include <stdio.h>
#include <math.h>
int main()
{
char name[20];
scanf("%s", name);
printf("Welcome, %s", name);
return 0;
}
在上述示例中,实现了从标准输入中读取一个字符串,并输出欢迎消息。
name
的字符数组,长度为 20;scanf()
函数从标准输入中读取一个字符串,存储到 name
数组中;printf()
函数输出欢迎消息,其中 %s
表示字符串格式化符号,会被 name
所代替。函数声明 | 函数功能 |
---|---|
| 画并填充椭圆扇区(Windows BGI) |
参数:
#include <graphics.h>
int main(void)
{
int gdriver = DETECT, gmode;
int midx, midy, i;
int stangle = 45, endangle = 135;
int xrad = 100, yrad = 50;
initgraph(&gdriver, &gmode, "");
midx = getmaxx() / 2;
midy = getmaxy() / 2;
for (i=EMPTY_FILL; i<USER_FILL; i++)
{
setfillstyle(i, getmaxcolor());
sector(midx, midy, stangle, endangle, xrad, yrad);
getch();
}
closegraph();
return 0;
}
函数声明 | 函数功能 |
---|---|
| 它是一个 |
#include <dos.h>
#include <stdio.h>
int main() {
struct SREGS regs;
segread(®s); // 读取段寄存器的值
printf("Data segment: %04X\n", regs.ds);
printf("Code segment: %04X\n", regs.cs);
printf("Stack segment: %04X\n", regs.ss);
return 0;
}
上述的这个示例程序,使用了 <dos.h>
头文件中的 segread()
函数和 struct SREGS
结构体,并打印出数据段(DS
)、代码段(CS
)和堆栈段(SS
)的值。
函数声明 | 函数功能 |
---|---|
| 用于切换当前显示的页面 |
#include <graphics.h>
int main(void)
{
int gdriver = EGA, gmode = EGAHI;
int x, y, ht;
initgraph(&gdriver, &gmode, "");
x = getmaxx() / 2;
y = getmaxy() / 2;
ht = textheight("W");
setactivepage(1);
line(0, 0, getmaxx(), getmaxy());
settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(x, y, "This is page #1:");
outtextxy(x, y+ht, "Press any key to halt:");
setactivepage(0);
outtextxy(x, y, "This is page #0.");
outtextxy(x, y+ht, "Press any key to view page #1:");
getch();
setvisualpage(1);
getch();
closegraph();
return 0;
}
上述示例将在屏幕上绘制两个页面,并允许用户通过按任意键查看第二个页面。
函数声明 | 函数功能 |
---|---|
| 用于设置图形界面的整个调色板 |
参数:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
int gdriver = DETECT, gmode;
struct palettetype pal, copypal;
int color, ht;
int y = 10;
char msg[80];
initgraph(&gdriver, &gmode, "");
ht = 2 * textheight("W");
getpalette(&pal);
for (color = 1; color <= MAXCOLORS; color++)
{
sprintf(msg, "old colors[%d]: %d", color, pal.colors[color]);
outtextxy(1, y, msg);
y += ht;
}
for (color = 1; color <= MAXCOLORS; color++)
{
setpalette(color, BLACK);
}
getpalette(©pal);
getch();
y = 10;
for (color = 1; color <= MAXCOLORS; color++)
{
sprintf(msg, "new colors[%d]: %d", color, copypal.colors[color]);
outtextxy(150, y, msg);
y += ht;
}
getch();
// 重置调色板
setallpalette(&pal);
getpalette(&pal);
y = 10;
for (color = 1; color <= MAXCOLORS; color++)
{
sprintf(msg, "old colors[%d]: %d", color, pal.colors[color]);
outtextxy(300, y, msg);
y += ht;
}
getch();
closegraph();
return 0;
}
函数声明 | 函数功能 |
---|---|
| 设置图形纵横比 |
参数:
#include <graphics.h>
int main()
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
// 设置水平和垂直缩放比例为 2:1
setaspectratio(2, 1);
// 在图形窗口中绘制一个正方形
rectangle(100, 100, 200, 200);
getch();
closegraph();
return 0;
}
注意: 因为 BGI 图形库在 Windows 上的实现是基于 Win32 API 的简单封装,并且没有提供缩放功能,所以上述程序在 Windows BGI 下不支持缩放功能,也就是 setaspectratio 没有效果。
函数声明 | 函数功能 |
---|---|
| 用于设置当前绘图窗口的背景色 |
参数:
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
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 | 白 |
#include <graphics.h>
int main()
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
// 设置背景色为蓝色
setbkcolor(BLUE);
// 清除先前绘制的图形
cleardevice();
// 在图形窗口中绘制一条线段
line(100, 100, 200, 200);
getch();
closegraph();
return 0;
}
注意: 在修改背景颜色后,需要使用 cleardevice()
函数清除先前绘制的图形并更新背景颜色,不然背景颜色的修改不会生效。
函数声明 | 函数功能 |
---|---|
| 用于设置标准输入流、标准输出流或标准错误流的缓冲方式 |
参数:
FILE *stream
: 目标文件流指针(如 stdin, stdout, stderr 或 fopen() 返回的指针)。必须指向已打开的文件流。char *buffer
: 缓冲区指针。#include <stdio.h>
int main()
{
FILE *fp;
// 打开文件,并设置为不带缓冲
fp = fopen("test.txt","w");
setbuf(fp, NULL);
// 写入数据到文件中
fprintf(fp, "This is a line of text.");
// 关闭文件
fclose(fp);
return 0;
}
在上述这个示例程序中,我们打开了一个名为 test.txt
的文件,并使用 setbuf()
函数将其设置为不带缓冲。然后,我们向文件中写入一行文本,关闭文件并退出程序。
由于我们已经将文件设置为不带缓冲,因此写入的数据将直接写入磁盘,而不会在内存中留下缓冲区。
函数声明 | 函数功能 |
---|---|
| 设置当前绘图颜色 |
参数:
颜色值 | 英文枚举 | 中文描述 |
---|---|---|
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 | 白 |
#include <graphics.h>
int main()
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
setbkcolor(WHITE);
cleardevice();
// 设置绘画颜色为红色
setcolor(RED);
// 在图形窗口中绘制一条直线
line(100, 100, 200, 200);
getch();
closegraph();
return 0;
}
函数声明 | 函数功能 |
---|---|
| 用于设置当前绘图窗口的填充图案 |
参数:
在调用 setfillpattern()
函数之前,需要先定义一个名为 upattern
的字符数组,并将其用作填充图案。这个图案通常使用一个 8
字节的字节数组表示,每个元素包含一个 8
比特位的掩码,用于表示该位置是否应该被绘制斜线或其他样式。
#include <graphics.h>
int main(void)
{
int gdriver = DETECT, gmode;
int maxx, maxy;
char pattern[8] = {0x00, 0x70, 0x20, 0x27, 0x24, 0x24, 0x07, 0x00};
// 初始化图形模式
initgraph(&gdriver, &gmode, "");
// 获取屏幕的最大 X 和 Y 坐标
maxx = getmaxx();
maxy = getmaxy();
// 设置当前颜色为最大颜色值
setcolor(getmaxcolor());
// 设置填充图案
setfillpattern(pattern, getmaxcolor());
// 用填充图案填满整个窗口
bar(0, 0, maxx, maxy);
// 等待用户按下任意键后关闭窗口
getch();
closegraph();
return 0;
}
上述程序使用了 Windows BGI 图形库来创建一个空白的图形窗口,并在其中填充一种斜线筛子图案。
何为斜线筛子图案,参考如下程序打印:
#include <stdio.h>
int main() {
char pattern[8] = {0x00, 0x70, 0x20, 0x27, 0x24, 0x24, 0x07, 0x00};
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (pattern[i] & (1 << (7 - j))) {
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
函数声明 | 函数功能 |
---|---|
| 用于设置当前绘图窗口的填充样式,即用什么颜色或图案来填充绘制的图形 |
参数:
如下是支持的填充样式:
填充样式值 | 英文枚举 | 中文描述 |
---|---|---|
0 |
| 空填充(无填充) |
1 |
| 实心填充 |
2 |
| 横线填充 |
3 |
| 细斜线填充(左斜) |
4 |
| 粗斜线填充(左斜) |
5 |
| 粗反斜线填充(右斜) |
6 |
| 细反斜线填充(右斜) |
7 |
| 网格阴影填充 |
8 |
| 交叉网格填充 |
9 |
| 交错线填充 |
10 |
| 稀疏点状填充 |
11 |
| 密集点状填充 |
12 |
| 用户自定义填充模式 |
setfillstyle()
函数还支持使用用户自定义的填充样式。如果要使用用户自定义的填充样式,需要调用 setuserchars()
函数来设置填充字形,然后将填充样式参数设置为 USER_FILL
。
#include <graphics.h>
int main()
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "");
// 设置填充样式为斜线筛子图案,颜色为红色
setfillstyle(SLASH_FILL, RED);
// 在图形窗口中填充一个矩形
rectangle(100, 100, 200, 200);
floodfill(150, 150, getmaxcolor());
getch();
closegraph();
return 0;
}
在上述的示例程序中,
setfillstyle()
函数将填充样式设置为斜线筛子图案(即 SLASH_FILL
样式),颜色设置为红色。rectangle()
函数在图形窗口中绘制一个矩形,并使用 floodfill()
函数将该矩形填充为红色的斜线筛子图案。函数声明 | 函数功能 |
---|---|
| 设置当前的图形模式 |
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int gdriver = DETECT, gmode;
int x, y;
initgraph(&gdriver, &gmode, "");
x = getmaxx() / 2;
y = getmaxy() / 2;
settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(x, y, "Press any key to exit graphics:");
getch();
// 将图形模式恢复到文本模式
restorecrtmode();
printf("We're now in text mode.\n");
printf("Press any key to return to graphics mode:");
getch();
// 返回图形模式
setgraphmode(getgraphmode());
settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(x, y, "We're back in graphics mode.");
outtextxy(x, y+textheight("W"), "Press any key to halt:");
getch();
closegraph();
return 0;
}
函数声明 | 函数功能 |
---|---|
| 用于在程序执行过程中设置跳转点,并将当前程序状态保存到一个缓冲区中。当程序需要从该跳转点继续执行时,可以使用 longjmp() 函数恢复之前保存的程序状态并返回到该跳转点。 |
参数:
jmp_buf
类型返回值:
setjmp()
函数返回 0
,除非它是从 longjmp()
函数调用返回的,这种情况下,它返回非零值。
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void foo()
{
printf("foo() before longjmp()\n");
longjmp(buf, 1);
printf("foo() after longjmp()\n");
}
int main()
{
int ret = setjmp(buf);
if (ret == 0) {
printf("main() before foo()\n");
foo();
} else {
printf("main() after longjmp()\n");
}
return 0;
}
在上述的示例程序中,
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()“
。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。