(笔记总结)C/C++语言的常用库函数(持续记录,积累量变)

写在前面:

由于时间的不足与学习的碎片化,写博客变得有些奢侈。

但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。

既然如此

不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。

标题的结构如下:"类型":"知识点"------"简短的解释"

部分内容由于保密协议无法上传。

点击此处进入学习日记的总目录

C/C++语言的常用库函数

一、<stdio.h>------标准输入/输出库

1、scanf()与printf()------输入与输出

  1. scanf()与printf()中格式说明符几乎相同的一部分
格式说明符 解释
%d 用来输入和输出int
%ld 用来输入和输出long int
%lld 用来输入和输出long long int
%hd 用来输入和输出short
%i 用来输入和输出有符号十进制整数
%u 用来输入和输出无符号十进制整数
%lu 用来输入和输出无符号十进制长整数
%llu 用来输入和输出无符号十进制长长整数
%hu 用来输入和输出无符号短十进制整数
%o 用来输入和输出八进制整数
%lo 用来输入和输出长八进制整数
%ho 用来输入和输出短八进制整数
%#o 用来输出八进制整数,数字前有0
%x 用来输入和输出十六制整数,字母小写
%#x 用来输出十六制整数,字母小写,数字前有0x
%lx 用来输入和输出长十六制整数,字母小写
%X 用来输入和输出十六制整数,字母大写
%#X 用来输出十六制整数,字母大写 ,数字前有0X
%lX 用来输入和输出长十六制整数,字母大写
%c 用来输入和输出单个字符
%s 用来输入和输出一串字符串 输入时遇空格,制表符或换行符结束 输出时连格式说明符一起输出 printf("%s","%d%f",a,b);输出 %d%f
%f 用来输入和输出float,输出double
%lf 用来输入和输出double(double输出用%f和%lf都可以)
%Lf 用来输入和输出long double
%e 用来输入和输出指数,字母小写
%le 用来输入和输出长指数,字母小写
%E 用来输入和输出指数,字母大写
%lE 用来输入和输出长指数,字母大写
%g 用来输入和输出指数或float(输出最短的一种),字母小写
%lg 用来输入和输出长指数或double(输出最短的一种),字母小写
%G 用来输入和输出指数或float(输出最短的一种),字母大写
%lG 用来输入和输出长指数或double(输出最短的一种),字母大写
  1. scanf()独有
格式说明符 解释
%*(所有类型),如%*d 用来输入一个数,字符或字符串而不赋值(跳过无关输入) 如scanf("%d%*c%d",&a,&b); 这样就可以只将1+2中的1和2赋值给a和b。
%m(所有类型),其中m为常数 限定输入范围,如scanf("%4d",&a)时输入123456,只把1234赋值给a
,(逗号) 无实际用处,仅用于美观。如scanf("%d,%d,%d",&a,&b,&c);
-(横杠) :(冒号) 方便日期等输入,但不赋值 scanf("%d-%d-%d",&a,&b,&c);需输入2018-11-20 scanf("%d:%d:%d":&a,&b,&c);需输入2018:11:20
所有字符串,符号(包括空格) 数字(不与输入数相挨) 任何所写的东西都必须如横杠一般先输入(不赋值),不然系统报错 scanf("%d 456 %d",&a,&b); 需输入 1 456 7(1和7之间有 456 (前后各一个空格)) 结果为a=1 b=7
  1. printf()独有
格式说明符 解释
%m.nd %-m.nd (m和n为常数) m用于在d位数小于m时补空格(右对齐)d位数大于m时忽略 如%5d,输出123, 123(123前面两个空格) .n用于在d位数小于n时补0(右对齐)d位数大于n时忽略 如%.5d,输出123, 00123(123前面两个0) %-m.nd则为左对齐
%m.nf %m.nlf %m.nLf %-m.nf %-m.nlf %-m.nLf m用于在小数位数小于m时补空格(右对齐) 小数位数大于m时忽略 (小数点算一位) 如%6f 需输出3.14 结果为 3.14(3.14前面两个空格) .n用于控制小数位数 小数部分长度大于n则四舍五入 小数部分长度小于于n则补0 如%.6f 需输出3.14 结果为3.140000 如%6f 需输出3.1415926 结果为3.141593 %-m.nf %-m.nlf %-m.nLf 则为左对齐
%m.ns %-m.ns m用于在字符串位数小于m时补空格(右对齐)字符串位数大于m时忽略 如%5s,输出abc, abc(abc前面两个空格) .n用于控制字符串位数 长度大于n则仅输出前n位 字符串长度小于于n时忽略 如%.6s 需输出abcdefg 结果为abcdef 如%6f 需输出abc 结果为abc %-m.ns则为左对齐
%mc %-mc m限制char的输出长度 当m>1时,在左方补m-1个空格 %-mc则为左对齐
%m.ne %-m.ne %m.nE %-m.nE m用于控制指数长度,在QT中,指数部分占五位(如 e+001 ) 位数小于m时左方补空格 位数大于m时忽略 如printf("%15.5e",a); 设a为123.456789 结果为 1.23457e+002(三个空格) .n用于控制小数长度 小数部分长度大于n则四舍五入 小数部分长度小于于n则补0 如printf("%15.5e",a); 设a为123.456789 结果为 1.23457e+002(三个空格)%-m.ne %-m.nE则为左对齐
%*(整型)如%d %-(整型) 在输出项中规定整型数据的宽度,少于限制补空格,大于忽略 如printf("%d",a,b); a=5 b=123 结果为 123(前面有两个空格) %-(整型) 左对齐
%0*(整型) 在输出项中规定整型数据的宽度,少于限制补0,大于忽略 如printf("%0*d",a,b); a=5 b=123 结果为 00123
注意 printf()中的运算是从右至左,而输出是从做左至右 如a=1,printf("%d %d %d",a++,a++,a++); 结果为3 2 1

2、fgets() ------输入字符串

函数 解释
char *fgets(char *s, int n,PILE *stream); 将输入的字符串存在s中,只保存n-1位,stream是输入流,一般用stdin 注意n一定不大于数组。 输入如果遇见换行符或文件结束符会提前停止输入,但换行符也会被保存 读入结束后,一个空字符('\0')被保存在数组的结尾 char a[10]; fgets(a,10,stdin); printf("%s",a); 输入 A+B=C=de=f/e 输出 A+B=C=de

3、putchar()------输出一个字符

函数 解释
int putchar(int c); 输出一个字符

4、getchar()------输入一个字符并将其转化为整型

函数 解释
int getchar(void); 输入一个字符并将其转化为整型

5、sprintf()------将输出的字符串保存到指定字符串

函数 解释
int sprintf(char *s,"内容%d",int c); 除了是将输出的字符串保存到字符串*s以外 与printf()没什么区别 %d可以为其他格式说明符

6、sscanf()------将输入的字符串保存到指定字符串

函数 解释
int sscanf(char *s,"内容%d",int c); 除了内容是从字符串*s输入的以外 其他和scanf没什么区别

参考资料:
(超全,超经典)scanf()函数与printf()中的格式说明符
(超全,超经典)字符串函数与易错点

二、< iostream>------C++标准库

1、cin >>------读取一个变量

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。

在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

cpp 复制代码
	#include <iostream>
	using namespace std;
	
	int main()
	{
	    char a;
	    int b;
	    float c;
	    cin>> a >> b >> c;
	    cout << a << " " << b << " " << c << " " << endl;
	
	    system("pause");
	    return 0;
    }

程序输入:d 56 67.777[回车]

使用cin读取键盘输入时,难免发生错误,一旦出错,cin将设置条件状态(condition state)。

条件状态标识符号 含义
goodbit 无错误
eofbit 已到达文件尾
failbit 非致命的输入/输出错误,可挽回
badbit 致命的输入/输出错误,无法挽回

若在输入输出类里.需要加iOS::标识符号。与这些条件状态对应的就是设置、读取和判断条件状态的流对象的成员函数。

他们主要有:

s.eof():若流s的eofbit置位,则返回true;

s.fail():若流s的failbit置位,则返回true;

s.bad():若流s的badbit置位,则返回true;

s.good():若流s的goodbit置位,则返回true;

s.clear(flags):清空状态标志位,并将给定的标志位flags置为1,返回void。

s.setstate(flags):根据给定的flags条件状态标志位,将流s中对应的条件状态位置为1,返回void。

s.rdstate():返回流s的当前条件状态,返回值类型为strm::iostate。strm::iostate 机器相关的整形名,由各个iostream类定义,用于定义条件状态。

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
char ch, str[20]; 
    cin.getline(str, 5);
    cout<<"flag1:"<<cin.good()<<endl;    // 查看goodbit状态,即是否有异常
    cin.clear();                         // 清除错误标志
    cout<<"flag1:"<<cin.good()<<endl;    // 清除标志后再查看异常状态
    cin>>ch; 
    cout<<"str:"<<str<<endl;
    cout<<"ch :"<<ch<<endl;

    system("pause");
    return 0;
}

程序输入:12345[回车]

可以看出,因输入缓冲区未读取完造成输入异常,通过clear()可以清除输入流对象cin的异常状态。不影响后面的cin>>ch从输入缓冲区读取数据。因为cin.getline读取之后,输入缓冲区中残留的字符串是:5[换行],所以cin>>ch将5读取并存入ch,打印输入并输出5。

如果将clear()注释,cin>>ch;将读取失败,ch为空。

cin.clear()等同于cin.clear(ios::goodbit);因为cin.clear()的默认参数是ios::goodbit,所以不需显示传递,故而你最常看到的就是:

cin.clear()。

2、cin.get()------读取一个字符

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    char a;
    char b;
    a = cin.get();
    cin.get(b);
    cout << a << b << endl;
    system("pause");
    return 0;
}

程序输入:3456[回车]

Tips:空格与回车也算一个字符

3、cin.get()------读取一行 & 指定读取最大位数 & 指定结束符(默认换行)

istream& get ( char* s, streamsize n ) // 读取一行,指定读取n个数

istream& get ( char* s, size_t n, streamsize delim ) // 读取一行,指定读取n个数,且指定结束字符

空格不会终止输入,碰到换行符才会停止输入

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    char array[20] = { NULL };
    cin.get(array, 20);
    cout << array ;
    system("pause");
    return 0;
}

程序输入:3456 789[回车]

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    char array[20] = { NULL };
    cin.get(array,20,'b');
    cout << array ;
    system("pause");
    return 0;
}

程序输入:adgd yuibklohg[回车]

4、cin.getline------输入一行 且 指定结束符(默认换行)

istream& getline(char* s, streamsize count); // 默认以换行符结束

istream& getline(char* s, streamsize count, char delim); // 读取一行,指定读取n个数,且指定结束字符

使用方法和cin.get相同
cin.getlinecin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。

5、cin.ignore------清空输入缓冲区

从上文中可以看出,上一次的输入操作很有可能是输入缓冲区中残留数据,影响下一次的输入。

那么如何解决这个问题呢?

自然而然,我们想到了在进行输入时,对输入缓冲区进行清空和状态条件的复位。条件状态的复位使用clear(),清空输入缓冲区应该使用:

函数原型:istream &ignore( streamsize num=1, int delim=EOF );

函数作用:跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。

使用示例如下:

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    char str1[20]={NULL},str2[20]={NULL};
    cin.getline(str1,5);
    cin.clear();  // 清除错误标志   
    cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //清除缓冲区的当前行
    cin.getline(str2,20);
    cout<<"str1:"<<str1<<endl;
    cout<<"str2:"<<str2<<endl;
    system("pause");
    return 0;
}

程序输入:12345[回车]success[回车]

注意:

(1)程序中使用cin.ignore清空了输入缓冲区的当前行,使上次的输入残留下的数据没有影响到下一次的输入,这就是ignore()函数的主要作用。其中,numeric_limits::max()不过是头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。

如果想清空输入缓冲区,去掉换行符,使用:

cin.ignore(numeric_limits< std::streamsize>::max()); 清除cin里所有内容。

(2)cin.ignore();当输入缓冲区没有数据时,也会阻塞等待数据的到来。
参考资料:
C++中cin的详细用法
(超全,超经典)字符串函数与易错点
C++ cin.get用法(详解版)

三、<string.h>------字符串处理函数库

字符串处理函数:1-4

1、strcpy()------复制字符串

2、strncpy()------复制指定位数字符串

3、strcat()------连接字符串

4、strncat()------复制指定位数字符串

字符串比较函数:5-6

5、strcmp()------比较字符串

6、strncmp()------比较指定位数字符串

字符串查找函数:7-13

7、strchr()------返回 字符c 在字符串s 第一次出现的地址

8、strcspn()------返回 字符串s2 在字符串s1 第一次出现的下标

9、strspn()------返回 字符串s2 在字符串s1 第一个未出现字符的下标

10、strpbrk()------返回 字符串s2 在字符串s1 第一次出现的地址

11、strrchr()------返回 字符c 在字符串s 最后出现的地址

12、strstr()------返回 字符串s2 在字符串s1 第一次出现的地址

13、strtok()------返回 字符c 在字符串s 第一次出现的地址 并将该位置的字符设为'\0'

图片内程序有些不清楚,下面重新打了一遍

c 复制代码
char a[13]="4cabc56c78c9";
char *c=strtok(a,"ab");
//搜索s2中的第一个字符,将s1中的该字符覆盖为'\0',strtok函数保存标号后'\0'的地址,返回标号第一个字符地址。
printf("*%s*\n",c);
c=strtok(nullptr,"z");
//返回搜索起始字符地址,保存nullptr。
printf("*%s*\n",c);
c=strtok(nullptr,"c");
//当strtok保存的本来就是nullptr,返回nullptr。
printf("*%s*\n",c);
for(int n=0;n<13;n++)
printf("%c",a[n]);

内存处理函数:14-18

14、memcpy()------将s2的前n位字符 覆盖 s1的前n位字符

15、memmove()------先将s2里的前n位字符复制到 一个临时数组,然后再覆盖s1的前n位字符

16、memcmp()------与strncmp相同,只不过memcmp不止可以处理字符串

17、memchr()------与strchr相同,只不过需要用void*定义的指针去接收地址

18、memset()------将c覆盖s的前n位,返回指向s的void型指针

19、strerror ()------返回指向错误号字符串的指针

20、strlen()------返回字符串结束符前面字符的个数

21、getline()------输入一行字符串,遇到换行符停止,保存时不保存换行符

参考资料:
(超全,超经典)字符串函数与易错点
C++中cin的详细用法

四、<stdlib.h>------通用工具函数库

1、strtod()------将字符串转为双精度浮点数

2、strtol()------将字符串转为长整型数

3、strtoul()------将字符串转为无符号长整形数

4、exit() 和 atexit()------程序终止与程序反向运行

1. exit()

函数exit强制终止程序的运行。

2. atexit()

在程序结束时(包括被exit()打断的)按照相反的顺序运行函数

c 复制代码
#inc2024.01.22)
# 一、lude<stdio.h>
#include<stdlib.h>

void a(void)
{
    printf("%s\n","this is a;");
}

void b(void)
{
    printf("%s\n","this is b;");
}

void c(void)
{
    printf("%s\n","this is c;");
}

int main()
{
    printf("%s\n","this is main first;");
    //在程序结束时按照相反的顺序运行函数
    atexit(a);
    atexit(b);
    atexit(c);

    printf("%s\n","this is main;");

    exit(EXIT_SUCCESS);

    printf("%s\n","this is main 2;");
}

结果为

this is main first;

this is main;

this is c;

this is b;

this is a;
参考资料:
(超全,超经典)字符串函数与易错点
(学习日记)2024.01.20:通用工具库stdlib.h里好玩的函数

五、<ctype.h>------字符处理函数库

1、isblank()------判断是否为空格

2、isdigit()------判断是否为数字

3、isalpha()------判断是否为大写字母 或 小写字母

4、isalnum()------判断大写字母 或 小写字母 或 数字

5、isxdigit()------判断是否为十六进制的数字

6、islower()------判断是否为小写字母

7、isupper()------判断是否为大写字母

8、tolower()------将大写字母 改为 小写

9、toupper()------将小写字母 改为 大写

10、isspace()------判断是否为空白字符 换行符('\n')空格符(' ')换页符('\f')回车符('\r')水平制表符('t')垂直制表符('\v')

11、iscntrl()------判断是否为空白字符 水平制表符('\t')垂直制表符('\v')换页符('\f')报警符('\a')退格符(\b')回车符('\r')换行符('\n')空字符('\0')

12、ispunct()------判断是否为空格 数字 字母以外的 可打印字符

13、isprint()------判断是否为 大写字母 小写字母 数字 标点符号 空格符

14、sgraph()------判断是否为 大写字母 小写字母 数字 标点符号

参考资料:
(超全,超经典)字符串函数与易错点

六、<Windows.h>------windows操作工具

Windows.h是一个重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。

这些头文件中最重要的和最基本的是:

  • Windef.h 基本数据类型定义。
  • Winnt.h 支持Unicode的类型定义。
  • Winbase.h Kernel(内核)函数。
  • Winuser.h 用户界面函数。
  • Wingdi.h 图形设备接口函数。

这些头文件定义了Windows的所有资料型态、函数调用、资料结构和常数识别字,它们是Windows文件中的一个重要部分。

1、FindWindow()------返回的窗口的句柄

寻找窗口 类名称 标题 spy++获取 返回的窗口的句柄

2、GetForegroundWindow()------获取当前的活动窗口

获取当前的活动窗口

3、SetForegroundWindow()------设置当前的活动窗口

设置当前的活动窗口

4、keybd_event()------模拟按键

模拟按键

(其中

ESC键VK_ESCAPE (27)

回车键:VK_RETURN (13)

TAB键:VK_TAB (9)

Caps Lock键:VK_CAPITAL (20)

Shift键:VK_SHIFT (16)

Ctrl键:VK_CONTROL (17)

Alt键:VK_MENU (18)

空格键:VK_SPACE (32)

退格键:VK_BACK (8)

左徽标键:VK_LWIN (91)

右徽标键:VK_RWIN (92)

鼠标右键快捷键:VK_APPS (93)

Insert键:VK_INSERT (45)

Home键:VK_HOME (36)

Page Up:VK_PRIOR (33)

PageDown:VK_NEXT (34)

End键:VK_END (35)

Delete键:VK_DELETE (46)

方向键(←):VK_LEFT (37)

方向键(↑):VK_UP (38)

方向键(→):VK_RIGHT (39)

方向键(↓):VK_DOWN (40)

F1键:VK_F1 (112)

F2键:VK_F2 (113)

F3键:VK_F3 (114)

F4键:VK_F4 (115)

F5键:VK_F5 (116)

F6键:VK_F6 (117)

F7键:VK_F7 (118)

F8键:VK_F8 (119)

F9键:VK_F9 (120)

F10键:VK_F10 (121)

F11键:VK_F11 (122)

F12键:VK_F12 (123)

Num Lock键:VK_NUMLOCK (144)

小键盘0:VK_NUMPAD0 (96)

小键盘1:VK_NUMPAD1 (97)

小键盘2:VK_NUMPAD2 (98)

小键盘3:VK_NUMPAD3 (99)

小键盘4:VK_NUMPAD4 (100)

小键盘5:VK_NUMPAD5 (101)

小键盘6:VK_NUMPAD6 (102)

小键盘7:VK_NUMPAD7 (103)

小键盘8:VK_NUMPAD8 (104)

小键盘9:VK_NUMPAD9 (105)

小键盘。:VK_DECIMAL (110)

小键盘*:VK_MULTIPLY (106)

小键盘+:VK_ADD (107)

小键盘-:VK_SUBTRACT (109)

小键盘/:VK_DIVIDE (111)

Pause Break键:VK_PAUSE (19)

Scroll Lock 键 :VK_SCROLL(145)


参考资料:
有意思的函数

相关推荐
浅陌pa5 分钟前
01:(寄存器开发)点亮一个LED灯
c语言·stm32·单片机·嵌入式硬件
爱叨叨的小嘟14 分钟前
windows配置C++编译环境和VScode C++配置(保姆级教程)
c++·windows·vscode
卑微求AC31 分钟前
(C语言贪吃蛇)4.贪吃蛇地图优化及算法说明
c语言·算法
向上的车轮1 小时前
Django学习笔记四:urls配置详解
笔记·学习·django
DdddJMs__1351 小时前
C语言 | Leetcode C语言题解之第458题可怜的小猪
c语言·leetcode·题解
小白黑_2161 小时前
设计模式笔记
笔记·设计模式
新手unity自用笔记1 小时前
项目-坦克大战学习笔记-按键按下控制方向
笔记·学习·c#
调了个寂寞2 小时前
INS风格时尚自拍人像摄影后期Lr调色,手机滤镜PS+Lightroom预设下载!
笔记
瞌睡不来2 小时前
(刷题记录5)盛最多水的容器
c++·笔记·学习·题目记录
凯子坚持 c2 小时前
C语言复习概要(四)
c语言·开发语言