-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
132 lines (63 loc) · 139 KB
/
Copy pathsearch.xml
File metadata and controls
132 lines (63 loc) · 139 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>python--信息自动发送器</title>
<link href="/2023/04/06/python%E5%AE%9E%E7%8E%B0%20--%20QQ%E5%BE%AE%E4%BF%A1%E8%87%AA%E5%8A%A8%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E5%99%A8/"/>
<url>/2023/04/06/python%E5%AE%9E%E7%8E%B0%20--%20QQ%E5%BE%AE%E4%BF%A1%E8%87%AA%E5%8A%A8%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E5%99%A8/</url>
<content type="html"><![CDATA[<h1 id="源码实现"><a href="#源码实现" class="headerlink" title="源码实现"></a>源码实现</h1><pre><code class="python">import win32guiimport win32apiimport win32conimport win32clipboard as wimport timeimport optparseimport randomimport requestsdef ctrlV(): win32api.keybd_event(17,0,0,0) #ctrl键位码是17 win32api.keybd_event(86,0,0,0) #v键位码是86 win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键 win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)def send(name, msg,sleep_time): #打开剪贴板 w.OpenClipboard() #清空剪贴板 w.EmptyClipboard() #设置剪贴板内容 w.SetClipboardData(win32con.CF_UNICODETEXT, msg) #获取剪贴板内容 date = w.GetClipboardData() #关闭剪贴板 w.CloseClipboard() #获取窗口句柄 handle = win32gui.FindWindow(None,name) if handle == 0: print('---------为打开该窗口------') #显示窗口 win32gui.ShowWindow(handle,win32con.SW_SHOW) #把剪切板内容粘贴到qq窗口 ctrlV() time.sleep(sleep_time)#延缓进程 #win32gui.SendMessage(handle, win32con.WM_PASTE, 0, 0) #按下后松开回车键,发送消息 win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) win32gui.SendMessage(handle, win32con.WM_KEYUP, win32con.VK_RETURN, 0)def banner(): print(""" _______ .__ __. _______ ____ ____ ____ ___ .______ | ____|| \ | | | \ |___ \ \ \ / / / _ \ | _ \ | |__ | \| | | .--. | __) | \ \/ / | | | | | |_) | | __| | . ` | | | | | |__ < \ / | | | | | / | |____ | |\ | | '--' | ___) | \ / | |_| | | |\ \----. |_______||__| \__| |_______/ |____/ \__/ \___/ | _| `._____| """)def RUN(): banner() print('------RUN-----') usage = 'python %prog -u/--user <target user> / -m/--msg <target message> -t/--time <target times>' parser = optparse.OptionParser(usage) parser.add_option('-u','--user',dest="user",type="string",help = "target user",default="cyh这辈子最爱的唯一亲老婆") parser.add_option('-m','--msg',dest="message",type="string",help = "target message",default = "我永远爱你!") parser.add_option('-t','--time',dest="time",type="int",help = "target times",default = 5) parser.add_option('-s','--sleep',dest="sleep",type="float",help = "target sleep time",default = 1) parser.add_option('-c','--choice',dest="choice",type="string",help = "function selection",default = '1') opts,args = parser.parse_args() if(opts.choice == '1'): for i in range(0, opts.time): print("发送成功:"+opts.message) send(opts.user, opts.message,opts.sleep) print('-----over----') else: for i in range(0, opts.time): message = sentence(opts.choice) print("发送成功:"+message) send(opts.user,message,opts.sleep) print('-----over----')def sentence(choice): url = "https://v1.hitokoto.cn/?c="+ choice +"&encode=text&min_length=15" r = requests.post(url) return r.textif __name__ == "__main__": RUN()</code></pre>]]></content>
<categories>
<category> python开发 </category>
</categories>
<tags>
<tag> python开发 </tag>
</tags>
</entry>
<entry>
<title>2023年东南大学916初复试经验贴</title>
<link href="/2023/04/06/2023%E4%B8%9C%E5%8D%97%E5%A4%A7%E5%AD%A6916%E5%88%9D%E8%AF%95%E5%A4%8D%E8%AF%95%E7%BB%8F%E9%AA%8C%E8%B4%B4/"/>
<url>/2023/04/06/2023%E4%B8%9C%E5%8D%97%E5%A4%A7%E5%AD%A6916%E5%88%9D%E8%AF%95%E5%A4%8D%E8%AF%95%E7%BB%8F%E9%AA%8C%E8%B4%B4/</url>
<content type="html"><![CDATA[<h1 id="一-报考原因"><a href="#一-报考原因" class="headerlink" title="一. 报考原因"></a>一. 报考原因</h1><p>本来准备继续在小破邮读研的,女朋友想考东南,就就就就上岸东南啦!</p><h1 id="二-初试准备"><a href="#二-初试准备" class="headerlink" title="二. 初试准备"></a>二. 初试准备</h1><h2 id="1-数学一-118-分"><a href="#1-数学一-118-分" class="headerlink" title="1. 数学一 118 分"></a>1. 数学一 118 分</h2><p>大一大二期间因为疫情没学习,数学功底一般,高数下66分,概率论79分,一开始也因为数学感到发慌,后来想了一下,考东南数学有110分也就够了,尽力学就行!</p><p>高数视频:我基础班跟的是张宇老师,时间大概是2月到3月(现在可以叫小宇了),张宇老师的教学风格比较幽默,基础部分也有回顾大学之前的知识,适合基础较为好的同学,点火公式这些可以说是考研必学了!强化班跟了武忠祥老师,因为复习进度较快,所以在5-6月就过了第一遍2022年的强化班(当时2023还没开始出),做了配套的严选题(必刷),但是感觉没学进脑子,赶进度,但是已经对武老师的教学风格有了一定的了解,数二部分讲的非常扎实,可以说娓娓道来,慢慢学下来确实有助于你在题目的理解和解题上有帮助,和宇哥注重的技巧不同(脑子好使)。暑期又跟了一边武老师的2023强化,这次安安心的学了一遍,高数感觉有了很大的提升,在后期作模拟卷的时候可以明显感觉到,在一些题目上有了些新的想法可以帮助解题,强调一下数一部分(听完武老再听一下宇哥,尤其线面积分这个分很重要!级数如果觉得自己学的好可以不听!)</p><p>高数题目:1800基础部分(基础不好的打基础可以,别的不太建议做)+660(一遍且错题反复做理解概念)+ 严选题(刷了两遍,错题3遍以上) + 880(暑期回来880的高数做了一遍,题目感觉比1800难比严选简单) + 330 +张宇1000题线面积分部分大概100题这样后期每天2-3题 + 后期武老师每日一题</p><p><strong>线代视频:</strong> 一开始就对线代很有信心,学的比较马虎,后期吃了不少苦头,李永乐老爷子主推,张宇线代讲的还行也可以听,主要要记住大概什么题型用什么方法,特征值这些要记得很牢,想到就能秒解</p><p><strong>线代题目:</strong> 660(线代部分前期打基础写,偏简单) + 李老爷子线代强化的配套练习题 + 880线代部分(必须做,难死我了) + 330 </p><p><strong>概率论视频:</strong> 俺不知道方浩他们教的咋样,这个只跟了森哥,我只能说听的懂,概率论给我的感觉比高数难理解,学的很痛苦,题目有的也很难,不能掉以轻心。</p><p><strong>概率论题目:</strong> 660概率论部分 + 余斌森的书配套习题(做了两遍,做扎实了) + 880(选了掌握不太好的部分做) + 330</p><p><strong>模拟卷:</strong> 张宇8(搞心态)+4(🐏了有的大题没写) 李永乐套卷(偏简单) + 余斌森(难!选择题把我对象做的崩溃了 天天要整理笔记给她!) + 超越卷(今年质量下降) + 李林6+4(必做) + 武忠祥两套高数卷</p><h2 id="2-英语一-86分"><a href="#2-英语一-86分" class="headerlink" title="2. 英语一 86分"></a>2. 英语一 86分</h2><p>英语四级549分 六级第一次没过(听力太烂) 第二次449飘过</p><p>准备前问了上一届的学长,给的建议是,英语一定要好好学,会有回报的,这不今年86分,回报来啦!当然如果像某些变态女朋友,天天英语学1个小时多一点,最后也85分,当我没说(20分钟400个单词 求我心理阴影面积!)</p><p><strong>复习方法:</strong> </p><p><strong>单词</strong> :</p><p>2-4月每天60-100个生词+复习(不背单词值得用,别的软件没用过不加评价)</p><p>4-6月重写开单词本100-150个生词+复习</p><p>7月之后,中后期每天就是带着背,每天都要背,那怕那天出去放松也要背,单词不能断!后期快的话一天200生词+200复习的45分钟就够 啦!单词牢固了,英语分不会太差!</p><p><strong>基础:</strong> </p><p>我听了田静的语法课,我的评价是效果因人而异,基础稍微好一点可以不听,主要是为了学会翻译句子,提高阅读水平,每日一句的翻译必跟!</p><p><strong>真题:</strong> </p><p>我大概4月中旬开了真题,每天2-3篇阅读理解,做的很差的有尝试过精翻(时间花费太大,翻了四五次就不翻了),但是不会的单词还是会圈出来,加入不背单词的生词本以后复习用。</p><p>暑期二刷了真题的阅读理解,英语一2010年的真的很难,做不好别灰心!这个时候大概就能保住四篇错在4个以内了!当然大佬这个时候都只错两个的且是一刷。真题阅读理解确实很重要,有不会的地方可以去听听唐迟老师的课还有monkey老师的课(虽然有的时候我真的就觉得题目有问题,不是我的问题!)</p><p>暑期回来冲刺差不多要开始三刷了,这个时间就不能只做阅读理解部分了,翻译可以往后靠,但是每天1-2个阅读理解的同时,也要把新题型或者完形填空带上了!新题型排序觉得难的话可以听一下宋逸轩老师的课(不长,或许有帮助)</p><p><strong>张剑80篇:</strong></p><p>关于张剑80篇,网上褒贬不一吧,后期因为觉得真题刷了太多遍,做的时候已经有点答案的影响,效果不好,反复考虑,拖着对象做了这个网上大家并不推荐的阅读理解,做的感觉明显就是词汇量超纲,但是如果能读懂的话做起来就不是很难,我们成绩出来后的总结是,这个习题册很适合23考研的英语一,感觉最好一个86分一个85分,考试题目难但是发挥稳定有它的功劳!只做真题,碰到难的文章可能就抓瞎了!</p><p><strong>作文:</strong></p><p>我强烈推荐石雷鹏(就是烧时间,带着练),学到最后什么模板啥的,都不用背,自己慢慢就总结出来属于自己的模板了!就<strong>跟着练</strong>,他每天会带着你写作文,写着写着你就有货了!</p><p>对象跟的周思成,她的建议是不用听课(太叽叽喳喳了,我尝试听过,听不进去),但是有的万能诡辩模板可以稍微背一下!</p><p>最后,对象英语好的话或者一起备考的小伙伴英语好的话,可以麻烦她帮忙改一下英语作文,实在不写微软爱写作的小程序用起来!至少可以发现语法错误。</p><h2 id="3-政治-73分"><a href="#3-政治-73分" class="headerlink" title="3. 政治 73分"></a>3. 政治 73分</h2><p><strong>强化:</strong></p><p>8月份开始开刚刚好,没有基础直接跟徐涛的强化班,带着听,学累了就听,甚至可以吃饭时候听</p><p>复习路线大致 马原理–>史纲–>毛中特–>思修–>当代</p><p>我学习的时候,马原部分记了笔记本,但是感觉作用不大,可以选择直接在书上做,然后一些总结可以自己做一下确实有助于强化记忆</p><p>比如会议的总结</p><p>每学完一章就可以做一下肖秀荣一章的1000题,u1s1,学政治是考研期间最放松的时期了(出去按摩除外)!</p><p><strong>腿姐技巧班:</strong></p><p>腿姐技巧班开始就可以听课了,主要是听她的题目总结,选择题的技巧肯定是要听的,但是不能全信,23届考研如果信了技巧就栽跟头了,综合我们宿舍五人考研一个上岸南邮 四个东南的意见,技巧班是放松时候听的,主要还是记冲刺背诵手册,技巧也就图一乐,拿分还是靠背!</p><p>相比与选择题的技巧,个人觉得腿姐最拿得出手的其实是<strong>点默析答题法</strong>,个人感觉大题严格按照这个套路答题还是对自己的分数有所提高的!</p><p><strong>背书和题目:</strong></p><p><strong>腿姐背诵手册:</strong></p><p>选择题今年可能翻车,被反押题了,但是依然要多读,争取有个影响,考试考到就是分</p><p>11月份就要开始把后面的选择题重点考点放入背诵的计划中每天尽量多背一点,然后就是马原理一定要好好背!这个必考的24个都背不为过!</p><p><strong>肖秀荣:</strong></p><p>11月份肖八发货,就开始根据肖老师的选择题针对背诵一些时政,选择题好好做,30+的分不要灰心很正常,做完就背。简答题可以先看看不写,马原部分可以尝试写写。这个可以看看网上博主的建议,政治时间很松,而且后期确实有大部分时间都花在政治上。</p><p>肖老师今年发挥还行,就是压的都在后面肖三肖四两个试卷上了,所以12月份开始,肖四一定就要开始背啊!!!不要拖,不要说后面抽一天背,你不知道后面会发生什么!我🐏了,肖三肖四没背完,在宾馆的床上背不动,真的后悔!</p><p>最后的一点建议是: 有个微博博主叫西西爱政治 会总结政治背的东西,可以看看!</p><h2 id="4-专业课-130"><a href="#4-专业课-130" class="headerlink" title="4. 专业课 130"></a>4. 专业课 130</h2><p><strong>计网:</strong></p><p>前期:</p><p>本人一直在线,正常复习,前期王道视频课或者湖科大视频课(有时间的两个都看),重点还是网络层传输层的知识,其余的大多数是背诵能力</p><p>中后期:</p><p>重复的看谢书,可能完完整整看了有3-4遍吧,过程很枯燥,但是真的很有用,自己去尝试整理知识点,可以用markdown这些记笔记,慢慢脑子里有体系,学起来就轻松了。然后就是看书的时候,也要写题,不然很久不写,突然写选择真的挺痛苦的。</p><p>题目: 王道计算机网络考研复习指导(3刷) + 考研资料群的资料 + 自己找的计网习题 + 天勤计算机网络习题 + 王道计算机考试配套习题(计网部分)</p><p><strong>数据结构:</strong></p><p>前期:</p><p>王道数据结构视频课(这里推荐使用ACFUN,我当时是有新的视频课的),前期没有扣代码,重点还是概念的理解,抓住选择题和简答题的分</p><p>中期:</p><p>我没有选择继续听课,数据结构没有花很长时间,后面大概每天3个小时专业课,各1个半小时,做做选择和简答题。然后到11月份开始死扣代码题,一天2-3题(虽然最后没考)。但是今年考了读程题,感觉24考研考代码题的概率还是很大的,可以买个罗技k580自己在平板上配个环境敲!</p><p>题目: 王道数据结构考研复习指导(3刷) + 考研资料群的资料 + 天勤数据结构习题 + 王道计算机考试配套习题(数据结构部分)</p><h2 id="5-关于学习和恋爱"><a href="#5-关于学习和恋爱" class="headerlink" title="5. 关于学习和恋爱"></a>5. 关于学习和恋爱</h2><p>考研期间谈恋爱的确会分散一部分学习的时间(我们两个还好,都比较愿意一起去自习室学习,没有花费太长的时间),但是我个人觉得恋爱和考研不算冲突,在考研期间的生活确实比较枯燥,我会选择吃完饭和女朋友一起散步缓解压力(准确的说两个人逃避考研教室压抑的氛围),也会突然决定摆烂一天按个摩(不可以多,偶尔偶尔啊!),当然最好的地方就是每天吃饭啥的,都有一个人陪在身边,一起讨论学习上的事情也很有意思,比如因为一道数学题差点吵了起来!还有,最后大家都🐏了,也是互相支撑这彼此度过这段蛮有意义的时光。</p><p>当然有利必然有弊,考研期间大家的压力都很大,也会因为心情上的低落,在一些小事情上爆发争端,甚至emmm差点差点懂得都懂,但是我觉得如果能够两个人互相帮助,我教你数学,你帮我补英语,那么两个人一起上岸才是最帅的好吧!</p><h1 id="三-复试准备"><a href="#三-复试准备" class="headerlink" title="三. 复试准备"></a>三. 复试准备</h1><p>等拟录取出来再更新..</p>]]></content>
<categories>
<category> 成长 </category>
</categories>
<tags>
<tag> 成长 </tag>
</tags>
</entry>
<entry>
<title>一些C++小记</title>
<link href="/2023/03/22/c++/"/>
<url>/2023/03/22/c++/</url>
<content type="html"><![CDATA[<h1 id="一-排序模板"><a href="#一-排序模板" class="headerlink" title="一 排序模板"></a>一 排序模板</h1><h2 id="1-直接插入排序"><a href="#1-直接插入排序" class="headerlink" title="1. 直接插入排序"></a>1. 直接插入排序</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">InsertSort</span><span class="params">(T arr[],<span class="type">int</span> n)</span> </span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i < n; i++) {</span><br><span class="line">T temp; <span class="comment">// 临时存放T类型变量</span></span><br><span class="line"><span class="type">int</span> j = <span class="number">0</span>;</span><br><span class="line">temp = arr[i];</span><br><span class="line"><span class="keyword">while</span> (arr[j] < temp && j < i) {</span><br><span class="line">j++;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> k = i; k >= j; k--) {</span><br><span class="line">arr[k] = arr[k<span class="number">-1</span>];</span><br><span class="line">}</span><br><span class="line">arr[j] = temp;</span><br><span class="line"><span class="built_in">output</span>(arr,n );</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-直接选择排序"><a href="#2-直接选择排序" class="headerlink" title="2. 直接选择排序"></a>2. 直接选择排序</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">selectionSort</span><span class="params">(T arr[], <span class="type">int</span> n)</span> </span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < n<span class="number">-1</span>; i++) {</span><br><span class="line"><span class="type">int</span> minIndex = i;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = i; j < n; j++) {</span><br><span class="line"><span class="keyword">if</span> (arr[j] < arr[minIndex]) {</span><br><span class="line">minIndex = j;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">T temp = arr[minIndex];</span><br><span class="line">arr[minIndex] = arr[i];</span><br><span class="line">arr[i] = temp;</span><br><span class="line"><span class="built_in">output</span>(arr, n);</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="3-气泡排序"><a href="#3-气泡排序" class="headerlink" title="3. 气泡排序"></a>3. 气泡排序</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">swap</span><span class="params">(T *a,T *b)</span> </span>{</span><br><span class="line">T temp = *a;</span><br><span class="line">*a = *b;</span><br><span class="line">*b = temp;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">bubbleSort</span><span class="params">(T arr[], <span class="type">int</span> n)</span> </span>{</span><br><span class="line"><span class="type">bool</span> flag = <span class="literal">false</span>;</span><br><span class="line"><span class="type">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i; i < n; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < n <span class="number">-1</span> - i; j++) {</span><br><span class="line"><span class="keyword">if</span> (arr[j] > arr[j + <span class="number">1</span>]) {</span><br><span class="line"><span class="built_in">swap</span>(&arr[j], &arr[j + <span class="number">1</span>]);</span><br><span class="line">flag = <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="built_in">output</span>(arr, n);</span><br><span class="line"><span class="keyword">if</span> (!flag) {</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="二-查找模板"><a href="#二-查找模板" class="headerlink" title="二 查找模板"></a>二 查找模板</h1><h2 id="1-顺序查找"><a href="#1-顺序查找" class="headerlink" title="1. 顺序查找"></a>1. 顺序查找</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">seqSearch</span><span class="params">(<span class="type">const</span> T list[], <span class="type">int</span> n, <span class="type">const</span> T &key)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < n; i++) {</span><br><span class="line"><span class="keyword">if</span> (list[i] == key)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-折半查找"><a href="#2-折半查找" class="headerlink" title="2. 折半查找"></a>2. 折半查找</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">binSearch</span><span class="params">(<span class="type">const</span> T list[],<span class="type">int</span> min ,<span class="type">int</span> max, <span class="type">const</span> T &key)</span> </span>{</span><br><span class="line"><span class="keyword">if</span> (min > max) {</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">}</span><br><span class="line"><span class="type">int</span> mid = (min + max) / <span class="number">2</span>;</span><br><span class="line"><span class="keyword">if</span> (list[mid] == key) {</span><br><span class="line"><span class="keyword">return</span> mid;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (list[mid] > key) {</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">binSearch</span>(list, min, mid - <span class="number">1</span>,key);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">binSearch</span>(list, mid + <span class="number">1</span>, max, key);</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">binSearch_2</span><span class="params">(<span class="type">const</span> T list[], <span class="type">int</span> n, <span class="type">const</span> T &key)</span> </span>{</span><br><span class="line"><span class="type">int</span> low = <span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> high = n - <span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span> (low <= high) {</span><br><span class="line"><span class="type">int</span> mid = (low + high) / <span class="number">2</span>;</span><br><span class="line"><span class="keyword">if</span> (list[mid] == key) {</span><br><span class="line"><span class="keyword">return</span> mid;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (list[mid] < key)</span><br><span class="line">low = mid + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">high = mid - <span class="number">1</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="第六章"><a href="#第六章" class="headerlink" title="第六章"></a>第六章</h1><ol><li>6-21读取字符串统计英文字母个数</li></ol><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iomanip></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><fstream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><sstream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><fstream></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="function">ifstream <span class="title">in</span><span class="params">(<span class="string">"C:/Users/lenovo/Desktop/abc.txt"</span>,ios_base::binary | ios_base::in)</span></span>;</span><br><span class="line"><span class="function">ofstream <span class="title">os</span><span class="params">(<span class="string">"C:/Users/lenovo/Desktop/abc.txt"</span>, ios_base::binary | ios_base::out)</span></span>;</span><br><span class="line">string str;</span><br><span class="line"><span class="built_in">getline</span>(cin, str);</span><br><span class="line">os << str;</span><br><span class="line">os.<span class="built_in">close</span>();</span><br><span class="line">string get_s;</span><br><span class="line"><span class="built_in">getline</span>(in,get_s);</span><br><span class="line">in.<span class="built_in">close</span>();</span><br><span class="line">cout << get_s;</span><br><span class="line"><span class="type">char</span> *c = &get_s[<span class="number">0</span>];</span><br><span class="line"><span class="type">int</span> count = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (*c) {</span><br><span class="line"><span class="keyword">if</span> ((*c >= <span class="string">'A'</span>) && (*c <= <span class="string">'z'</span>)) {</span><br><span class="line">count++;</span><br><span class="line">}</span><br><span class="line">c++;</span><br><span class="line">}</span><br><span class="line">cout << <span class="string">"count: "</span><< count;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ol start="2"><li><p>6-22 字符串递归逆置</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iomanip></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">reverse</span><span class="params">(string &s,<span class="type">int</span> n)</span> </span>{</span><br><span class="line"><span class="type">static</span> <span class="type">int</span> a = <span class="number">0</span>; <span class="comment">//重要</span></span><br><span class="line"><span class="keyword">if</span> (n / <span class="number">2</span> <= a ) {</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line"><span class="type">char</span> temp = s[a];</span><br><span class="line">s[a] = s[n - a <span class="number">-1</span>];</span><br><span class="line">s[n -a <span class="number">-1</span>] = temp;</span><br><span class="line">a++;</span><br><span class="line"><span class="built_in">reverse</span>(s,n);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">string a = <span class="string">"12345"</span>;</span><br><span class="line"><span class="built_in">reverse</span>(a, a.<span class="built_in">length</span>());</span><br><span class="line">cout << a;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>6-26 矩阵转置</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><ctime></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><stdlib.h></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iomanip></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> row;</span><br><span class="line"><span class="type">int</span> arrange;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">output</span><span class="params">(<span class="type">int</span> *p,<span class="type">int</span> row, <span class="type">int</span> arrange)</span> </span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < row; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < arrange; j++) {</span><br><span class="line">cout << <span class="built_in">setw</span>(<span class="number">4</span>)<< p[i*arrange + j];</span><br><span class="line">}</span><br><span class="line">cout << endl;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">transfom</span><span class="params">(<span class="type">int</span> *p)</span> </span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < row; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = i; j < arrange; j++) {</span><br><span class="line"><span class="type">int</span> temp = p[i*row + j];</span><br><span class="line">p[i*row + j] = p[j*arrange + i];</span><br><span class="line">p[j*arrange + i] = temp;</span><br><span class="line">}</span><br><span class="line">cout << endl;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">cout << <span class="string">"输入行和列"</span> << endl;</span><br><span class="line">cin >> row >> arrange;</span><br><span class="line"><span class="type">int</span> *matrxi = <span class="keyword">new</span> <span class="type">int</span>[row * arrange];</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < row; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < arrange; j++) {</span><br><span class="line">matrxi[i*arrange + j] = <span class="built_in">rand</span>()%<span class="number">20</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="built_in">output</span>(matrxi,row,arrange);</span><br><span class="line"><span class="built_in">transfom</span>(matrxi);</span><br><span class="line"><span class="built_in">output</span>(matrxi, arrange, row);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>基于char*设计一个字符串类<code>Mystring</code>,并且具有构造函数,析构函数,赋值构造函数,重载运算符等</p></li></ol><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyString</span> {</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="type">char</span> *data;</span><br><span class="line"><span class="type">unsigned</span> <span class="type">short</span> len;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="built_in">MyString</span>();</span><br><span class="line"><span class="built_in">MyString</span>(<span class="type">unsigned</span> <span class="type">short</span>);</span><br><span class="line"><span class="built_in">MyString</span>(<span class="type">const</span> <span class="type">char</span> *s);</span><br><span class="line"><span class="built_in">MyString</span>(<span class="type">const</span> MyString &s);</span><br><span class="line">~<span class="built_in">MyString</span>();</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">const</span> <span class="type">unsigned</span> <span class="type">short</span> <span class="title">getLen</span><span class="params">()</span> <span class="type">const</span> </span>{ <span class="keyword">return</span> len; } <span class="comment">//返回长度</span></span><br><span class="line"><span class="function"><span class="type">const</span> <span class="type">char</span> *<span class="title">getString</span><span class="params">()</span> <span class="type">const</span> </span>{ <span class="keyword">return</span> data; }</span><br><span class="line">MyString& <span class="keyword">operator</span> +(<span class="type">const</span> MyString &rhs);</span><br><span class="line">MyString& <span class="keyword">operator</span>=(<span class="type">const</span> MyString &rhs);</span><br><span class="line"><span class="type">char</span> <span class="keyword">operator</span>[] (<span class="type">unsigned</span> <span class="type">short</span> offset) <span class="type">const</span>;</span><br><span class="line"><span class="type">char</span>& <span class="keyword">operator</span> [](<span class="type">unsigned</span> <span class="type">short</span> offset);</span><br><span class="line">};</span><br><span class="line">MyString::<span class="built_in">MyString</span>() {</span><br><span class="line">len = <span class="number">0</span>;</span><br><span class="line">data = <span class="keyword">new</span> <span class="type">char</span>[<span class="number">1</span>];</span><br><span class="line">data[<span class="number">0</span>] = <span class="string">'\0'</span>;</span><br><span class="line">}</span><br><span class="line">MyString::<span class="built_in">MyString</span>(<span class="type">unsigned</span> <span class="type">short</span> len) {</span><br><span class="line">data = <span class="keyword">new</span> <span class="type">char</span>[len + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i <= len; i++) {</span><br><span class="line">data[i] = <span class="string">'\0'</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">this</span>->len = len;</span><br><span class="line">}</span><br><span class="line">MyString::<span class="built_in">MyString</span>(<span class="type">const</span> <span class="type">char</span> *s) {</span><br><span class="line">len = (<span class="type">int</span>)<span class="built_in">strlen</span>(s);</span><br><span class="line">data = <span class="keyword">new</span> <span class="type">char</span>[len];</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < len; i++) {</span><br><span class="line">data[i] = s[i];</span><br><span class="line">}</span><br><span class="line">data[len] = <span class="string">'\0'</span>;</span><br><span class="line">}</span><br><span class="line">MyString::<span class="built_in">MyString</span>(<span class="type">const</span> MyString &s) {</span><br><span class="line">len = s.<span class="built_in">getLen</span>();</span><br><span class="line">data = <span class="keyword">new</span> <span class="type">char</span>[len];</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < len; i++) {</span><br><span class="line">data[i] = s[i];</span><br><span class="line">}</span><br><span class="line">data[len] = <span class="string">'\0'</span>;</span><br><span class="line">}</span><br><span class="line">MyString::~<span class="built_in">MyString</span>() {</span><br><span class="line"><span class="keyword">delete</span>[] data;</span><br><span class="line">len = <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"><span class="type">char</span> MyString::<span class="keyword">operator</span>[](<span class="type">unsigned</span> <span class="type">short</span> offset) <span class="type">const</span>{</span><br><span class="line"><span class="keyword">if</span> (offset > len) {</span><br><span class="line"><span class="keyword">return</span> data[len - <span class="number">1</span>];</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line"><span class="keyword">return</span> data[offset];</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="type">char</span>& MyString::<span class="keyword">operator</span> [](<span class="type">unsigned</span> <span class="type">short</span> offset) {</span><br><span class="line"><span class="keyword">if</span> (offset > len) {</span><br><span class="line"><span class="keyword">return</span> data[len - <span class="number">1</span>];</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line"><span class="keyword">return</span> data[offset];</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">MyString& MyString::<span class="keyword">operator</span>+(<span class="type">const</span> MyString &rhs) {</span><br><span class="line"><span class="type">unsigned</span> <span class="type">short</span> totalLen = len + rhs.<span class="built_in">getLen</span>();</span><br><span class="line"><span class="function">MyString <span class="title">temp</span><span class="params">(totalLen)</span></span>;</span><br><span class="line"><span class="type">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i; i < len; i++) {</span><br><span class="line">temp[i] = data[i];</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j < rhs.<span class="built_in">getLen</span>(); j++, i++) {</span><br><span class="line">temp[i] = rhs[j];</span><br><span class="line">}</span><br><span class="line">temp[totalLen] = <span class="string">'\0'</span>;</span><br><span class="line"><span class="keyword">return</span> temp;</span><br><span class="line">}</span><br><span class="line">MyString& MyString::<span class="keyword">operator</span>=(<span class="type">const</span> MyString &rhs) {</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span> == &rhs) {</span><br><span class="line"><span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">delete</span>[] data;</span><br><span class="line">len = rhs.<span class="built_in">getLen</span>();</span><br><span class="line">data = <span class="keyword">new</span> <span class="type">char</span>[len + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">for</span> (<span class="type">unsigned</span> <span class="type">short</span> i = <span class="number">0</span>; i < len; i++) {</span><br><span class="line">data[i] = rhs[i];</span><br><span class="line">}</span><br><span class="line">data[len] = <span class="string">'\0'</span>;</span><br><span class="line"><span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">MyString <span class="title">s1</span><span class="params">(<span class="string">"SEU!"</span>)</span></span>;</span><br><span class="line">MyString s2;</span><br><span class="line">s2 = <span class="string">"ilike"</span>;</span><br><span class="line">MyString s3 = s2 + s1;</span><br><span class="line">cout << s3.<span class="built_in">getString</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="第八章"><a href="#第八章" class="headerlink" title="第八章"></a>第八章</h1><ol><li>时钟类重载</li></ol><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">设计一个时钟类,能够记录时、分、秒,重载它的++运算符,每执行一次++运算,加时1秒,但要使计时过程能够自动进位。</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Time</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="built_in">Time</span>(<span class="type">int</span> h = <span class="number">0</span>, <span class="type">int</span> m = <span class="number">0</span>, <span class="type">int</span> s = <span class="number">0</span>) {</span><br><span class="line">hour = h;</span><br><span class="line">minute = m;</span><br><span class="line">second = s;</span><br><span class="line">}</span><br><span class="line">Time& <span class="keyword">operator</span>++();</span><br><span class="line">Time <span class="keyword">operator</span>++(<span class="type">int</span>);</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">showTime</span><span class="params">()</span> </span>{</span><br><span class="line">cout << <span class="string">"当前时间为:"</span> << hour << <span class="string">":"</span> << minute << <span class="string">":"</span> << second << endl;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="type">int</span> hour, minute, second;</span><br><span class="line"></span><br><span class="line">};</span><br><span class="line">Time Time::<span class="keyword">operator</span>++(<span class="type">int</span>) {</span><br><span class="line">Time tmp = *<span class="keyword">this</span>;</span><br><span class="line">++(*<span class="keyword">this</span>);</span><br><span class="line"><span class="keyword">return</span> tmp;</span><br><span class="line">}</span><br><span class="line">Time& Time::<span class="keyword">operator</span>++() {</span><br><span class="line">++second;</span><br><span class="line"><span class="keyword">if</span> (second == <span class="number">60</span>) {</span><br><span class="line">second = <span class="number">0</span>;</span><br><span class="line">++minute;</span><br><span class="line"><span class="keyword">if</span> (minute == <span class="number">60</span>) {</span><br><span class="line">minute = <span class="number">0</span>;</span><br><span class="line">hour++;</span><br><span class="line"><span class="keyword">if</span> (hour == <span class="number">24</span>) {</span><br><span class="line">hour = <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span> <span class="type">const</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="function">Time <span class="title">t</span><span class="params">(<span class="number">23</span>, <span class="number">59</span>, <span class="number">59</span>)</span></span>;</span><br><span class="line">t.<span class="built_in">showTime</span>();</span><br><span class="line">(t++).<span class="built_in">showTime</span>();</span><br><span class="line">(++t).<span class="built_in">showTime</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ol start="2"><li><p>重载complex类 <code><<</code></p><ul><li><p><<左操作数为<code>ostream</code>类型的引用,<code>ostream</code>是<code>cout</code>的基类执行</p><p><code>cout<<c1</code>——-><code>operator<<(cout,c1)</code></p></li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><iostream></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Complex</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="built_in">Complex</span>() { real = <span class="number">0</span>; imag = <span class="number">0</span>; }</span><br><span class="line"><span class="built_in">Complex</span>(<span class="type">double</span> r, <span class="type">double</span> i) :<span class="built_in">real</span>(r), <span class="built_in">imag</span>(i) {}</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">display</span><span class="params">()</span></span>;</span><br><span class="line">Complex <span class="keyword">operator</span> + (Complex &c);</span><br><span class="line">Complex <span class="keyword">operator</span> + (<span class="type">int</span> &i); </span><br><span class="line"><span class="keyword">friend</span> Complex <span class="keyword">operator</span> + (<span class="type">int</span> &, Complex &); <span class="comment">// i + c</span></span><br><span class="line"><span class="keyword">friend</span> ostream & <span class="keyword">operator</span> << (ostream &out, <span class="type">const</span> Complex &c);</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="type">double</span> real; <span class="comment">// 复数实部</span></span><br><span class="line"><span class="type">double</span> imag; <span class="comment">// 复数虚部</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">Complex Complex::<span class="keyword">operator</span> + (Complex &c)</span><br><span class="line">{</span><br><span class="line">cout << <span class="string">"Complex operator + (Complex &c)"</span> << endl;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">Complex</span>(real + c.real, imag + c.imag);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">Complex Complex::<span class="keyword">operator</span> + (<span class="type">int</span> &i)</span><br><span class="line">{</span><br><span class="line">cout << <span class="string">"Complex operator + (int &i)"</span> << endl;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">Complex</span>(real + i, imag);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">Complex <span class="keyword">operator</span> + (<span class="type">int</span> &i, Complex &c)</span><br><span class="line">{</span><br><span class="line">cout << <span class="string">"Complex operator + (int &i, Complex &c)"</span> << endl;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">Complex</span>(i + c.real, c.imag);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Complex::display</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">cout << <span class="string">"("</span> << real << <span class="string">", "</span> << imag << <span class="string">")"</span> << endl;</span><br><span class="line">}</span><br><span class="line">ostream & <span class="keyword">operator</span> <<(ostream &out, <span class="type">const</span> Complex &c) {</span><br><span class="line">out << c.real << <span class="string">"+"</span> << c.imag << endl;</span><br><span class="line"><span class="keyword">return</span> out;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="function">Complex <span class="title">c1</span><span class="params">(<span class="number">5</span>, <span class="number">-2</span>)</span>, <span class="title">c2</span><span class="params">(<span class="number">-4</span>, <span class="number">3</span>)</span>, c3</span>;</span><br><span class="line"><span class="type">int</span> i = <span class="number">6</span>;</span><br><span class="line">c3 = c1 + i;</span><br><span class="line">cout << <span class="string">"c1 + i = "</span>;</span><br><span class="line">c3.<span class="built_in">display</span>();</span><br><span class="line">c3 = i + c1;</span><br><span class="line">cout << <span class="string">"i + c1 = "</span>;</span><br><span class="line">c3.<span class="built_in">display</span>();</span><br><span class="line">c3 = c1 + c2;</span><br><span class="line">cout << <span class="string">" c1 + c2 = "</span>;</span><br><span class="line">cout << c3;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">"pause"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>例题8-4 重写<code><<</code>和<code>+</code> <code>前++</code>和<code>后++</code></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><fstream></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Counter</span> {</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="type">int</span> count;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="built_in">Counter</span>() :<span class="built_in">count</span>(<span class="number">0</span>) { }</span><br><span class="line"><span class="built_in">Counter</span>(<span class="type">int</span> num):<span class="built_in">count</span>(num) { }</span><br><span class="line"><span class="keyword">friend</span> ostream& <span class="keyword">operator</span> <<(ostream &out, <span class="type">const</span> Counter &c);</span><br><span class="line">Counter <span class="keyword">operator</span> +(<span class="type">int</span> num);</span><br><span class="line">Counter <span class="keyword">operator</span> ++();<span class="comment">//前置++</span></span><br><span class="line">Counter <span class="keyword">operator</span> ++(<span class="type">int</span>); <span class="comment">//后置++</span></span><br><span class="line">};</span><br><span class="line">Counter Counter::<span class="keyword">operator</span>+(<span class="type">int</span> num){</span><br><span class="line">count += num;</span><br><span class="line"><span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">}</span><br><span class="line">ostream& <span class="keyword">operator</span> <<(ostream &out, <span class="type">const</span> Counter &c) {</span><br><span class="line">out << <span class="string">"Count: "</span> << c.count << endl;</span><br><span class="line"><span class="keyword">return</span> out;</span><br><span class="line">}</span><br><span class="line">Counter Counter::<span class="keyword">operator</span>++() {</span><br><span class="line">count++;</span><br><span class="line"><span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">}</span><br><span class="line">Counter Counter::<span class="keyword">operator</span>++(<span class="type">int</span>){</span><br><span class="line">Counter old = *<span class="keyword">this</span>;</span><br><span class="line">++(*<span class="keyword">this</span>);</span><br><span class="line"><span class="keyword">return</span> old;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">Counter <span class="title">c1</span><span class="params">(<span class="number">10</span>)</span></span>;</span><br><span class="line">c1 = c1 + <span class="number">5</span>;</span><br><span class="line">cout << c1 << endl;</span><br><span class="line">cout << c1++ << endl;</span><br><span class="line">cout << ++c1 << endl;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol><h1 id="2010"><a href="#2010" class="headerlink" title="2010"></a>2010</h1><h2 id="1-输入n个十进制数转换成二进制写到文件"><a href="#1-输入n个十进制数转换成二进制写到文件" class="headerlink" title="1. 输入n个十进制数转换成二进制写到文件"></a>1. 输入n个十进制数转换成二进制写到文件</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><numeric></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><fstream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><string></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function">string <span class="title">toBinary</span><span class="params">(<span class="type">int</span> d)</span> </span>{</span><br><span class="line">string s;</span><br><span class="line"><span class="keyword">if</span> (d == <span class="number">0</span>) {</span><br><span class="line"><span class="keyword">return</span> <span class="string">"0"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">while</span> (d) {</span><br><span class="line">s += (d % <span class="number">2</span>) ? <span class="string">"1"</span> : <span class="string">"0"</span>;</span><br><span class="line">d /= <span class="number">2</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> s;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="function">ofstream <span class="title">os</span><span class="params">(<span class="string">"C:/Users/lenovo/Desktop/te.txt"</span>, ios::binary | ios::out)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (!os) {</span><br><span class="line">cout << <span class="string">"File cannot be opened!"</span> << endl;</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">}</span><br><span class="line"><span class="type">int</span> n;</span><br><span class="line"><span class="keyword">do</span> {</span><br><span class="line">cout << <span class="string">"Enter the number!"</span> << endl;</span><br><span class="line">cin >> n;</span><br><span class="line">string s = <span class="built_in">toBinary</span>(n);</span><br><span class="line">os << s << endl;</span><br><span class="line">} <span class="keyword">while</span> (n != <span class="number">0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-写两个模板函数-插入排序算法的迭代和递归实现"><a href="#2-写两个模板函数-插入排序算法的迭代和递归实现" class="headerlink" title="2. 写两个模板函数:插入排序算法的迭代和递归实现"></a>2. 写两个模板函数:插入排序算法的迭代和递归实现</h2><ol><li>迭代</li></ol><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">output</span><span class="params">(T a[])</span> </span>{</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < <span class="number">5</span>; i++) {</span><br><span class="line">cout << a[i] << <span class="string">"\t"</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">template</span><<span class="keyword">class</span> T></span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">insertSort</span><span class="params">(T arr[], <span class="type">int</span> n)</span> </span>{</span><br><span class="line"><span class="type">int</span> i = <span class="number">0</span>,j = <span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> minVal_index = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i; i < n; i++) {</span><br><span class="line">minVal_index = i;</span><br><span class="line"><span class="keyword">for</span> (j = i; j < n; j++) {</span><br><span class="line"><span class="keyword">if</span> (arr[minVal_index] > arr[j])</span><br><span class="line">minVal_index = j;</span><br><span class="line">}</span><br><span class="line">j = minVal_index;</span><br><span class="line">T temp = arr[minVal_index];</span><br><span class="line"><span class="keyword">while</span>(j > i) {</span><br><span class="line">arr[j] = arr[j<span class="number">-1</span>];</span><br><span class="line">j--;</span><br><span class="line">}</span><br><span class="line">arr[i] = temp;</span><br><span class="line"><span class="built_in">output</span>(arr);</span><br><span class="line">cout << endl;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="type">int</span> a[<span class="number">5</span>] = { <span class="number">3</span>,<span class="number">2</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">1</span> };</span><br><span class="line"><span class="built_in">insertSort</span>(a, <span class="number">5</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="3-字符串解析"><a href="#3-字符串解析" class="headerlink" title="3. 字符串解析"></a>3. 字符串解析</h2><ul><li>文件内有<code>(010)(150123456789)|123|(430070)</code></li><li>按照以下格式输出”区号|电话号码|城市编号|邮编”</li></ul><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><fstream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><sstream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><string></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><iomanip></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">//(010)(150123456789)|123|(430070)</span></span><br><span class="line"><span class="function">ifstream <span class="title">in</span><span class="params">(<span class="string">"C:/Users/lenovo/Desktop/te.txt"</span>, ios::binary | ios::in)</span></span>;</span><br><span class="line">string origin_data;</span><br><span class="line"><span class="built_in">getline</span>(in, origin_data); <span class="comment">//读取文件</span></span><br><span class="line">cout << <span class="built_in">setw</span>(<span class="number">15</span>) << <span class="string">"区号"</span> << <span class="built_in">setw</span>(<span class="number">15</span>) << <span class="string">"电话号码"</span> << <span class="built_in">setw</span>(<span class="number">15</span>) << <span class="string">"城市编号"</span> << <span class="built_in">setw</span>(<span class="number">15</span>) << <span class="string">"邮编"</span> << endl;</span><br><span class="line">string id = <span class="string">""</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> a : origin_data) {</span><br><span class="line"><span class="keyword">if</span> (a != <span class="string">'('</span> && a != <span class="string">')'</span> && a != <span class="string">'|'</span>) {</span><br><span class="line">id+=a;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line"><span class="keyword">if</span> (id.<span class="built_in">length</span>()) {</span><br><span class="line">cout << <span class="built_in">setw</span>(<span class="number">15</span>) << id;</span><br><span class="line">id.<span class="built_in">clear</span>();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> 杂记 </category>
</categories>
<tags>
<tag> 杂记 </tag>
</tags>
</entry>
<entry>
<title>ThinkPHP5.0.X框架SQL注入漏洞</title>
<link href="/2023/03/21/TP5sql/"/>
<url>/2023/03/21/TP5sql/</url>
<content type="html"><![CDATA[<h1 id="ThinkPHP5-0-X框架SQL注入漏洞"><a href="#ThinkPHP5-0-X框架SQL注入漏洞" class="headerlink" title="ThinkPHP5.0.X框架SQL注入漏洞"></a>ThinkPHP5.0.X框架SQL注入漏洞</h1><h2 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h2><ol><li>自己还没有用composer,所以先用了phpstudy简答的搭建了一下环境</li></ol><h3 id="1-mysql创建数据"><a href="#1-mysql创建数据" class="headerlink" title="1. mysql创建数据"></a>1. mysql创建数据</h3><ol><li><p><code>create database thinkphp</code> 创建一个名为thinkphp的数据库</p></li><li><p><code>create table users(id int auto_increment primary key,username varchar(20),password varchar(30));</code>创建一个users表里面的段名为id,username,password,其中id设置为主键</p></li><li><p>接着插入数据<code>Insert into users(id,username,password) values(1,'xbx_0d','tobebetter');</code></p></li></ol><h3 id="2-ThinkPHP基础配置"><a href="#2-ThinkPHP基础配置" class="headerlink" title="2. ThinkPHP基础配置"></a>2. ThinkPHP基础配置</h3><p>没学过ThinkPHP的同学可以参考上面提供的第一个资料</p><p> 1.开启debug模式</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637311762253-4de65fb5-83b3-428a-9bdf-b7e34002cb26.png" alt="img"></p><p> 2.配置database文件</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637311910223-af6050fa-8125-4b81-97a4-32ad5a581558.png" alt="img"></p><p> 3.修改application\index\controller\index.php文件<img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637312397619-1b99b2d1-0902-43fb-a04e-9253055dad9f.png" alt="img"></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title class_">app</span>\<span class="title class_">index</span>\<span class="title class_">controller</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">think</span>\<span class="title">Db</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Index</span></span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="variable">$name</span> = <span class="title function_ invoke__">input</span>(<span class="string">"get.name/a"</span>);</span><br><span class="line"> <span class="title class_">Db</span>::<span class="title function_ invoke__">table</span>(<span class="string">"users"</span>)-><span class="title function_ invoke__">where</span>([<span class="string">"id"</span>=><span class="number">1</span>])-><span class="title function_ invoke__">insert</span>([<span class="string">"username"</span>=><span class="variable">$name</span>]);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"ThinkPHP SQL Test."</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="meta">?></span></span><br></pre></td></tr></table></figure><p> 4.尝试触发漏洞</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637312581283-6da25b8e-a05b-4d39-a8d0-f14f7a0aadc1.png" alt="img">payload:</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/<span class="keyword">public</span>/index.php/index/index/index?name[<span class="number">0</span>]=inc&name[<span class="number">1</span>]=<span class="title function_ invoke__">updatexml</span>(<span class="number">1</span>,<span class="title function_ invoke__">concat</span>(<span class="number">0x7</span>,<span class="title function_ invoke__">user</span>(),<span class="number">0x7e</span>),<span class="number">1</span>)&name[<span class="number">2</span>]=<span class="number">1</span></span><br></pre></td></tr></table></figure><h2 id="漏洞分析"><a href="#漏洞分析" class="headerlink" title="漏洞分析"></a>漏洞分析</h2><ol><li><p>因为是复现所以明确知道的是insert函数存在漏洞,接下来是分析</p></li><li><p>首先看自己定义的控制器的index函数</p><p><img src="C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211122140339648.png" alt="image-20211122140339648"></p></li><li><p>直接转到insert函数的定义在/thinkphp/library/think/db/Query.php文件下,这里自己尝试分析了一下</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">insert</span>(<span class="params"><span class="keyword">array</span> <span class="variable">$data</span> = [], <span class="variable">$replace</span> = <span class="literal">false</span>, <span class="variable">$getLastInsID</span> = <span class="literal">false</span>, <span class="variable">$sequence</span> = <span class="literal">null</span></span>)</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="comment">// 分析查询表达式</span></span><br><span class="line"> <span class="variable">$options</span> = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseExpress</span>(); <span class="comment"># 分析我们写入的表达式是用来查询还是写入</span></span><br><span class="line"> <span class="variable">$data</span> = <span class="title function_ invoke__">array_merge</span>(<span class="variable">$options</span>[<span class="string">'data'</span>], <span class="variable">$data</span>); <span class="comment"># 合并数组,$data是我们自己传入执行语句</span></span><br><span class="line"> <span class="comment">// 生成SQL语句</span></span><br><span class="line"> <span class="variable">$sql</span> = <span class="variable language_">$this</span>->builder-><span class="title function_ invoke__">insert</span>(<span class="variable">$data</span>, <span class="variable">$options</span>, <span class="variable">$replace</span>);</span><br><span class="line"> <span class="comment">//运行到这里的时候sql的值为"INSERT INTO `users` (`username`) VALUES (:data__username) "</span></span><br><span class="line"> <span class="comment">// 获取参数绑定</span></span><br><span class="line"> <span class="variable">$bind</span> = <span class="variable language_">$this</span>-><span class="title function_ invoke__">getBind</span>();</span><br><span class="line"> <span class="comment">//这里的参数绑定就是绑定:data_username</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$options</span>[<span class="string">'fetch_sql'</span>]) { <span class="comment">#这里$options['fetch_sql']值为false跳过</span></span><br><span class="line"> <span class="comment">// 获取实际执行的SQL语句</span></span><br><span class="line"> <span class="keyword">return</span> <span class="variable language_">$this</span>->connection-><span class="title function_ invoke__">getRealSql</span>(<span class="variable">$sql</span>, <span class="variable">$bind</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 执行操作</span></span><br><span class="line"> <span class="variable">$result</span> = <span class="number">0</span> === <span class="variable">$sql</span> ? <span class="number">0</span> : <span class="variable language_">$this</span>-><span class="title function_ invoke__">execute</span>(<span class="variable">$sql</span>, <span class="variable">$bind</span>);<span class="comment">#这里就是如果sql语句不为空就执行绑定参数的sql语句</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$result</span>) {</span><br><span class="line"> <span class="variable">$sequence</span> = <span class="variable">$sequence</span> ?: (<span class="keyword">isset</span>(<span class="variable">$options</span>[<span class="string">'sequence'</span>]) ? <span class="variable">$options</span>[<span class="string">'sequence'</span>] : <span class="literal">null</span>);</span><br><span class="line"> <span class="variable">$lastInsId</span> = <span class="variable language_">$this</span>-><span class="title function_ invoke__">getLastInsID</span>(<span class="variable">$sequence</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$lastInsId</span>) {</span><br><span class="line"> <span class="variable">$pk</span> = <span class="variable language_">$this</span>-><span class="title function_ invoke__">getPk</span>(<span class="variable">$options</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="title function_ invoke__">is_string</span>(<span class="variable">$pk</span>)) {</span><br><span class="line"> <span class="variable">$data</span>[<span class="variable">$pk</span>] = <span class="variable">$lastInsId</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="variable">$options</span>[<span class="string">'data'</span>] = <span class="variable">$data</span>;</span><br><span class="line"> <span class="variable language_">$this</span>-><span class="title function_ invoke__">trigger</span>(<span class="string">'after_insert'</span>, <span class="variable">$options</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$getLastInsID</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$lastInsId</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$result</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure></li><li><p>接着我们跟进到<code>$sql = $this->builder->insert($data, $options, $replace);</code>的insert()函数</p><p>这里构造了我们最后要执行的sql语句,所以漏洞一般产生在这里</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">insert</span>(<span class="params"><span class="keyword">array</span> <span class="variable">$data</span>, <span class="variable">$options</span> = [], <span class="variable">$replace</span> = <span class="literal">false</span></span>)</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="comment">// 分析并处理数据</span></span><br><span class="line"> <span class="variable">$data</span> = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseData</span>(<span class="variable">$data</span>, <span class="variable">$options</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">empty</span>(<span class="variable">$data</span>)) {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="variable">$fields</span> = <span class="title function_ invoke__">array_keys</span>(<span class="variable">$data</span>); <span class="comment">#以数组形式返回$data数组的键</span></span><br><span class="line"> <span class="variable">$values</span> = <span class="title function_ invoke__">array_values</span>(<span class="variable">$data</span>); <span class="comment">#以数组形式放回$data数组的值</span></span><br><span class="line"></span><br><span class="line"> <span class="variable">$sql</span> = <span class="title function_ invoke__">str_replace</span>(</span><br><span class="line"> [<span class="string">'%INSERT%'</span>, <span class="string">'%TABLE%'</span>, <span class="string">'%FIELD%'</span>, <span class="string">'%DATA%'</span>, <span class="string">'%COMMENT%'</span>],</span><br><span class="line"> [</span><br><span class="line"> <span class="variable">$replace</span> ? <span class="string">'REPLACE'</span> : <span class="string">'INSERT'</span>,</span><br><span class="line"> <span class="variable">$this</span>-><span class="title function_ invoke__">parseTable</span>(<span class="variable">$options</span>[<span class="string">'table'</span>], <span class="variable">$options</span>),</span><br><span class="line"> <span class="title function_ invoke__">implode</span>(<span class="string">' , '</span>, <span class="variable">$fields</span>),</span><br><span class="line"> <span class="title function_ invoke__">implode</span>(<span class="string">' , '</span>, <span class="variable">$values</span>),</span><br><span class="line"> <span class="variable">$this</span>-><span class="title function_ invoke__">parseComment</span>(<span class="variable">$options</span>[<span class="string">'comment'</span>]),</span><br><span class="line"> ], <span class="variable">$this</span>->insertSql);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$sql</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>先转到看一下数据的解析<code>$data = $this->parseData($data, $options)</code></p><p>假设我们传入的是<code>?name[0]=username&name[1]=password&name[2]=123456</code></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protected</span> <span class="function"><span class="keyword">function</span> <span class="title">parseData</span>(<span class="params"><span class="variable">$data</span>, <span class="variable">$options</span></span>)</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">empty</span>(<span class="variable">$data</span>)) {</span><br><span class="line"> <span class="keyword">return</span> [];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 获取绑定信息</span></span><br><span class="line"> <span class="variable">$bind</span> = <span class="variable language_">$this</span>->query-><span class="title function_ invoke__">getFieldsBind</span>(<span class="variable">$options</span>[<span class="string">'table'</span>]);</span><br><span class="line"> <span class="keyword">if</span> (<span class="string">'*'</span> == <span class="variable">$options</span>[<span class="string">'field'</span>]) {</span><br><span class="line"> <span class="variable">$fields</span> = <span class="title function_ invoke__">array_keys</span>(<span class="variable">$bind</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable">$fields</span> = <span class="variable">$options</span>[<span class="string">'field'</span>];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="variable">$result</span> = [];</span><br><span class="line"> <span class="comment">#这里遍历了数组 此时的数组是Array ( [username] => Array ( [0] => username [1] => password [2] => 123456 ) ) </span></span><br><span class="line"> <span class="keyword">foreach</span> (<span class="variable">$data</span> <span class="keyword">as</span> <span class="variable">$key</span> => <span class="variable">$val</span>) {</span><br><span class="line"> <span class="comment">#$key username</span></span><br><span class="line"> <span class="comment">#$val Array ( [0] => username [1] => password [2] => 123456 ) </span></span><br><span class="line"> <span class="variable">$item</span> = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseKey</span>(<span class="variable">$key</span>, <span class="variable">$options</span>);</span><br><span class="line"> <span class="comment">#$item=`username`</span></span><br><span class="line"> <span class="comment">#这里的$val是数组所以跳过</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="title function_ invoke__">is_object</span>(<span class="variable">$val</span>) && <span class="title function_ invoke__">method_exists</span>(<span class="variable">$val</span>, <span class="string">'__toString'</span>)) {</span><br><span class="line"> <span class="comment">// 对象数据写入</span></span><br><span class="line"> <span class="variable">$val</span> = <span class="variable">$val</span>-><span class="title function_ invoke__">__toString</span>();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">#如果字段名含有.或者字段名不在$fileds则报错</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="literal">false</span> === <span class="title function_ invoke__">strpos</span>(<span class="variable">$key</span>, <span class="string">'.'</span>) && !<span class="title function_ invoke__">in_array</span>(<span class="variable">$key</span>, <span class="variable">$fields</span>, <span class="literal">true</span>)) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$options</span>[<span class="string">'strict'</span>]) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Exception</span>(<span class="string">'fields not exists:['</span> . <span class="variable">$key</span> . <span class="string">']'</span>);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">elseif</span> (<span class="title function_ invoke__">is_null</span>(<span class="variable">$val</span>)) {</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="string">'NULL'</span>;</span><br><span class="line"> } <span class="keyword">elseif</span> (<span class="title function_ invoke__">is_array</span>(<span class="variable">$val</span>) && !<span class="keyword">empty</span>(<span class="variable">$val</span>)) { <span class="comment">#跟进到这里</span></span><br><span class="line"> <span class="comment">#这里如果$val[0]的值是下面三个中的一个则进行了拼接</span></span><br><span class="line"> <span class="keyword">switch</span> (<span class="variable">$val</span>[<span class="number">0</span>]) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'exp'</span>:</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable">$val</span>[<span class="number">1</span>];</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'inc'</span>:</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseKey</span>(<span class="variable">$val</span>[<span class="number">1</span>]) . <span class="string">'+'</span> . <span class="title function_ invoke__">floatval</span>(<span class="variable">$val</span>[<span class="number">2</span>]);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'dec'</span>:</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseKey</span>(<span class="variable">$val</span>[<span class="number">1</span>]) . <span class="string">'-'</span> . <span class="title function_ invoke__">floatval</span>(<span class="variable">$val</span>[<span class="number">2</span>]);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">elseif</span> (<span class="title function_ invoke__">is_scalar</span>(<span class="variable">$val</span>)) {</span><br><span class="line"> <span class="comment">// 过滤非标量数据</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="number">0</span> === <span class="title function_ invoke__">strpos</span>(<span class="variable">$val</span>, <span class="string">':'</span>) && <span class="variable language_">$this</span>->query-><span class="title function_ invoke__">isBind</span>(<span class="title function_ invoke__">substr</span>(<span class="variable">$val</span>, <span class="number">1</span>))) {</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable">$val</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable">$key</span> = <span class="title function_ invoke__">str_replace</span>(<span class="string">'.'</span>, <span class="string">'_'</span>, <span class="variable">$key</span>);</span><br><span class="line"> <span class="variable language_">$this</span>->query-><span class="title function_ invoke__">bind</span>(<span class="string">'data__'</span> . <span class="variable">$key</span>, <span class="variable">$val</span>, <span class="keyword">isset</span>(<span class="variable">$bind</span>[<span class="variable">$key</span>]) ? <span class="variable">$bind</span>[<span class="variable">$key</span>] : PDO::<span class="variable constant_">PARAM_STR</span>);</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="string">':data__'</span> . <span class="variable">$key</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$result</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>自己大概捋了一下思路 感觉已经知道了注入的顺序了 接下来就是待入payload梳理一下</p><p>这里用七月火师傅给的payload <code>?name[0]=inc&name[1]=updatexml(1,concat(0x7,user(),0x7e),1)&name[2]=1</code></p><p>接下来动态调试一下</p></li></ol><h3 id="1-入口函数"><a href="#1-入口函数" class="headerlink" title="1. 入口函数"></a>1. 入口函数</h3><p><img src="C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211122190254568.png" alt="image-20211122190254568"></p><h3 id="2-跟进到insert函数"><a href="#2-跟进到insert函数" class="headerlink" title="2. 跟进到insert函数"></a>2. 跟进到insert函数</h3><p><img src="C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211122190932980.png" alt="image-20211122190932980"></p><p>在红线的地方进行了一次解析,这次解析和漏洞关系不大,只是解析了当前sql语句或者这里应该称之为表达式进行了一次解析,主要内容就是,表名,字段名这些获得的结果如下</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$options</span>:</span><br><span class="line"><span class="title function_ invoke__">Array</span> ( [table] => users [multi] => <span class="title function_ invoke__">Array</span> ( [AND] => <span class="title function_ invoke__">Array</span> ( [id] => <span class="title function_ invoke__">Array</span> ( [<span class="number">0</span>] => <span class="number">1</span> ) ) ) [where] => <span class="title function_ invoke__">Array</span> ( [AND] => <span class="title function_ invoke__">Array</span> ( [id] => <span class="number">1</span> ) ) [field] => * [data] => <span class="title function_ invoke__">Array</span> ( ) [strict] => <span class="number">1</span> [master] => [lock] => [fetch_pdo] => [fetch_sql] => [distinct] => [join] => [union] => [group] => [having] => [limit] => [order] => [force] => [comment] => ) </span><br></pre></td></tr></table></figure><p>在接下来的地方执行了array_merge()函数,把两个数组合并成一个数组,并赋值给$data</p><p>此时$options[‘data’]为空,而$data就是我们想要插入的键值对</p><p>接下来才是最重要的</p><h3 id="3-builder-php-x2F-insert"><a href="#3-builder-php-x2F-insert" class="headerlink" title="3. builder.php/insert()"></a>3. builder.php/insert()</h3><p><img src="C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211122211516906.png" alt="image-20211122211516906">在这里就要跟进到builder类的insert()函数了,这个函数的功能是<strong>拼接出最后要执行SQL语句</strong></p><p><strong>所以要特别关注这个函数</strong></p><p>这里注意的是builder并非是builder类的实例化对象,而是Mysql类的</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637586782016-64ceefb6-bd92-4a90-9197-ccd16a64f272.png" alt="图片.png"></p><p>只是在这里的Mysql类继承了Builder类所以存在insert()函数,废话不多说直接看insert()函数</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637586806130-e59464d6-f8b9-4ff9-af73-960efb2613ba.png" alt="图片.png"></p><p>这里直接执行了一个parseData()函数继续跟进,这就就是漏洞的点了,打气精神来 everybody!</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protected</span> <span class="function"><span class="keyword">function</span> <span class="title">parseData</span>(<span class="params"><span class="variable">$data</span>, <span class="variable">$options</span></span>)</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">empty</span>(<span class="variable">$data</span>)) {</span><br><span class="line"> <span class="keyword">return</span> [];</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 获取绑定信息</span></span><br><span class="line"> <span class="variable">$bind</span> = <span class="variable language_">$this</span>->query-><span class="title function_ invoke__">getFieldsBind</span>(<span class="variable">$options</span>[<span class="string">'table'</span>]);</span><br><span class="line"> <span class="keyword">if</span> (<span class="string">'*'</span> == <span class="variable">$options</span>[<span class="string">'field'</span>]) {</span><br><span class="line"> <span class="variable">$fields</span> = <span class="title function_ invoke__">array_keys</span>(<span class="variable">$bind</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable">$fields</span> = <span class="variable">$options</span>[<span class="string">'field'</span>];</span><br><span class="line"> }</span><br><span class="line"> <span class="variable">$result</span> = [];</span><br><span class="line"> <span class="keyword">foreach</span> (<span class="variable">$data</span> <span class="keyword">as</span> <span class="variable">$key</span> => <span class="variable">$val</span>) {</span><br><span class="line"> <span class="title function_ invoke__">print_r</span>(<span class="variable">$val</span>);</span><br><span class="line"> <span class="variable">$item</span> = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseKey</span>(<span class="variable">$key</span>, <span class="variable">$options</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="title function_ invoke__">is_object</span>(<span class="variable">$val</span>) && <span class="title function_ invoke__">method_exists</span>(<span class="variable">$val</span>, <span class="string">'__toString'</span>)) {</span><br><span class="line"> <span class="comment">// 对象数据写入</span></span><br><span class="line"> <span class="variable">$val</span> = <span class="variable">$val</span>-><span class="title function_ invoke__">__toString</span>();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (<span class="literal">false</span> === <span class="title function_ invoke__">strpos</span>(<span class="variable">$key</span>, <span class="string">'.'</span>) && !<span class="title function_ invoke__">in_array</span>(<span class="variable">$key</span>, <span class="variable">$fields</span>, <span class="literal">true</span>)) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$options</span>[<span class="string">'strict'</span>]) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Exception</span>(<span class="string">'fields not exists:['</span> . <span class="variable">$key</span> . <span class="string">']'</span>);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">elseif</span> (<span class="title function_ invoke__">is_null</span>(<span class="variable">$val</span>)) {</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="string">'NULL'</span>;</span><br><span class="line"> } <span class="keyword">elseif</span> (<span class="title function_ invoke__">is_array</span>(<span class="variable">$val</span>) && !<span class="keyword">empty</span>(<span class="variable">$val</span>)) {</span><br><span class="line"> <span class="keyword">switch</span> (<span class="variable">$val</span>[<span class="number">0</span>]) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'exp'</span>:</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable">$val</span>[<span class="number">1</span>];</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'inc'</span>:</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseKey</span>(<span class="variable">$val</span>[<span class="number">1</span>]) . <span class="string">'+'</span> . <span class="title function_ invoke__">floatval</span>(<span class="variable">$val</span>[<span class="number">2</span>]);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'dec'</span>:</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable language_">$this</span>-><span class="title function_ invoke__">parseKey</span>(<span class="variable">$val</span>[<span class="number">1</span>]) . <span class="string">'-'</span> . <span class="title function_ invoke__">floatval</span>(<span class="variable">$val</span>[<span class="number">2</span>]);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"result:<br>"</span>;</span><br><span class="line"> <span class="title function_ invoke__">print_r</span>(<span class="variable">$result</span>);</span><br><span class="line"> } <span class="keyword">elseif</span> (<span class="title function_ invoke__">is_scalar</span>(<span class="variable">$val</span>)) {</span><br><span class="line"> <span class="comment">// 过滤非标量数据</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="number">0</span> === <span class="title function_ invoke__">strpos</span>(<span class="variable">$val</span>, <span class="string">':'</span>) && <span class="variable language_">$this</span>->query-><span class="title function_ invoke__">isBind</span>(<span class="title function_ invoke__">substr</span>(<span class="variable">$val</span>, <span class="number">1</span>))) {</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="variable">$val</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable">$key</span> = <span class="title function_ invoke__">str_replace</span>(<span class="string">'.'</span>, <span class="string">'_'</span>, <span class="variable">$key</span>);</span><br><span class="line"> <span class="variable language_">$this</span>->query-><span class="title function_ invoke__">bind</span>(<span class="string">'data__'</span> . <span class="variable">$key</span>, <span class="variable">$val</span>, <span class="keyword">isset</span>(<span class="variable">$bind</span>[<span class="variable">$key</span>]) ? <span class="variable">$bind</span>[<span class="variable">$key</span>] : PDO::<span class="variable constant_">PARAM_STR</span>);</span><br><span class="line"> <span class="variable">$result</span>[<span class="variable">$item</span>] = <span class="string">':data__'</span> . <span class="variable">$key</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$result</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>首先执行了一个<code>$bind = $this->query->getFieldsBind($options['table']);</code>这个函数的具体流程还不清楚</p><p>但是返回的值是这样的<code>Array ( [id] => 1 [username] => 2 [password] => 2 )</code></p><p>暂且可以理解为是以数组的形式返回数据库的字段名(90%的确定!)</p><p>接着就是<code>$fields = array_keys($bind);</code>将$bind数组的键以一个新的数组赋值到$fields</p><h3 id="4-foreach-生成sql语句"><a href="#4-foreach-生成sql语句" class="headerlink" title="4. foreach()生成sql语句"></a>4. foreach()生成sql语句</h3><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637587324239-15ad0a71-8ec0-410b-a600-3899a308c822.png" alt="图片.png"></p><p>此时键值$key是username $val是一个数组在图中已经给出来了</p><p>而$item在parseKey解析后值是变为`username`</p><p>下面的if由于不是对象直接跳过,直接运行到</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637587378450-963c32a2-e59a-4017-b7d9-0f58adbffe19.png" alt="图片.png"></p><p>此时$val[0]的值是inc直接跳到case inc:执行下面的语句</p><p>通过拼接<code>$result[$item]=updatexml(1,concat(0x7,user(),0x7e),1)+1</code></p><p>而reuslt的数组的值就是</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_ invoke__">Array</span> ( [`username`] => <span class="title function_ invoke__">updatexml</span>(<span class="number">1</span>,<span class="title function_ invoke__">concat</span>(<span class="number">0x7</span>,<span class="title function_ invoke__">user</span>(),<span class="number">0x7e</span>),<span class="number">1</span>)+<span class="number">1</span> ) </span><br></pre></td></tr></table></figure><p>返回result数组到insert()函数</p><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637587425904-f1872ee2-e34d-4204-ae67-349b1bbd833b.png" alt="图片.png"></p><p>初始定义<code>protected $insertSql = '%INSERT% INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%';</code></p><p>经过解析后变为sql语句变为</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> `users` (`username`) <span class="keyword">VALUES</span> (updatexml(<span class="number">1</span>,concat(<span class="number">0x7</span>,<span class="keyword">user</span>(),<span class="number">0x7e</span>),<span class="number">1</span>)<span class="operator">+</span><span class="number">123456</span>) </span><br></pre></td></tr></table></figure><p><img src="https://cdn.nlark.com/yuque/0/2021/png/22602434/1637587444264-8982234a-14ec-4f6f-889f-821c233fea94.png" alt="图片.png"></p><p>由于在红线的地方执行sql语句的时候由于updatexml而产生报错</p><h2 id="补充"><a href="#补充" class="headerlink" title="补充"></a>补充</h2><ol><li><p>这里漏洞的第一参数name[0]可以修改为dec可以 但是exp我复现失败了 后面回补充完整!</p></li><li><p>第一次审计TP框架,可能审计的不够完美,希望大家多多包涵!</p></li><li><p>本文参考七月火师傅的博客</p><p><a href="%22https://mochazz.github.io/2018/04/14/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%20%20ThinkPHP%205.0.x%E6%A1%86%E6%9E%B6SQL%E6%B3%A8%E2%BC%8A/#ThinkPHP%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%22">1. 代码审计 | ThinkPHP5.0.x框架SQL注⼊-七月火师傅</a></p><p><a href="https://github.com/top-think/framework/commit/363fd4d90312f2cfa427535b7ea01a097ca8db1b">2. 官方漏洞修复</a></p></li><li><p>后来发现如果name[0]=exp 经过处理之后值</p><img src="C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211122233302725.png" alt="image-20211122233302725" /><p>$val[0]=’exp ‘所以没有匹配到,但是inc和dec却没有加一个trim,所以跟进了一下</p><p>在这里打了一下dump($val[0]);值是<code>string 'exp ' (length=4)</code></p><p>我在这里一个一个尝试了一下 最后发现</p><p>在入口函数</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="variable">$name</span> = <span class="title function_ invoke__">input</span>(<span class="string">"get.name/a"</span>);</span><br><span class="line"> <span class="title function_ invoke__">dump</span>(<span class="variable">$name</span>[<span class="number">0</span>]);</span><br><span class="line"> <span class="title class_">Db</span>::<span class="title function_ invoke__">table</span>(<span class="string">"users"</span>)-><span class="title function_ invoke__">where</span>([<span class="string">"id"</span>=><span class="number">1</span>])-><span class="title function_ invoke__">insert</span>([<span class="string">"username"</span>=><span class="variable">$name</span>]);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"ThinkPHP SQL Test."</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>这里打出$name[0],如果传的是exp就多了一个空格,如果是inc就没有添加空格</p><p>最后在这个目录下发现了一个函数 日!</p><p><code>\thinkphp\library\think\Request.php</code></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">filterExp</span>(<span class="params">&<span class="variable">$value</span></span>)</span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="comment">// 过滤查询特殊字符</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="title function_ invoke__">is_string</span>(<span class="variable">$value</span>) && <span class="title function_ invoke__">preg_match</span>(<span class="string">'/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i'</span>, <span class="variable">$value</span>)) {</span><br><span class="line"> <span class="variable">$value</span> .= <span class="string">' '</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// TODO 其他安全过滤</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>G!</p></li></ol>]]></content>
<categories>
<category> thinkphp框架安全 </category>
</categories>
<tags>
<tag> SQL注入 </tag>
</tags>
</entry>
<entry>
<title>ilove wyw</title>
<link href="/2023/03/21/ilove-wyw/"/>
<url>/2023/03/21/ilove-wyw/</url>
<content type="html"><![CDATA[<p>傻逼!</p>]]></content>
<categories>
<category> 成长 </category>
</categories>
<tags>
<tag> 成长 </tag>
</tags>
</entry>
</search>