1.字符串格式化sprintf() #include
int sprintf(char*str,const char*format);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符’\0’为止。
参数:str——字符串首地址
format——字符串格式,用法和printf()一样
返回值:成功——实际格式化的字符个数 失败——-1
2.sscanf() #include
int sscanf(const char*str,const char*format,...);
功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。可以转换八进制和十六进制的数。
参数:str——字符串首地址
format——字符串格式,用法和scanf()一样
返回值:成功——参数数目,成功转换的值的个数 失败——-1
3.字符串查找strchr() #include
char*strchr(const char*s,int c);
功能:在字符串s中查找字母c出现的位置
参数:s——字符串首地址 c——匹配字母(字符)
返回值:成功——返回第一次出现的c地址 失败——NULL
自定义:
4.strstr() #include
char *strstr(const char*haystack,const char*needle);
功能:在字符串haytack中查找字符串needle出现的位置
参数:haystack——源字符串首地址
needle——匹配字符串首地址
返回值:成功——返回第一次出现的needle地址 失败——NULL
5.字符串分割strtok() #include
char*strtok(char*str,const char*delim);
功能:将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为0字符,当连续出现多个时只替换第一个为0。
参数:str——指向欲分割的字符串
delim:为分割字符串中包含的所有字符
返回值:成功——分割后字符串首地址 失败——NULL
字符串截取会破坏源字符串,用\0替换分割的标志位。
6.字符串类型转换atoi() #include
int atoi(const char*nptr);
功能:atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符(‘\0’)才结束转换,并将结果返回返回值。
参数:nptr——待转换的字符串
返回值:成功转换后整数
类似函数有:atof()把一个小数形式的字符串转化为一个浮点数
atol()把一个字符串转化为long类型
*总结:
1.指针 就是内存中的一个地址编号
指针变量 用于存储地址 本质是一个变量
2.指针间接赋值
(1)两个变量:普通变量、指针变量
(2)建立关系:指针变量=&普通变量
(3)通过*运算符赋值:*指针变量=值
3.指针大小
在32(64)位操作系统下所有指针类型都是4(8)个字节大小。
4.野指针:指针变量指向一个未知的空间。
操作野指针对应的内存空间可能报错。
5.空指针:指针变量指向内存编号为0的空间。
#define NULL ((void*))
操作空指针对应的内存空间会报错。
在程序中用作条件判断。
6.万能指针 void*(一级指针)
可以将所有指针类型赋值给万能指针。
万能指针一般用作于函数形参。
7.const修饰的指针
(1)通过指针改变常量的值
(2)const修饰的指针类型
(3)const修饰的指针变量
(4)const修饰指针类型修饰指针变量 常量指针
8.指针和数组
(1)指向数组的指针 指针变量[下标] *(指针变量+偏移量)
(2)指针运算 跟指针类型 对应的基本类型有关
(3)指针数组 每一个元素都是一个指针 指针数组是一个二维数组模型
9.多级指针
一级指针指向变量的地址 *三级指针==二级指针==&一级指针
二级指针指向一级指针的地址 **三级==*二级==一级==&变量
单机指针指向二级指针的地址 ***三级==**二级==*一级==变量
10.指针和函数
(1)值传递和地址传递
(2)数组作为函数参数 退化为指针丢失精度 需要传递元素个数
(3)指针作为函数返回值
11.指针和字符串
(1)栈区字符串和数据区字符串的区别
(2)字符串数组 指针数组模型
(3)const修饰的指针 针对字符串
(4)主函数的形参
int argc 表示参数个数 char*argv 表示参数内容
(5)字符串和指针的应用
1)字符串查找字符串个数;
2)字符串查找字符个数;
3)字符串反转和回文
(6)字符串处理函数
strcpy() strncpy() 字符串拷贝 (不安全)
strcat() strncat() 字符串追加
strcmp() strncmp() 字符串比较 0 1 -1
sprintf() sscanf() 字符串格式化
strchr() strstr() 字符串查找 返回值类型为指针
strtok() 字符串分割 如果找到标志位用\0替换 会破坏源字符串
atoi() atof() atol() 字符串类型转换
网络协议分层
1.应用层:我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。
应用层工作在操作系统中的用户态,传输层及以下则工作在内核态。
2.传输层:应用层的数据包会传给传输层,传输层(Transport Layer)为应用层提供网络支持。
传输层有两个传输协议,分别是 TCP 和 UDP。
(当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块)
3.网络层:传输层协议只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,实际的传输功能交给下一层,也就是网络层(Internet Layer)。
网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。
IP 地址分成两种意义:
一个是网络号,负责标识该 IP 地址是属于哪个子网的;
一个是主机号,负责标识同一子网下的不同主机;
(配合子网掩码才能算出IP地址的网络号和主机号。在寻址的过程中,先匹配到相同的网络号,才会去找对应的主机。——寻址能力)
IP 协议还有另一个重要的能力是路由。
IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地」选择路径。寻址更像在导航,路由更像在操作方向盘。
4.数据链路层:
跨网络传输——路由器同时在两个网络中,通过路由表计算出下一个要去的IP地址——数据链路层识别网络中的设备,让数据在一个链路中传输,为网络层提供链路级别传输的服务。
(每一台设备的网卡都有一个 MAC 地址,用来唯一标识设备。路由器计算出了下一个目的地 IP 地址,再通过 ARP 协议找到该目的地的 MAC 地址,这样就知道这个 IP 地址是哪个设备的了。)
5.物理层:
数据从设备发送到网络——数据包转换成电信号,在物理介质中传输——物理层为数据链路层提供二进制传输的服务。
c语言知识来源:bilibili-黑马程序员
图解网络来源:vx公众号-小林coding