前言

在 C++ 中,除了可以创建各种函数,还包含了各种有用的函数供您使用。这些函数写在标准 C 和 C++ 库中,叫做内置函数。您可以在程序中引用这些函数。这篇文章是学c++的时候写了一点,后面学ida的时候,遇到了很多c的函数,又加了一点

C 标准库

stdint.h

提供跨平台、固定宽度的整数类型定义,让程序在不同系统、不同编译器下表现一致
int8_t 8 位, 占 1 个字节
int16_t 16 位, 占 2 个字节
int32_t 32 位, 占 4 个字节
int64_t 64 位, 占 8 个字节
uint8_t 8 位无符号, 占 1 个字节
uint16_t 16 位无符号,占 2 个字节
uint32_t 32 位无符号,占 4 个字节
uint64_t 64 位无符号,占 8 个字节

string.h

字符串复制函数
strcpy(s1, s2)复制字符串 s2 到字符串 s1
strncpy(s1, s2, n)复制字符串 s2 的前 n 个字符到字符串 s1
字符串连接函数
strcat(s1, s2)连接字符串 s2 到字符串 s1 的末尾
strncat(s1, s2, n)连接字符串 s2 的前 n 个字符到字符串 s1 的末尾
字符串比较函数
strcmp(s1, s2)比较字符串 s1 和 s2
strncmp(s1, s2, n)比较字符串 s1 和 s2 的前 n 个字符
字符串查找函数
strchr(s, c)查找字符 c 在字符串 s 中第一次出现的位置
strrchr(s, c)查找字符 c 在字符串 s 中最后一次出现的位置
strstr(s1, s2)查找字符串 s2 在字符串 s1 中第一次出现的位置
内存操作函数
memset(s, c, n)将字符串 s 的前 n 个字节设置为字符 c
memcpy(s1, s2, n)从字符串 s2 复制 n 个字符到字符串 s1
memcmp(s1, s2, n)比较字符串 s1 和 s2 的前 n 个字符
字符串长度函数
strlen(s1)返回字符串 s1 的长度

ctype.h

形式:int 函数(int c)

参数:传入的一定是一个字符或者EOF

返回值:满足条件返回非0(true),否则返回0;

int isalnum(int c) 该函数检查所传的字符是否是字母和数字。

int isalpha(int c) 该函数检查所传的字符是否是字母。

int islower(int c) 该函数检查所传的字符是否是小写字母。

int isupper(int c) 该函数检查所传的字符是否是大写字母。

int tolower(int c) 该函数把大写字母转换为小写字母。 //返回ascil码,需要加(char)进行转码

int toupper(int c) 该函数把小写字母转换为大写字母。

int isspace(int c) 该函数检查所传的字符是否是空格。

int ispunct(int c) 该函数检查所传的字符是否是标点符号

stdio.h(standard input & output)

printf

  1. 转换说明符
    1
    2
    3
    4
    5
    %s         字符串  
    %c 字符
    %d 有符号十进制整数
    %f 浮点数(包括float和double)

  2. 标志
1
2
左对齐   "-"   e.g.   "%-20s"   
右对齐: "+" e.g. "%+20s"
  1. 格式字符串(格式)
1
2
3
4
5
6
7
8
9
[标志][输出最少宽度][.精度][长度]类型
"%-md" 左对齐,若m比实际少时,按实际输出。
"%m.ns"输出m位,取字符串(左起)n位,左补空格,当n>m or m省略时m=n
e.g. "%7.2s" 输入CHINA
输出" CH"
"%m.nf"输出浮点数,m为宽度,n为小数点右边数位(实际长度超过m应该按实际数位输出,小数位数超过4位部分被四舍五入)
e.g. "%3.1f" 输入3852.99
输出3853.0
长度:为h短整形量,l为长整形量

scanf

  1. 格式
    scanf("%d%d%d",&a,&b,&c)将前三个数与a,b,c分别绑定

  2. “*”符
    用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如:
    scanf("%d %*d %d",&a,&b);
    当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。

  3. 宽度
    用十进制整数指定输入的宽度(即字符数)。例如:
    scanf("%5d",&a)
    输入12345678只把12345赋予变量a,其余部分被截去。又如:
    scanf("%4d%4d",&a,&b)
    输入12345678将把1234赋予a,而把5678赋予b。

gets和puts

1
2
3
4
5
6
7
// scanf()
scanf("%s", buf); // ⚠️ 遇到空格或者换行符就停,例如输入 "hello world" 只读 "hello"

// fgets()
fgets(buf, 10, stdin); // ✅ 读空格、读换行,最多 9 个字符 + '\0',例如输入 "hi" 读取内容为['h','i','\n','\0']

puts("Direct string"); // 输出: Direct string

系统头文件(非c自带)

win中的标准头文件

windows.h

多线程
桌面应用程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <Windows.h>
//编写窗口过程(需绑定到窗口类的lpfnWndProc成员)
LRESULT CALLBACK frameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
//“销毁窗口”消息,显式处理
case WM_DESTROY:
PostQuitMessage(0); //发送WM_QUIT消息到消息队列,以结束消息循环(参见代码7)
break;
//其它消息(包括WM_QUIT消息),调用DefWindowProc函数处理,也即采用默认方式处理
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam); //凡是采用默认方式处理的消息,一律返回非0值
}
return 0; //凡是显式处理的消息,一律返回0值
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PWSTR pCmdLine, int nCmdShow) //主程序入口
{
//构建窗口类
PCWSTR frameWndClassName = L"窗口类名";
WNDCLASSEX wcex = {}; //初始化窗口类
//填充窗口类的成员值
wcex.cbSize = sizeof(WNDCLASSEX); //指定这个结构体的大小(以字节为单位)
wcex.hInstance = hInstance; //hInstance 是一个 “程序实例句柄”,用于标识当前运行的程序。
wcex.lpszClassName = frameWndClassName; //设置窗口类的类名作为该窗口类的标识
wcex.lpfnWndProc = frameWindowProc; //绑定窗口过程(回调函数)
//注册窗口类
RegisterClassEx(&wcex);
//用注册的窗口类的类名创建实例窗口
HWND hWnd = CreateWindowEx(
0,
frameWndClassName, //lpClassName(已注册的窗口类的类名)
L"窗口的标题栏文本",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, //x(窗口的初始位置的x坐标,这里使用默认值)
0, //y(窗口的初始位置的y坐标,或可视窗口的显示样式)
CW_USEDEFAULT, //nWidth(窗口的初始宽度,这里使用默认值)
0, //nHeight(窗口的初始高度。当nWidth为CW_USEDEFAULT时,此值被忽略)
NULL, //hWndParent(窗口的父窗口的句柄。主窗口自己就是顶级窗口,因而无父窗口)
NULL, //hMenu(窗口的菜单的句柄)
hInstance, //hInstance(窗口所在的应用程序的句柄)
NULL //lpParam(需要向窗口传入的数据结构,现在不打算向窗口传入额外数据,故填充NULL)
);
if (hWnd == NULL) { //创建窗口之后,还要检查窗口创建成功了没有
return FALSE;
}
//显示窗口
ShowWindow(hWnd, SW_SHOW); //以SW_SHOW样式显示窗口
UpdateWindow(hWnd);//强制立即更新窗口客户区,避免出现短暂空白窗口
//开始进入消息循环,不断地检索各种事件,并分发到窗口过程,从而调用窗口过程处理各种事件
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))//从当前线程的消息队列中检索第一条消息,将其复制到msg变量中,并从消息队列中删除
{
TranslateMessage(&msg); //对于键盘或鼠标消息,转换为字符串消息;对于其它消息,保持消息的原貌
DispatchMessage(&msg); //将经TranslateMessage处理后的消息分发到相关窗口过程进行处理
}

Unix中的标准头文件

unistd.h(Unix/Linux 系统特有的库)

read
1
2
3
4
read(int fd, void *buf, size_t count); 通过文件描述符获取数据
fd:文件描述符(如果是0 表示 stdin,1 是 stdout,2 是 stderr)
buf:指向缓冲区的指针,数据会写入该缓冲区。
count:要读取的最大字节数
write
1
2
3
4
write(int fd, const void *buf, size_t count);
fd:文件描述符(如果是1 表示 stdout)。
buf:要写入的数据缓冲区指针(原始字节流)。
count:要写入的字节数(8uLL 表示 8 字节无符号长整型字面量)。

C++ 标准库(后缀无 .h)

string

1.声明一个C++字符串
string str1默认初始化

str3 = str1复制 str1 到 str3

str3 = str1 + str2连接 str1 和 str2

string s4(n,'c')s4由n个c组成

str3 = str1 + 'c'连接 str1 和 c

str[i]访问字符串中的字符
2.字符串操作函数
.size()||.length()返回str3 的总长度

.insert(插入的位置,插入的字符串) 插入字符

.erase(起始下标,删除子字符串的长度) 删除字符

find(待查找的子字符串,开始查找的位置)字符串查找

.substr(起始下标,提取的子字符串的长度) 返回某个子字符串

.back() 返回最后一个字符串

cmath

C++ 内置了丰富的数学函数,可对各种数字进行运算。下表列出了 C++ 中一些有用的内置的数学函数。
在c++中c开头的库对应的是兼容的c库,如cmath对应的是math.h,这时cmath的语法兼容math.h。

正弦sin(),余弦cos(),正切tan()

pow(x,y),x的y次方

sqrt()(square root)返回参数的平方根

log()返回参数的自然对数

abs()/fabs()(absolute value)返回绝对值

floor()返回一个小于或等于传入参数的最大整数

ceil返回大于或者等于指定表达式的最小整数

iomanip(io manipulator)

setbase(n) 设置整数为n进制(n=8,10,16)
setprecision(n) 设置浮点数的有效数字为n位
setw(n) 设置字段宽度为n位
setfill(c) 设置字符填充,c可以是字符常或字符变量
setiosflags(ios::fixed) 设置浮点数以固定的小数位显示
setiosflags(ios::scientific) 设置浮点数以科学计数法表示
setiosflags(ios::left) 输出左对齐
setiosflags(ios::right) 输出右对齐