自己动手编写string类
自己动手写工具:自动点击小插件

⾃⼰动⼿写⼯具:⾃动点击⼩插件⼀、模拟点击操作应⽤场景 当我们需要对⼀个⽹页上的某个按钮进⾏多次点击以求得某种“好处”的时候,例如天猫的抢红包活动,我们可能需要点击N次之后才有可能获得⼀个红包,但是这个N是⼀个未知数,有可能我们要不停地点击半个⼩时甚⾄⼀个⼩时都还⽆法获得,⾃⼰估计也会点⿏标点得醉了。
因此,针对这种情况,我们希望⾃⼰写⼀个⼩⼯具来让计算机帮我们做这件事。
既然是让计算机模拟我们的点击操作,其思路⾃然是找到指定的按钮或图⽚,循环对其执⾏click事件。
于是,我们开始对其做⼀个最简单的实现来看看其基本思路。
⾸先,我们准备⼀个⽹站,这⾥我是⽤开发了⼀个⽹页,其中有⼀张图⽚作为抢红包的按钮图⽚,然后写了⼀个⼀般处理程序。
(1)前端⽹页的HTML代码:<!DOCTYPE html><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>测试页⾯</title><script src="Resource/Js/jquery-1.5.1.min.js"></script><script type="text/javascript">$(function () {$("#btnGetMoney").bind("click", function () {$.ajax({type: "GET",url: "MyServiceHandler.ashx?action=GetRedEnvelope",dataType: "json",success: function (data) {if (data.success) {alert("恭喜!您已获得红包:" + data.message + " 元");}else {alert("您的⼿⽓不好,下次再来抢吧");}},error: function () {alert('服务器未响应!');}});});});</script></head><body><div style="text-align:center;"><hr /><img id="btnGetMoney" src="Resource/Image/red2014.png" alt="抢红包" style="cursor:pointer;"/><hr /></div></body></html>View Code 其显⽰效果如下图所⽰: (2)后端⼀般处理程序代码:public void ProcessRequest(HttpContext context){context.Response.Buffer = true;context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);context.Response.AddHeader("pragma", "no-cache");context.Response.AddHeader("cache-control", "");context.Response.CacheControl = "no-cache";context.Response.ContentType = "text/plain";string returnJson = null;if (!string.IsNullOrEmpty(context.Request["action"])){switch (context.Request["action"].ToString()){case"GetRedEnvelope":context.Response.ContentType = "text/XML";returnJson = GetRedEnvelope(context);break;}}context.Response.Write(returnJson);context.Response.End();}private static Random ran = new Random();private string GetRedEnvelope(HttpContext context){JsonObject json = new JsonObject();int number = ran.Next(1, 100);if (number > 95){// 5%的⼏率获得红包json.success = true;}else{json.success = false;}json.message = number.ToString();JavaScriptSerializer serializer = new JavaScriptSerializer();return serializer.Serialize(json);}View Code 当⽤户点击前端⽹页中的图⽚时,会发出⼀个AJAX请求到服务端,服务端会⽣成⼀个1到100之间的随机数来模拟概率,只有在随机⽣成的数字达到95以上(即5%的概率)才给⽤户返回获得红包的效果。
自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)

⾃⼰动⼿,丰⾐⾜⾷。
普通键盘实现键盘宏(Windows和Mac版)很多⾼端机械键盘,⽀持宏定义,例如我们可以设置"D"键为"dota",这样当我们按⼀下宏开启键,再按⼀下"D"键,就等价于分别按了"d" "o" "t" "a"四个键。
这时就可以把⼀些敲代码时常⽤的模板定义成键盘宏,到时候⼀键补全代码,既⾼效⼜装X。
另外,玩游戏时想按出“下前下前拳”这样的组合技能也容易多了。
那么问题来了。
⼭⾥来的买不起机械键盘的穷B同时⼜是程序员应该怎么办。
其实这样简单的功能不⼀定⾮要硬件⽀持,借助⼀些现有软件模拟⼀下键盘就好了,在windows下有按键精灵和AutoHotKey这些神器,模拟起来很容易,⽽且体验⾮常完美。
我是借助按键精灵实现的,按键精灵语法很简单,例如 KeyPress "A", 3 就表⽰按A键3次,⽽且⽀持全局快捷键启动,⽀持监听⽤户输⼊,真是简单到⽆情。
不过问题⼜来了。
键盘宏主要是按⼀系列按键,如果每个按键都写⼀⾏ KeyPress "X", 1 ,有的还得配合Shift键才能按出来,也是累,⽽且⼀⾏⼀句代码,看上去不直观,容易写错。
那就写个代码⽣成器就好了,我是⽤C语⾔+std::string实现的,直接把宏写成字符串,⽣成器⾃动输出相应的按键,粘贴到按键精灵中编译保存就好了。
贴⼀下代码:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <ctype.h>5 #include <string>67using std::string;89enum class OpType {10 Press,11 Down,12 Up13 };1415enum class CombKey {16 Shift,17 Ctrl,18 Alt19 };2021void initTransHash(); //初始化按shift才能打出的字符22void transfer(char c); //shift打出的字符转化为真正的按键23void procOpType(OpType type); //输出按键操作24void callKey(OpType type, char key, int count=1); //按键25void callKey(OpType type, string key, int count=1); //重载,按功能键26void keyComb(CombKey comb, char key); //组合键272829const int delay = 2;30string transChar;31char transHash[256];323334int main() {35 initTransHash();3637string keys = "function() {\n},";3839for(char key : keys) {40if(strchr(transChar.c_str(), key) != NULL) {41 transfer(key);42 } else {43if(isupper(key)) {44 keyComb(CombKey::Shift, key);45 } else {46 callKey(OpType::Press, key);47 }48 }49 }50 }5152void initTransHash() {53 memset(transHash, 0, sizeof(transHash));5455//56// ~ ! @ # $ % ^ & * ( ) _ + { } | : \" < > ?57// ` 1 2 3 4 5 6 7 8 9 0 - = [ ] \\ ; ' , . /5859 transChar = "~!@#$%^&*()_+{}|:\"<>? \n";60string keys = "`1234567890-=[]\\;',./\0\0";6162// transChar空格后⾯的字符不加⼊hash表63for(int i = 0; i < keys.size(); i++) {64 transHash[transChar[i]] = keys[i];65 }66 }6768void transfer(char c) {69if(transHash[c]) {70 keyComb(CombKey::Shift, transHash[c]);71return;72 }73switch(c) {74case'\n':75 callKey(OpType::Press, "Enter");76break;7778case'':79 callKey(OpType::Press, "Space");80break;8182default:83 printf("[Red] cant transfer: %c\n", c);84break;85 }86 }8788void procOpType(OpType type) {89switch(type) {90case OpType::Press:91 printf("KeyPress "); break;92case OpType::Down:93 printf("KeyDown "); break;94case OpType::Up:95 printf("KeyUp "); break;96 }97 }9899void callKey(OpType type, char key, int count) {100 procOpType(type);101 printf("\"%c\", %d\n", islower(key) ? key-32 : key, count);102 printf("Delay %d\n", delay); //每次按键后延迟10毫秒103 }104105void callKey(OpType type, string key, int count) {106 procOpType(type);107//printf("\"%s\"\n", key.c_str());108 printf("\"%s\", %d\n", key.c_str(), count);109 printf("Delay %d\n", delay); //每次按键后延迟10毫秒110 }111112void keyComb(CombKey comb, char key) {113string combKey;114switch(comb) {115case CombKey::Shift:116 combKey = "Shift"; break;117case CombKey::Ctrl:118 combKey = "Ctrl"; break;119case CombKey::Alt:120 combKey = "Alt"; break;121default:122return;123 }124125 callKey(OpType::Down, combKey);126 callKey(OpType::Press, key);127 callKey(OpType::Up, combKey);128 }按键精灵_键盘宏_代码⽣成器然后把每⼀个键盘宏写成⼀个函数,通过按下按键精灵的全局快捷键启动,然后脚本监听⽤户按键,然后调⽤相应函数执⾏键盘宏就可以了,模板类似这样:1 choose = WaitKey()2 TracePrint choose34 Select Case choose5 Case 706 KeyPress "BackSpace", 17 Call F()8 Case 729 KeyPress "BackSpace", 110 Call H()11 End Select1213// 按下F键14 Sub F()15 End Sub1617// 按下H键18 Sub H()19 End Sub按键精灵_键盘宏_模板(宏键也会打印出来,所以我在调⽤函数打印键盘宏之前,调⽤BackSpace删除了宏键的字符)然后问题⼜来了。
自己动手写的简单程序

intmain()
{
intmax(intx,inty);//对max函数的声明
inta,b,c;//定义变量
cin>>a>>b;
c=max(a,b);//函数调用
cout<<a<<"and"<<b<<"the max is "<<c<<endl;
return 0;
using namespacestd;
structStudent
{
char name[10];
intnum;
char sex;
};
intmain()
{
Student *p;
p=new Student;
strcpy(p->name,"liuqing");
p->num=1409;
p->sex='M';
cout<<"name: "<<p->name<<endl;
return 0;
}
【交换两个数的方法】
方法一:(引用作为传送变量的别名)
void swap(double &a, double &b)
{
double temp;
temp=a;
a=b;
b=temp;
}
调用方法:swap(a,b);
方法二:
void swap(double* a, double* b)
using namespacestd;
float max(floatx,floaty){return(x>=y?x:y);}
c++ string类的常用方法

c++ string类的常用方法x1、string类的构造函数string类的构造函数有三种:(1)默认构造函数:string();(2)以字符串常量指针为参数的构造函数:string (const char *s);(3)以字符串对象为参数的构造函数:string (const string &str);2、string类的赋值操作string类的赋值操作有以下几种:(1)以字符串常量指针为参数的赋值运算符重载:string & operator = (const char *s);(2)以字符串对象为参数的赋值运算符重载:string & operator = (const string &str);(3)拼接函数:string &append (const string &str);(4)两个字符串的拼接:string + string;3、string类的比较操作string类的比较操作有如下几种:(1)比较两个字符串是否相等的比较操作符:string==string;(2)比较两个字符串是否不等的比较操作符:string!=string;(3)比较两个字符串大小的比较操作符:string>string;4、string类的查找操作string类的查找操作有以下几种:(1)查找从某个位置开始某个子串的位置的函数:size_tfind(const string &str,size_t pos = 0);(2)查找从某个位置开始某个字符的位置的函数:size_tfind(char c,size_t pos = 0);(3)查找从右向左某个子串的位置的函数:size_t rfind(const string &str,size_t pos = string::npos);(4)查找从右向左某个字符的位置的函数:size_t rfind(char c,size_t pos = string::npos);5、string类的修改操作string类的修改操作有以下几种:(1)插入字符串的函数:string &insert (size_t pos, const string &str);(2)替换某个子串的函数:string &replace (size_t pos, size_t len, const string &str);(3)删除某个子串的函数:string &erase (size_t pos = 0, size_t len = npos);(4)在字符串前面补充某字符的函数:string &insert (size_t pos, size_t n, char c);(5)清除字符串的函数:void clear();6、string类的截取操作string类的截取操作有以下几种:(1)从某个位置截取字符串的函数:string substr (size_t pos = 0, size_t n = npos);(2)将字符串按照一定的字符分割成多个小字符串的函数:vector<string> split(char c);(3)删除收尾处的某字符的函数:string &trim(char c);。
string的几种构造函数

string的几种构造函数在编程中,字符串(string)是一种非常常用的数据类型,用于存储和操作文本。
在C++语言中,string类是用来表示和操作字符串的类。
string类提供了多个构造函数,用于创建字符串对象。
本文将介绍string的几种构造函数,并详细解释它们的用法。
1. 默认构造函数string类的默认构造函数创建一个空的字符串对象。
空字符串是一个长度为0的字符串,不包含任何字符。
我们可以使用以下语法来创建一个空字符串对象:string str;2. 字符数组构造函数string类还提供了一个构造函数,可以使用字符数组来创建字符串对象。
字符数组是一系列字符的集合,以null字符('\0')结尾。
我们可以使用以下语法来创建一个字符串对象:char arr[] = "Hello";string str(arr);这样,str将包含字符数组arr中的所有字符,并以null字符结尾。
需要注意的是,字符数组的长度必须小于或等于字符串对象的最大长度。
3. 字符串构造函数除了字符数组,我们还可以使用另一个字符串来创建字符串对象。
string类提供了一个接受另一个字符串作为参数的构造函数。
我们可以使用以下语法来创建一个字符串对象:string str1 = "Hello";string str2(str1);这样,str2将包含与str1相同的内容。
这个构造函数会创建一个新的字符串对象,而不是简单地将str2指向str1。
4. 子字符串构造函数string类还提供了一个构造函数,可以使用另一个字符串的一部分来创建一个新的字符串对象。
我们可以使用以下语法来创建一个子字符串对象:string str1 = "Hello World";string str2(str1, 0, 5);这样,str2将包含str1中从索引0开始的5个字符,即"Hello"。
string的创建方式

string的创建方式在计算机编程中,字符串(string)是一种常用的数据类型,用于表示文本或字符序列。
在许多编程语言中,创建字符串有多种方式,下面将介绍一些常见的字符串创建方式。
1. 使用双引号或单引号最常见的创建字符串的方式是使用双引号或单引号将一段文本括起来。
例如,可以使用双引号创建一个包含"Hello World!"的字符串:"Hello World!"。
同样地,使用单引号也可以创建相同的字符串:'Hello World!'。
使用引号创建的字符串可以包含任意字符,包括字母、数字、标点符号等。
2. 使用字符串连接符另一种常见的创建字符串的方式是使用字符串连接符将多个字符串连接在一起。
在许多编程语言中,字符串连接符通常是加号(+)。
例如,可以通过以下方式创建一个包含"Hello"和"World!"的字符串:"Hello" + "World!"。
在这个例子中,加号将两个字符串连接在一起,形成一个新的字符串。
3. 使用字符串模板或格式化字符串一些编程语言提供了更灵活的字符串创建方式,例如字符串模板或格式化字符串。
这种方式允许将变量或表达式的值嵌入到字符串中。
例如,可以使用字符串模板或格式化字符串创建一个包含变量name的字符串: "Hello, ${name}!"。
在这个例子中,${name}会被变量name的值替换。
4. 使用字符串构造函数许多编程语言提供了字符串构造函数,可以使用这些构造函数来创建字符串对象。
例如,在Java中,可以使用String类的构造函数创建字符串对象:new String("Hello World!")。
这种方式可以将字符串包装成对象,提供了更多的字符串操作方法。
5. 使用字符串字面量一些编程语言提供了特殊的语法来创建字符串字面量。
c语言设计体会与心得5篇

c语言设计体会与心得5篇(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如个人总结、工作计划、心得体会、演讲致辞、应急预案、规章制度、策划方案、教学资料、作文大全、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!Moreover, our store provides various types of classic sample essays for everyone, such as personal summaries, work plans, insights, speeches, emergency plans, rules and regulations, planning plans, teaching materials, complete essays, and other sample essays. If you want to learn about different sample formats and writing methods, please pay attention!c语言设计体会与心得5篇心得体会是一种对学习过程中的感悟和体验的总结和表达,可以帮助他人更好地理解学习的意义,大家可以通过写心得体会来激发自己的思考和创新能力,从而找到解决问题的新途径和方法,以下是本店铺精心为您推荐的c语言设计体会与心得5篇,供大家参考。
string在c语言中的用法

string在c语言中的用法字符串是一种重要的数据类型,它在C语言中有很多的应用。
在C语言中,字符串是由char类型的字符数组来实现的。
每个字符都占用一个字节,以\0作为字符串的结束标志。
字符串的定义:字符串的定义方式为:char str[]=”Hello World”;其中,str是一个字符数组,用于存储字符串,“Hello World”是字符串字面值。
由于字符串需要以\0作为结束标志,因此在定义字符串时,必须保证字符串后面有一个\0。
字符串的输入输出:字符串的输入输出可以使用库函数puts和gets。
其中,puts用于输出字符串,gets用于输入字符串。
puts(str) 输出字符串strgets(str) 输入字符串str字符串的长度:在C语言中,可以使用strlen函数来计算字符串的长度。
strlen函数用于计算字符串的字符个数,不包括字符串末尾的\0。
例如,strlen("hello")的返回值为5。
字符串的复制:在C语言中,可以使用strcpy函数来复制字符串。
strcpy函数用于将一个字符串复制到另一个字符串中。
例如,strcpy(dest, src)表示将src复制到dest中。
字符串的比较:在C语言中,可以使用strcmp函数来比较两个字符串的大小。
strcmp函数用于比较两个字符串的大小,根据比较结果返回一个整数。
如果第一个字符串小于第二个字符串,返回负数;如果第一个字符串等于第二个字符串,返回0;如果第一个字符串大于第二个字符串,返回正数。
例如,strcmp("hello", "world")的返回值为负数。
字符串的连接:在C语言中,可以使用strcat函数来连接两个字符串。
strcat函数用于将一个字符串连接到另一个字符串的后面。
例如,strcat(dest, src)表示将src连接到dest的后面。
字符串的查找:在C语言中,可以使用strstr函数来查找字符串。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//析构函数 ~MyString();
一些基本的属性。
size_t length();//字符串的长度 bool empty();//字符串是否为空
string 中有个 c_str()成员函数,返回 C 风格字符串的指针,我们也加上这 个函数。
return strcmp(lhs.p_str,rhs.p_str)>=0; }
需要说明的是,>>操作符重载函数写得比较简单,实际应该考虑很多异常 问题。另临时字符串数组也是无奈之举,或许也可以考虑读取一个字符调用一次 "+="操作符,在 MyString 的设计中,一次"+="操作会涉及内存资源的释放和 再申请,大量执行"+="操作效率不能忍。因此,一个实用的 string 类应涉及" 缓冲区"的概念,内存资源的申请不再和字符串的大小相吻合,这样会提高很多 操作的效率。
自己动手编写 string 类
题记:人们对事物的恐惧往往源自不了解,如果你能把它写出来,还怕不会用 吗?
对于那些对 C++标准库中的 string 不甚了解的读者来说,这篇文章的名称 可 能 会 引 起 一 些 混 淆 。 标 准 库 中 的 string 并 不 是 一 个 独 立 的 类 , 而 是 basic_string 模板类的一个特化版本: typedef basic_string<char, char_traits<char>, allocator<char> > string;
friend MyString operator+(const MyString&,const MyString&); //比较操作符
friend bool operator==(const MyString&,const MyString&); friend bool operator!=(const MyString&,const MyString&); friend bool operator<(const MyString&,const MyString&); friend bool operator<=(const MyString&,const MyString&); friend bool operator>(const MyString&,const MyString&); friend bool operator>=(const MyString&,const MyString&); //下标操作符
return p_str[in源自ex]; }//'+'操作符的重载 MyString operator+(const MyString& lhs,const MyString& rhs) {
MyString ret; ret.strLength = lhs.strLength + rhs.strLength; ret.p_str = new char[ret.strLength+1]; strcpy(ret.p_str,lhs.p_str); strcat(ret.p_str,rhs.p_str); return ret; }
char& operator[] (const size_t); const char& operator[] (const size_t)const; //赋值操作符
MyString& operator=(const MyString&); //'+='操作符
MyString& operator+=(const MyString&);
有几个问题需要说明。 1、IO 操作符不可以定义为类的成员函数,否则,左操作数只能是该类类型的对 象。
MyString s; s<<cout;
这你能忍? 2、算术和关系操作符一般情况下应定义为非成员函数,它们并不会改变操作数 的状态。 3、上述操作符既为非成员函数,又要访问类的私有数据成员,所以将它们设为 类的友元。 4、下标操作符定义了两个,第二个是对应类对象是 const 的情况,否则,类的 const 对象将无法使用下标。 最后,再写一些操作函数。标准库 string 的操作函数为数众多,且存在大量的 重载版本。这里出于篇幅考虑,选择几个代表性的函数来实现。
MyString::MyString(const size_t len,const char ch) {
strLength = len; p_str = new char[strLength+1]; *(p_str+strLength)='\0'; strset(p_str,ch); }
MyString::~MyString() {
return *this; }
//比较操作符 bool operator==(const MyString& lhs,const MyString& rhs) {
return strcmp(lhs.p_str,rhs.p_str)==0; } bool operator!=(const MyString& lhs,const MyString& rhs) {
const char* c_str();//返回 C 风格字符串的指针
下面该写操作符了,我们知道,string 支持的操作符特别多,这些都是通 过操作符的重载实现的。
//读写操作符
friend ostream& operator<< (ostream&,const MyString&); friend istream& operator>> (istream&,MyString&); //‘+’操作符
delete[] p_str; }
几个简单的成员函数
size_t MyString::length()
{ return strLength;
}
bool MyString::empty() {
return strLength==0?true:false; }
const char* MyString::c_str() {
至此,MyString 类的声明就告一段落了。
实现篇
类的声明虽然代码篇幅较短,但其是设计一个类的重中之重。声明做得很完 善,实现一般不会困难。下面依据上文声明的次序给出函数的实现。 构造函数和析构函数
MyString::MyString():strLength(0),p_str(NULL){}
MyString::MyString(const MyString& str) {
class MyString {private:
size_t strLength; char* p_str; };
下面我们来声明成员函数,当然,还有一些非成员函数。 想一想我们定义一个 string 变量有哪几种方式,一般情况下,以下四种方 式比较常见:
//调用默认构造函数 string s1;
//将 s2 初始化为 s1 的一个副本 string s2(s1); or string s2=s1;
return strcmp(lhs.p_str,rhs.p_str)<=0; } bool operator>(const MyString& lhs,const MyString& rhs) {
return strcmp(lhs.p_str,rhs.p_str)>0; } bool operator>=(const MyString& lhs,const MyString& rhs) {
//'+='操作符 MyString& MyString::operator+=(const MyString& str) {
if(this == &str) {
MyString copy(str); return *this+=copy; } strLength += str.strLength; char* p_old = p_str; p_str = new char[strLength+1]; strcpy(p_str,p_old); delete[] p_old; strcat(p_str,str.p_str);
return p_str; }
操作符的重载:
//输出操作符
ostream& operator<< (ostream& out,const MyString& str) {
if(str.p_str!=NULL) out<<str.p_str;
return out; }
//输入操作符 istream& operator>>(istream& in,MyString& str)// {
//赋值操作符 MyString& MyString::operator=(const MyString& str) {
if(this!=&str) {
if(strLength<str.strLength) {
delete[] p_str; p_str = new char[str.strLength+1]; } strLength = str.strLength; strcpy(p_str,str.p_str); } return *this; }