袖珍C库
时间:2022-04-22
本文章向大家介绍袖珍C库,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 #include "StdAfx.h"
2 #include <iostream>
3 #include <fstream>
4 #include <cassert>
5 #include <string>
6
7 using namespace std;
8
9 const int increment = 100;
10
11 typedef struct CStashTag{
12 int size;
13 int quantity;
14 int next;
15 unsigned char* storage;
16 }CStash;
17
18 void initialize(CStash* s,int size);
19 void cleanup(CStash* s);
20 int add(CStash* s,const void* element);
21 void* fetch(CStash* s,int index);
22 int count(CStash* s);
23 void inflate(CStash* s,int increase);
24
25 void initialize(CStash* s,int sz){
26 s->size = sz;
27 s->quantity = 0;
28 s->storage = 0;
29 s->next = 0;
30 }
31
32 int add(CStash* s,const void* element){
33 if(s->next >= s->quantity)
34 inflate(s,increment);
35 int startBytes = s->next * s->size;
36 unsigned char* e=(unsigned char*)element;
37 for(int i=0;i<s->size;i++)
38 s->storage[startBytes + i] = e[i];
39 s->next++;
40 return(s->next -1);
41 }
42
43 void* fetch(CStash* s,int index){
44 assert(0 <= index);
45 if(index >= s->next)
46 return 0;
47 return &(s->storage[index * s->size]);
48 }
49
50 int count(CStash* s){
51 return s->next;
52 }
53
54 void inflate(CStash* s,int increase){
55 assert(increase > 0);
56 int newQuantity = s->quantity + increase;
57 int newBytes = newQuantity * s->size;
58 int oldBytes = s->quantity*s->size;
59 unsigned char* b = new unsigned char[newBytes];
60 for(int i=0;i<oldBytes;i++)
61 b[i] = s->storage[i];
62 delete [](s->storage);
63 s->storage = b;
64 s->quantity = newQuantity;
65 }
66
67 void cleanup(CStash* s){
68 if(s->storage != 0)
69 {
70 cout<<"freeing storage"<<endl;
71 delete []s->storage;
72 }
73 }
74
75 int main()
76 {
77 CStash intStash,stringStash;
78 int i;
79 char* cp;
80 ifstream in;
81 string line;
82 const int bufsize = 80;
83 initialize(&intStash,sizeof(int));
84 for(i =0;i<100;i++)
85 add(&intStash,&i);
86 for(i=0;i<count(&intStash);i++)
87 cout<<"fetch(&intStash,"<<i<<")"<<*(int*)fetch(&intStash,i)<<endl;
88 initialize(&stringStash,sizeof(char)*bufsize);
89 in.open("stdafx.cpp");
90 assert(in);
91 while(getline(in,line))
92 add(&stringStash,line.c_str());
93 i=0;
94 while((cp=(char*)fetch(&stringStash,i++))!=0)
95 cout<<"fetch(&stringStash,"<<i<<")"<<cp<<endl;
96 cleanup(&intStash);
97 cleanup(&stringStash);
98 return 0;
99 }
执行结果:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Rust FFI 编程 - Bindgen 工具介绍
- synchronized的实现原理——锁膨胀过程
- 大点干!早点散----------rsync+inotify实现远程实时同步
- 听说MongoDB你很豪横?-------------MongoDB数据库基础详解
- 听说MongoDB你很豪横?-------------MongoDB 部署分片群集以及管理分片
- SAP Spartacus和product相关的标准normalizer
- 【Rust 日报】2020-09-09 引入“auditable”
- 听说MongoDB你很豪横?-------------MongoDB复制集以及管理优化
- 听说Memcache你很豪横?-------------深入剖析Memcache 安装及管理数据库操作
- 听说Memcache你很豪横?-------------深入剖析Memcache+keepalive高可用群集
- 排障集锦:九九八十一难之第十四难!------------- 安装magent时make编译报错
- 【Rust日报】2020-09-06 Evil_DLL 用来测试注入方法的DLL
- 【Rust日报】2020-09-05 微软在c++静态分析工具实现了一些rust的安全规则
- 一起来玩玩WebGL
- 自研网关:多项目的swagger聚合功能