sprintf

C语言发展史(二)

别来无恙 提交于 2020-12-19 08:59:59
K&R C 1978年, 丹尼斯·里奇 和 布莱恩·柯林汉 合作出版了《 C程序设计语言 》的第一版。书中介绍的C语言标准也被C语言程序员称作“K&R C”,第二版的书中也包含了一些 ANSI C 的标准。 K&R C主要引入了以下语言特性: 标准I/O库 结构( struct )类型 长整数( long int )类型 无符号整数( unsigned int )类型 把运算符 =+ 和 =- 改为 += 和 -= 。因为 =+ 和 =- 会使得编译器不知道用户要处理 i = -10 还是 i =- 10 ,使得处理上产生混淆。 即使在后来 ANSI C标准 被提出的许多年后,K&R C仍然是许多编译器的最低标准要求,许多老旧的编译仍然运行K&R C的标准。 ANSI C 和 ISO C [ 编辑 ] 主条目: ANSI C 1989年,C语言被 美国国家标准协会 (ANSI)标准化,编号为ANSI X3.159-1989。这个版本又称为C89。标准化的一个目的是扩展K&R C,增加了一些新特性。 void 函数 函数返回 struct 或 union 类型 void * 数据类型 1990年, 国际标准化组织 (ISO)成立 ISO/IEC JTC1/SC22/WG14 工作组,来规定国际标准的C语言,通过对ANSI标准的少量修改,最终制定了 ISO 9899:1990

实验三

两盒软妹~` 提交于 2020-12-06 15:40:19
#第一题 /* * @Author: 曾钰芝 * @Date: 2020-12-06 14:01:12 * @LastEditTime: 2020-12-06 14:01:12 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \undefinedc:\Users\wangfuren\Desktop\秃头c\实验三1.c */ int main() { char ch ='\0'; printf("input a char:\n"); scanf("%c",&ch); if(ch>='a'&&ch<='z') ch = ch-32; printf("%c\n",ch); return 0; } #第二题 /* * @Author: 曾钰芝 * @Date: 2020-12-06 14:01:12 * @LastEditTime: 2020-12-06 14:01:12 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \undefinedc:\Users\wangfuren\Desktop\秃头c\实验三2.c */ int

OSS对象存储的全球加速方案

為{幸葍}努か 提交于 2020-11-27 10:57:55
业务场景 OSS对象存储作为一种海量、安全、低成本、高持久的云存储服务,深受广大开发人员的喜爱。但是在全球化的业务场景中,不管OSS选择放于海外或者大陆地区,都会导致另外一部分用户上传和访问质量不佳的问题。 本文旨在提供一种基于OSS对象存储的低成本的全球加速方案。 网络架构图 方案设计 下载方案 使用自定义域名配置 CDN加速 DNS解析 :自定义域名CNAME解析到CDN加速域名 对象访问签名调整:改用 URL鉴权 的方式进行签名 上传方案 直接使用 OSS传输加速域名 {bucket}.oss-accelerate.aliyuncs.com 配置步骤 配置CDN加速 加速域名配置 自定义域名 ,后续对象访问使用此域名。源站信息选择 OSS域名 , 域名类型选择 自定义OSS源站 ,域名配置为 OSS传输加速域名 {bucket}.oss-accelerate.aliyuncs.com 创建成功后会生成一个CDN加速域名(类似xxx.com.w.cdngslb.com) 如果为私有Bucket,回源配置中需要开启 阿里云OSS私有Bucket回源 ,访问控制-开启 URL鉴权 ,填写 主备KEY ! 配置DNS解析 将自定义域名CNAME解析到刚才配置后得到的CDN加速域名 对象访问签名 /** * CND鉴权-A方案的签名 * * @param string $host eg

golang-random随机数

房东的猫 提交于 2020-11-27 04:32:39
在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand", 对应两种应用场景。 一、"math/rand" 包实现了伪随机数生成器。也就是生成 整形和浮点型。    该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:   1、有种子。通常以时钟,输入输出等特殊节点作为参数,初始化。该类型生成的随机数相比无种子时重复概率较低。   2、无种子。可以理解为此时种子为1, Seek(1)。 for i := 0 ; i < 10 ; i++ { r : = rand.New(rand.NewSource(time.Now().UnixNano())) fmt.Printf( " %d " , r.Int31()) } fmt.Println( "" ) for i := 0 ; i < 10 ; i++ { fmt.Printf( " %d " , rand.Int31()) } // 703626706 738454556 1582952585 1585378792 1337824049 728749578 2042459905 780929790 1910510343 178978546 // 1106410694 1747278511 460128162 817455089 683024728

基于STM32F429的内存管理

偶尔善良 提交于 2020-11-18 20:09:05
1.内存管理介绍    内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如 何高效,快速的分配,并且在适当的时候释放和回收内存资源。 内存管理的实现方法有很多种, 他们其实最终都是要实现 2 个函数: malloc 和 free ; malloc 函数用于内存申请, free 函数用于 内存释放。  从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n 块,对应的内存管理表,大小也为 n ,内存管理表的每一个项对应内存池的一块内存。 内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当 该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。 比如某项值为 10 ,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某 个指针。 内寸分配方向如图所示,是从顶  底的分配方向。即首先从最末端开始找空内存。当内存 管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。 分配原理     当指针 p 调用 malloc 申请内存的时候,先判断 p 要分配的内存块数( m ),然后从第 n 项开 始 ,向下查找,直到找到 m 块连续的空内存块(即对应内存管理表项为 0 ),然后将这 m 个内 存管理表项的值都设置为 m (标记被占用),最后

音视频系列--c语言学习(二级指针,函数指针,复杂指针函数,字符串,常量指针,文件操作)

烈酒焚心 提交于 2020-11-16 08:37:12
一、指针间传值详解 1.1、值传递 行参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参 -> 形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。 1.2、指针传递 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行操作。 1.3、引用传递 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调 函数中的实参变量。 // pass by value void swap ( int a , int b ) { int temp = a ; a = b ; b = temp ; } // pass by address void swap1 ( int * a , int * b ) { int temp = * a ; * a = * b ; * b = temp ; } // pass by reference void swap2 ( int & a , int & b ) { int

C++学习笔记第一天

无人久伴 提交于 2020-11-03 09:03:40
第一节 C中: const in a = int const a int *const p const int *const p char *p =malloc(100); //(void *) enum day { Mon,TUE } enum DAY today today = 100; int a,b =10; a=b=100; (a=b)=100;//表达式不可以被赋值 C++ 中: 1.类型检查更严格 const in a =0; 必须初始化 char *p =(char*)malloc(100); 2.增加了一个BOOL类型(ture/false),其实就是一个枚举类型 3.C++中的枚举类型是真正意义的枚举类型,只能取里面的内容 enum BOOL { FALSE,TURE } BOOL a = FALSE;(只能用枚举类型BOOL里面的值) 4.表达式 (a=b)=100;//表达式可以被赋值 第二节 cin cout 类对象 。scanf sprintf 相同的功能,函数 char name[30]; scanf、gets, cin(不安全) fgets(name,30,stdin)//自己控制读取长度(安全) string name; cin>>name(安全) cin>>流输入运算符 输出控制 int a =12345; cout <<setw(8)<<a<

MFC之CString操作1

孤街醉人 提交于 2020-11-02 16:00:34
本文章参考: CString CString 对象可以被认为是 字符数组 . 将 CString 看作实际的 字符串 ,而不是指向字符串的 指针 . CString 位于头文件 afx.h 中。 CString 对象的 Format() 方法,完胜 sprintf() 函数或 wsprintf() 函数格式化字符串操作 前话:_T()宏与Unicode意识 CString s;   s.Format(_T("The total is %d"),total); CString s;   s.Format(_T("%d"),total);// 把一个整数转化成 CString 类型 // 在 Unicode 环境下,它的效果就相当于: s.Format(L"%d",total); // 此时,不要用 sizeof() 操作符来获得字符串的长度,因为在 Unicode 环境下就会有 2 倍的误差。我们可以用一些方法来隐藏 Unicode 的一些细节,比如当需要获得字符长度的时候,用一个叫做 DIM 的宏,定义在 dim.h 文件中:    #define DIM(x) (sizeof((x)) / sizeof((x)[0])) 区分真实字符长度 || 字节长度。 1)CString类的构造函数 CString 类有很多构造函数,这里只介绍几个比较常用的: CString(const

segment fault 至core dump的原因

一世执手 提交于 2020-10-28 13:17:04
最近,写rust ffi 代码,出现segment fault 至core dump。看了一篇文章,值得留意。 造成segmentation fault的可能原因分析 一 造成segment fault,产生core dump的可能原因 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。 2 多线程程序使用了线程不安全的函数。 3 多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump 4 非法指针 a) 使用空指针 b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus

Golang 入门笔记(二)下

◇◆丶佛笑我妖孽 提交于 2020-10-28 10:33:38
目录 文章目录 目录 修改字符串 连接字符串 格式化 格式表 BASE64编码 常量 枚举--一组常量值 类型别名与类型定义 非本地类型不能定义方法 在结构体成员嵌入时使用别名 紧接上文 修改字符串 Go 语言的字符串是不可变的 修改字符串时可以将字符串转变为【】byte进行修改 【】byte和string可以通过强制类型转换互转。 连接字符串 +号可以直接连接 但使用 bytes.Buffer更快 h:=“aa” b:=“cc” var stb bytes.Buffer stb.WriteString(h) stb.WriteString(b) c:=stb.String() 格式化 fmt.Sprintf(格式化样式,参数列表…) 格式化样式:字符串样式,格式化动词以%开头 参数列表:多个参数以逗号分隔,个数与格式化相对应 var progress=2 fmt.Sprintf(“ss %d”,progress) 格式表 BASE64编码 package main import ( "encoding/base64" "fmt" ) func main() { //需要处理的字符串 message := ".https//golang.org/" //编码信息 encodedMessage := base64.StdEncoding.EncodeToString([]byte