[TOC]
# gets
~~~
参数是个字符数组
char * gets(char *s);
~~~
使用gets和scanf都要注意缓冲区溢出问题
返回值
* 成功: 读取的字符串
* 失败: NULL
~~~
int main(int argc, char const *argv[])
{
char a[100]={ 0 };
gets(a);
printf("%s\n", a);
return 0;
}
~~~
运行会有个警告,先不用管
* scanf认为回车和空格都代表输入完成,不允许含有空格
* gets认为回车代表输入完成,空格只是字符串一部分
# fgets
~~~
char *fgets(char *s, int size, FILE *stream);
~~~
* 从stream指定的文件内读入字符,保存到指定的内存空间,直到出现换行字符,读到文件结尾或是已经读了size-1个字符为止,最后自动加上字符`'\0'`作为字符串结束
* fgets有三个参数,第一个参数是char的数组,第二个参数是标明这个数组的大小,第三个参数如果是通过键盘输入可以固定写为stdin
* 结果: 如果输入的大小小于原始指针对应区域的大小,会在字符串输入完成时自动加上`\n\0`.如果输入的大小小于等于原始指针对应的区域大小,会自动加上`\0`,而不会在加上`\n`
gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据.多出来的字符会导致内存溢出,fgets解决了这个问题
由于fgets函数是为读取文件设计的,所以读取键盘输入的时候没有gets方便
~~~
int main(int argc, char const *argv[])
{
char a[10]={ 0 };
fgets(a,sizeof(a),stdin);
printf("%s", a);
return 0;
}
~~~
fgets会认为用户输入的回车也是字符串的一部分
# puts
~~~
#include <stdio.h>
int puts(const char *s);
~~~
返回值
* 成功: 非负数
* 失败: -1
puts函数打印字符串,与printf不同,puts会在最后自动添加一个'\n',puts不支持各种转义字符,比如%d,%s都不支持,puts只能简单的直接输出一个字符串,而不能输出char,int,double等其他类型
~~~
char s[]="hello world";
puts(s);
~~~
# fputs
~~~
int fputs(const char * str, FILE * stream);
~~~
fputs是puts的文件操作版本
第一个参数是一个char的数组,第二个参数如果只是用puts在屏幕输出的话可以固定写为stdout
返回值
* 成功: 0
* 失败: -1
~~~
char s[]="hello world";
fputs(s,stdout);
~~~
# strlen
字符串长度
这个库函数需要包含头文件<string.h>
~~~
size_t strlen(const char * _Str);
~~~
**返回不包含字符串结尾'\0'的字符串长度**
**建议不要处理字符数组,除非含有'\0'**
我们自己算长度
~~~
char a[100]="hello";
unsigned int len=0;
while(a[len])
{
len++;
}
printf("%u\n", len);
~~~
~~~
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char a[100]="hello world";
unsigned int len=0;
len=strlen(a);
printf("%u\n", len);
return 0;
}
~~~
# strcat
字符串追加
~~~
size_t strcat(char * _Str1, const char * _Str2);
~~~
将参数_Str2追加到_Str1后尾,'\0'也会追加过去
返回
* 成功: 返回dest字符串的首地址
* 失败: NULL
~~~
char a[100]="abc";
char b[100]="123";
//把a和b合并为一个字符串,结果放入a
strcat(a,b);
printf("%s\n", a);
~~~
要小写,a的长度和b的长度,不然会内存溢出
# stncat,字符串有限追加
~~~
size_t strncat(char * _Str1,const char * _Str2,size_t len);
~~~
在strcat基础上增加了一个参数,这个参数来标明最多可以追加几个char
# strcmp 字符串比较
~~~
int strcmp(const char * _Str1, const char * _Str2);
~~~
比较的是字符ASCII码大小
返回
相等返回0,
大于:>0,
小于:<0
# strncmp 字符串有限比较
指定比较2个字符串的前几个字符
~~~
int strncmp(const char * _Str1, const char * _Str2,size_t n);
~~~
n代表指定比较字符串的数量
# strcpy 字符串拷贝
~~~
char *strcpy(char *_Str1, comst char *_Str2);
~~~
将参数_Str2拷贝到参数_Str1中,'\0'也会拷贝过去
Strcpy也存在内存溢出的问题
返回
* 成功: 返回dest字符串的首地址
* 失败: NULL
# strncpy 字符串有限拷贝
~~~
char *strncpy(char *_Str1, comst char *_Str2,size n);
~~~
n代表有限拷贝,一般n为`size(char *_Str1)-1`
# sprintf 格式化字符串
和printf函数功能类似,printf函数将格式化结果输出到屏幕,**sprintf将格式化结果输出到字符串**
~~~
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
功能:
根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符'\0'为止
参数:
str:字符串首地址
format:字符串格式,用法和printf()一样
返回值:
成功: 实际格式化的字符个数
失败: -1
~~~
sprint使用方法和printf类似,唯一区别是增加了第一个参数,第一个参数是一个char数组
~~~
char a[100];
sprintf(a,"%s","hello world");
printf("%s\n", a);
~~~
# sscanf函数
sscanf类似scanf函数,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入
sscanf多了第一个参数,char数组,sscanf会从这个char数组中读取相关内容
~~~
#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
功能:
从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据
参数:
str: 指定的字符串首地址
format: 字符串格式,用法和scanf()一样
返回值:
成功: 实际读取的字符个数
失败: -1
~~~

# strchr 查找字符
~~~
char * strchr(char * _Str,int _Ch);
~~~
在参数_str中查找_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL;
~~~
int main()
{
char src[] = "dda123sdf";
char *p = strchr(src, 'a'); //如果是汉子用""
printf("p=%s\n", p); //a123sdf
if (p != NULL)
{
printf("找到了\n");
}
system("pause");
return EXIT_SUCCESS;
}
~~~
# strstr查找字符串
~~~
int main()
{
char src[] = "dda123sdf";
char *p = strstr(src, "a123");
printf("p=%s\n", p); //a123sdf
system("pause");
return EXIT_SUCCESS;
}
~~~
失败返回NULL
# strtok 字符串分割
~~~
#include<string.h>
char *strtok(char *str, const char *delim);
~~~
功能: 将字符串分割成一个个片段,当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为'\0'字符,当连续出现多个时只替换第一个为'\0'
~~~
int main()
{
char src[] = "dda123sdf";
char *p = strtok(src, "a123");
printf("p=%s\n", p); //dd
system("pause");
return EXIT_SUCCESS;
}
~~~
# scanf
~~~
int main()
{
char arr[100];
int a, b, c;
//1. 接收换行结束,可以接收空格
//scanf("%[^\n]", &arr);
//printf("%s\n", arr);
//2. 在scanf获取数据时,建议不要添加任何字符,空格除外
//scanf("a=%db=%dc=%d", &a, &b, &c); //输入a=1b=2c=3
//printf("%d %d %d\n", a, b, c);
//3. 有限定字符宽度的格式化
//scanf("%1d%2d%3d", &a, &b, &c);
//printf("%.2f\n", 3.1415);
//printf("%d %d %d\n", a, b, c);
//补空格
//printf("%4s\n", "ab");
//截取
//printf("%.4s\n", "ab");
//4. 屏蔽数据类型, %d屏蔽数字, %c屏蔽字符
//scanf("%*d%s", arr);
//printf("%s\n", arr);
//5. 屏蔽一个区间之内的
//scanf("%*[a-z]%c", arr);
//printf("%s\n", arr);
system("pause");
return EXIT_SUCCESS;
}
~~~
# aoti
- c语言
- 基础知识
- 变量和常量
- 宏定义和预处理
- 随机数
- register变量
- errno全局变量
- 静态变量
- 类型
- 数组
- 类型转换
- vs中c4996错误
- 数据类型和长度
- 二进制数,八进制数和十六进制数
- 位域
- typedef定义类型
- 函数和编译
- 函数调用惯例
- 函数进栈和出栈
- 函数
- 编译
- sizeof
- main函数接收参数
- 宏函数
- 目标文件和可执行文件有什么
- 强符号和弱符号
- 什么是链接
- 符号
- 强引用和弱引用
- 字符串处理函数
- sscanf
- 查找子字符串
- 字符串指针
- qt
- MFC
- 指针
- 简介
- 指针详解
- 案例
- 指针数组
- 偏移量
- 间接赋值
- 易错点
- 二级指针
- 结构体指针
- 字节对齐
- 函数指针
- 指针例子
- main接收用户输入
- 内存布局
- 内存分区
- 空间开辟和释放
- 堆空间操作字符串
- 内存处理函数
- 内存分页
- 内存模型
- 栈
- 栈溢出攻击
- 内存泄露
- 大小端存储法
- 寄存器
- 结构体
- 共用体
- 枚举
- 文件操作
- 文件到底是什么
- 文件打开和关闭
- 文件的顺序读写
- 文件的随机读写
- 文件复制
- FILE和缓冲区
- 文件大小
- 插入,删除,更改文件内容
- typeid
- 内部链接和外部链接
- 动态库
- 调试器
- 调试的概念
- vs调试
- 多文件编程
- extern关键字
- 头文件规范
- 标准库以及标准头文件
- 头文件只包含一次
- static
- 多线程
- 简介
- 创建线程threads.h
- 创建线程pthread
- gdb
- 简介
- mac使用gdb
- setjump和longjump
- 零拷贝
- gc
- 调试器原理
- c++
- c++简介
- c++对c的扩展
- ::作用域运算符
- 名字控制
- cpp对c的增强
- const
- 变量定义数组
- 尽量以const替换#define
- 引用
- 内联函数
- 函数默认参数
- 函数占位参数
- 函数重载
- extern "C"
- 类和对象
- 类封装
- 构造和析构
- 深浅拷贝
- explicit关键字
- 动态对象创建
- 静态成员
- 对象模型
- this
- 友元
- 单例
- 继承
- 多态
- 运算符重载
- 赋值重载
- 指针运算符(*,->)重载
- 前置和后置++
- 左移<<运算符重载
- 函数调用符重载
- 总结
- bool重载
- 模板
- 简介
- 普通函数和模板函数调用
- 模板的局限性
- 类模板
- 复数的模板类
- 类模板作为参数
- 类模板继承
- 类模板类内和类外实现
- 类模板和友元函数
- 类模板实现数组
- 类型转换
- 异常
- 异常基本语法
- 异常的接口声明
- 异常的栈解旋
- 异常的多态
- 标准异常库
- 自定义异常
- io
- 流的概念和类库结构
- 标准io流
- 标准输入流
- 标准输出流
- 文件读写
- STL
- 简介
- string容器
- vector容器
- deque容器
- stack容器
- queue容器
- list容器
- set/multiset容器
- map/multimap容器
- pair对组
- 深浅拷贝问题
- 使用时机
- 常用算法
- 函数对象
- 谓词
- 内建函数对象
- 函数对象适配器
- 空间适配器
- 常用遍历算法
- 查找算法
- 排序算法
- 拷贝和替换算法
- 算术生成算法
- 集合算法
- gcc
- GDB
- makefile
- visualstudio
- VisualAssistX
- 各种插件
- utf8编码
- 制作安装项目
- 编译模式
- 内存对齐
- 快捷键
- 自动补全
- 查看c++类内存布局
- FFmpeg
- ffmpeg架构
- 命令的基本格式
- 分解与复用
- 处理原始数据
- 录屏和音
- 滤镜
- 水印
- 音视频的拼接与裁剪
- 视频图片转换
- 直播
- ffplay
- 常见问题
- 多媒体文件处理
- ffmpeg代码结构
- 日志系统
- 处理流数据
- linux
- 系统调用
- 常用IO函数
- 文件操作函数
- 文件描述符复制
- 目录相关操作
- 时间相关函数
- 进程
- valgrind
- 进程通信
- 信号
- 信号产生函数
- 信号集
- 信号捕捉
- SIGCHLD信号
- 不可重入函数和可重入函数
- 进程组
- 会话
- 守护进程
- 线程
- 线程属性
- 互斥锁
- 读写锁
- 条件变量
- 信号量
- 网络
- 分层模型
- 协议格式
- TCP协议
- socket
- socket概念
- 网络字节序
- ip地址转换函数
- sockaddr数据结构
- 网络套接字函数
- socket模型创建流程图
- socket函数
- bind函数
- listen函数
- accept函数
- connect函数
- C/S模型-TCP
- 出错处理封装函数
- 多进程并发服务器
- 多线程并发服务器
- 多路I/O复用服务器
- select
- poll
- epoll
- epoll事件
- epoll例子
- epoll反应堆思想
- udp
- socket IPC(本地套接字domain)
- 其他常用函数
- libevent
- libevent简介