<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Gbr&#39; home</title>
  
  <subtitle>人生在勤，不索何获！</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://gbrweb.github.io/"/>
  <updated>2018-06-01T16:28:51.249Z</updated>
  <id>https://gbrweb.github.io/</id>
  
  <author>
    <name>Gbr</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>【C语言】动态顺序表 + 文件存储 = 通讯录</title>
    <link href="https://gbrweb.github.io/2018/06/02/2018530/"/>
    <id>https://gbrweb.github.io/2018/06/02/2018530/</id>
    <published>2018-06-02T10:08:11.945Z</published>
    <updated>2018-06-01T16:28:51.249Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>在前面曾用静态、动态顺序表两种方式实现通讯录，但每次运行程序我们都得重新输入，之前输入的成员信息并不会保存，而现实中，通讯录里的信息创建后是永久保存的，除非你删除它，今天我们就来模拟一下如何将数据存储在文件中，当下一次运行时加载一下即可，这种做法更贴合实际。<br><a id="more"></a></p></blockquote><blockquote><p><strong>程序中会用到与文件操作相关的函数，提前介绍一下：</strong></p><ul><li>fopen 它的函数原型为：FILE<em>fopen(const char </em>filename,const char *mode) ，filename:创建文件的名字；mode:允许进入文件的类型;简单来说这个文件的作用就是打开一个文件流；与fclose:关闭文件流配套使用.</li><li>perror: 它的函数原型为：void perror(const char * string) ,这是一种报告文件错误的函数；后面包括一个分号和一个空格，然后打印出一条用于解释errno当前错误代码的信息;</li><li>fwrite: 它的函数原型为：size_t fwrite(const void <em>buffer,size_t size,size_t count,FILE</em>stream) ,buffer:数据写入的体格缓冲区；</li></ul></blockquote><h2 id="通讯录简要功能："><a href="#通讯录简要功能：" class="headerlink" title="通讯录简要功能："></a>通讯录简要功能：</h2><blockquote><ul><li>初始化通讯录</li><li>添加联系人</li><li>查找联系人</li><li>删除联系人</li><li>修改联系人</li><li>按姓名排序</li><li>清空联系人</li><li>联系人列表</li><li>检查容量</li><li>加载文件</li><li>保存文件</li><li>销毁通讯录</li><li>退出</li></ul></blockquote><h2 id="参考代码："><a href="#参考代码：" class="headerlink" title="参考代码："></a>参考代码：</h2><h3 id="Contact-h："><a href="#Contact-h：" class="headerlink" title="Contact.h："></a>Contact.h：</h3><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/***********************************************************</span></span><br><span class="line"><span class="comment">*                      程序名称：通讯录（静态顺序表）         *</span></span><br><span class="line"><span class="comment">*                      编译环境：VS2013                     *</span></span><br><span class="line"><span class="comment">*                      编制日期：2018.5.29                  *</span></span><br><span class="line"><span class="comment">*                                      -----by Hunter  *</span></span><br><span class="line"><span class="comment">***********************************************************/</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifndef</span> __CONTACT_H__</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> __CONTACT_H__</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;assert.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">enum</span> OPPTION</span><br><span class="line">&#123;</span><br><span class="line">EXIT,</span><br><span class="line">ADD,</span><br><span class="line">SEARCH,</span><br><span class="line">DEIETE,</span><br><span class="line">MODIFY,</span><br><span class="line">SORT,</span><br><span class="line">SHOW,</span><br><span class="line">EMPTY</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">char</span> datatype;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_NAME 10</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SEX 5</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_TEL 11</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_ADDR 30</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SIZE 1000</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> FILE_NAME  <span class="meta-string">"contact.dat"</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">PeoInfo</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">datatype Name[MAX_NAME];</span><br><span class="line">datatype Sex[MAX_SEX];</span><br><span class="line"><span class="keyword">int</span> age;</span><br><span class="line">datatype Tel[MAX_TEL];</span><br><span class="line">datatype Addr[MAX_ADDR];</span><br><span class="line">&#125;PeoInfo, *pPeoInfo;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Contact</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">pPeoInfo data;</span><br><span class="line"><span class="keyword">int</span> size;</span><br><span class="line"><span class="keyword">int</span> capacity;</span><br><span class="line">&#125;Contact, *pContact;</span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//添加联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AddContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//删除联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DeleteContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//查找联系人</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SearchContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//修改联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ModifyContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//按姓排序</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SortContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//列表联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//清空联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">EmptyContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//销毁</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DestoryContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//加载</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">LoadContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//保存</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SaveContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span> <span class="comment">//__CONTACT_H__</span></span></span><br></pre></td></tr></table></figure><h3 id="Contact-c："><a href="#Contact-c：" class="headerlink" title="Contact.c："></a>Contact.c：</h3> <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><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"contact.h"</span></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="function"><span class="keyword">void</span> <span class="title">CheckCapacity</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pPeoInfo *p = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">if</span> (pc-&gt;size == pc-&gt;capacity)</span><br><span class="line">&#123;</span><br><span class="line">p = (pPeoInfo)<span class="built_in">realloc</span>(pc-&gt;data, (pc-&gt;capacity + <span class="number">2</span>)*<span class="keyword">sizeof</span>(PeoInfo));</span><br><span class="line"><span class="keyword">if</span> (p != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">pc-&gt;data = p;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t增容失败"</span>);</span><br><span class="line"><span class="built_in">exit</span>(EXIT_FAILURE);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pc-&gt;capacity += <span class="number">2</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t增容成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//加载</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">LoadContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;   </span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">FILE* pfRead = fopen(<span class="string">"contact.dat"</span>, <span class="string">"r"</span>);</span><br><span class="line">PeoInfo tmp = &#123; <span class="number">0</span> &#125;;   <span class="comment">//创建临时变量保存每次读取的信息</span></span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (pfRead == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">perror(<span class="string">"the file to read"</span>);</span><br><span class="line"><span class="built_in">exit</span>(EXIT_FAILURE);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (fread(&amp;tmp, <span class="keyword">sizeof</span>(PeoInfo), <span class="number">1</span>, pfRead))</span><br><span class="line">&#123;</span><br><span class="line">CheckCapacity(pc);</span><br><span class="line">pc-&gt;data[i] = tmp;</span><br><span class="line">i++;</span><br><span class="line">pc-&gt;size++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">fclose(pfRead);</span><br><span class="line">pfRead = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//保存</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SaveContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">FILE *pfwrite = fopen(<span class="string">"contact.dat"</span>, <span class="string">"w"</span>);</span><br><span class="line">    <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span> (pfwrite == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">perror(<span class="string">"the file to write"</span>);</span><br><span class="line"><span class="built_in">exit</span>(EXIT_FAILURE);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;pc-&gt;size; i++)</span><br><span class="line">&#123;</span><br><span class="line">fwrite(pc-&gt;data+ i, <span class="keyword">sizeof</span>(PeoInfo), <span class="number">1</span>, pfwrite);</span><br><span class="line">&#125;</span><br><span class="line">fclose(pfwrite);</span><br><span class="line">pfwrite = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line">pc-&gt;capacity = <span class="number">3</span>;</span><br><span class="line">pc-&gt;data = (pPeoInfo)<span class="built_in">malloc</span>((pc-&gt;capacity)*<span class="keyword">sizeof</span>(PeoInfo));</span><br><span class="line"><span class="keyword">if</span> (pc-&gt;data == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t内存分配失败"</span>);</span><br><span class="line"><span class="built_in">exit</span>(EXIT_FAILURE);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">memset</span>(pc-&gt;data, <span class="number">0</span>, <span class="keyword">sizeof</span>(pc-&gt;data));</span><br><span class="line">LoadContact(pc);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//添加联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AddContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (pc-&gt;size == MAX_SIZE)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t空间不足"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">CheckCapacity(pc);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入姓名:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入性别:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Sex);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入年龄:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;pc-&gt;data[pc-&gt;size].age);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入电话号:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Tel);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入地址:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Addr);</span><br><span class="line">pc-&gt;size++;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t添加成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//查找联系人</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SearchContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">char</span> name[MAX_NAME];</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无此联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\tName\tSex\tAge\tTel\t\tAddr\n"</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == <span class="built_in">strcmp</span>(pc-&gt;data[i].Name, name))</span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n"</span>,</span><br><span class="line">pc-&gt;data[i].Name,</span><br><span class="line">pc-&gt;data[i].Sex,</span><br><span class="line">pc-&gt;data[i].age,</span><br><span class="line">pc-&gt;data[i].Tel,</span><br><span class="line">pc-&gt;data[i].Addr);</span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无此联系人\n"</span>);</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">&#125;</span><br><span class="line"><span class="comment">//删除联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DeleteContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> num = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">num = SearchContact(pc);</span><br><span class="line"><span class="keyword">if</span> (num != <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t确定删除？  1.yes,  2.no:&gt;"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">1</span> == n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (i = num; i &lt; (pc-&gt;size) - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line">pc-&gt;data[i] = pc-&gt;data[i + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">pc-&gt;size--;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t删除成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//交换</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Swap</span><span class="params">(pPeoInfo *a, pPeoInfo *b)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">pPeoInfo *Tmp;</span><br><span class="line">Tmp = *a;</span><br><span class="line">*a = *b;</span><br><span class="line">*b = Tmp;</span><br><span class="line"></span><br><span class="line">&#125;</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="function"><span class="keyword">void</span> <span class="title">ModifyContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> modify = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">modify = SearchContact(pc);</span><br><span class="line"><span class="keyword">if</span> (modify != <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t确认修改？1.yes  2.no:&gt;"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">1</span> == n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入姓名:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入性别:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Sex);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入年龄:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;pc-&gt;data[modify].age);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入电话号:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Tel);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入地址:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Addr);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t修改成功\n"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//按姓排序</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SortContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> flag = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 冒泡次数</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//冒泡排序</span></span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; pc-&gt;size - i - <span class="number">1</span>; j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strcmp</span>(pc-&gt;data[j].Name, pc-&gt;data[j + <span class="number">1</span>].Name)&gt;<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">Swap(&amp;pc-&gt;data[j], &amp;pc-&gt;data[j + <span class="number">1</span>]);</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == flag)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"排序成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//列表联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\tName\tSex\tAge\tTel\t\tAddr\n"</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n"</span>,</span><br><span class="line">pc-&gt;data[i].Name,</span><br><span class="line">pc-&gt;data[i].Sex,</span><br><span class="line">pc-&gt;data[i].age,</span><br><span class="line">pc-&gt;data[i].Tel,</span><br><span class="line">pc-&gt;data[i].Addr);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//清空联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">EmptyContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t清空成功"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//销毁通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DestoryContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">SaveContact(pc);</span><br><span class="line"><span class="built_in">free</span>(pc-&gt;data);</span><br><span class="line">pc-&gt;data = <span class="literal">NULL</span>;</span><br><span class="line">pc-&gt;capacity = <span class="number">0</span>;</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t销毁成功"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="test-c："><a href="#test-c：" class="headerlink" title="test.c："></a>test.c：</h3> <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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"contact.h"</span></span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">meau</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t******         《通讯录》       ********\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****************************************\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 1.添加信息       2.查找信息******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 3.删除信息       4.修改信息******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 5.按姓排序       6.信息列表******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 7.清空信息       0.退出    ******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****************************************\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">test</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> input = <span class="number">0</span>;</span><br><span class="line">Contact pc;</span><br><span class="line">InitContact(&amp;pc);</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">&#123;</span><br><span class="line">meau();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请选择:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;input);</span><br><span class="line"><span class="keyword">switch</span> (input)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> ADD:</span><br><span class="line">AddContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SEARCH:</span><br><span class="line">SearchContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> DEIETE:</span><br><span class="line">DeleteContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> MODIFY:</span><br><span class="line">ModifyContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SORT:</span><br><span class="line">SortContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SHOW:</span><br><span class="line">ShowContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> EMPTY:</span><br><span class="line">EmptyContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> EXIT:</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t输入有误，请重新输入:&gt;"</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">while</span> (input);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">Contact pc;</span><br><span class="line">test();</span><br><span class="line"></span><br><span class="line"><span class="comment">//销毁通讯录</span></span><br><span class="line">DestoryContact(&amp;pc);</span><br><span class="line">system(<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">&#125;</span><br></pre></td></tr></table></figure><h1 id="结语："><a href="#结语：" class="headerlink" title="结语："></a>结语：</h1><blockquote><p>最初的自己是个编程菜鸟，然而通过努力的学习，现在也能逐渐的自己写小程序了，相信这就是一种进步，暂不希望自己能有多强大。只要每一步走的充实，我相信一定会有好的回报，<strong>且行且努力！</strong></p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;在前面曾用静态、动态顺序表两种方式实现通讯录，但每次运行程序我们都得重新输入，之前输入的成员信息并不会保存，而现实中，通讯录里的信息创建后是永久保存的，除非你删除它，今天我们就来模拟一下如何将数据存储在文件中，当下一次运行时加载一下即可，这种做法更贴合实际。&lt;br&gt;
    
    </summary>
    
      <category term="项目实战" scheme="https://gbrweb.github.io/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/"/>
    
    
      <category term="通讯录" scheme="https://gbrweb.github.io/tags/%E9%80%9A%E8%AE%AF%E5%BD%95/"/>
    
  </entry>
  
  <entry>
    <title>逆序字符串问题</title>
    <link href="https://gbrweb.github.io/2018/06/01/201861/"/>
    <id>https://gbrweb.github.io/2018/06/01/201861/</id>
    <published>2018-06-01T14:02:30.000Z</published>
    <updated>2018-06-02T10:03:48.171Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="题目"><a href="#题目" class="headerlink" title="题目"></a>题目</h1><blockquote><p>有一个字符数组的内容为: student a am i ,请将数组的内容改为 i am a student</p></blockquote><a id="more"></a><p><strong>要求：</strong></p><p>不能使用库函数。只能开辟有限个空间（空间个数和字符串的长度无关）。</p><h2 id="算法分析"><a href="#算法分析" class="headerlink" title="算法分析"></a>算法分析</h2><blockquote><p>先将整个字符串整体逆置，再以每个单词为对象局部逆置（这时判断条件复杂一些）；这里逆置时，需要一个逆置函数，需要两个参数，首指针和尾指针，由这两个指针锁定一个区域，将里面的字符从头至尾逆置</p></blockquote><p><strong>注意：</strong></p><blockquote><ul><li>最后一次跳出while循环时，相当于*pcur==’\0’,所以最后这个单词没有逆置，需要再次调用逆置函数</li><li>if(表达式){语句1}语句2；这样的结构，无论if表达式成立与否，语句2都会执行的</li></ul></blockquote><h2 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a>效果展示</h2><p><img src="/img/201861.png" alt="图片加载"></p><h2 id="参考代码"><a href="#参考代码" class="headerlink" title="参考代码"></a>参考代码</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;  </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;assert.h&gt;  </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">my_strlen</span><span class="params">(<span class="keyword">const</span> <span class="keyword">char</span> *str)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> count = <span class="number">0</span>;  </span><br><span class="line">    assert(str);  </span><br><span class="line">    <span class="keyword">while</span>(*str++)  </span><br><span class="line">    &#123;  </span><br><span class="line">        count++;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">return</span> count;  </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reverse_str</span><span class="params">(<span class="keyword">char</span> *left,<span class="keyword">char</span> *right)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    assert(left);  </span><br><span class="line">    assert(right);  </span><br><span class="line">    <span class="keyword">while</span>(left &lt; right)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">char</span> temp = *left;  </span><br><span class="line">        *left = *right;  </span><br><span class="line">        *right = temp;  </span><br><span class="line">        left++;  </span><br><span class="line">        right--;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reverse</span><span class="params">(<span class="keyword">char</span> *str)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    assert(str);  </span><br><span class="line">    <span class="keyword">char</span> *left = str;  </span><br><span class="line">    <span class="keyword">char</span> *right = str + my_strlen(str) - <span class="number">1</span>;  </span><br><span class="line">    reverse_str(left,right);      </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line"></span><br><span class="line">    <span class="keyword">char</span> arr[] = <span class="string">"student a am i"</span>;  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"请逆转每个单词:%s\n\n"</span>,arr);  </span><br><span class="line">    <span class="keyword">char</span> *pcur = arr;   </span><br><span class="line">    <span class="comment">//逆序字符串   </span></span><br><span class="line">    reverse(arr);  </span><br><span class="line">    <span class="comment">//逆序单词  </span></span><br><span class="line">    <span class="keyword">while</span>(*pcur)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">char</span> *start = pcur;  </span><br><span class="line">        <span class="keyword">while</span>(*pcur != <span class="string">' '</span>&amp;&amp;*pcur != <span class="string">'\0'</span>)  </span><br><span class="line">        &#123;  </span><br><span class="line">            pcur++;  </span><br><span class="line">        &#125;  </span><br><span class="line">        reverse_str(start,pcur<span class="number">-1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(*pcur == <span class="string">' '</span>)  </span><br><span class="line">            pcur++;       </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"逆转后的结果：\n"</span>);      </span><br><span class="line">    <span class="built_in">puts</span>(arr);  </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;题目&quot;&gt;&lt;a href=&quot;#题目&quot; class=&quot;headerlink&quot; title=&quot;题目&quot;&gt;&lt;/a&gt;题目&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;有一个字符数组的内容为: student a am i ,请将数组的内容改为 i am a student&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="C语言知识及题集" scheme="https://gbrweb.github.io/categories/C%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86%E5%8F%8A%E9%A2%98%E9%9B%86/"/>
    
    
      <category term="逆序字符串" scheme="https://gbrweb.github.io/tags/%E9%80%86%E5%BA%8F%E5%AD%97%E7%AC%A6%E4%B8%B2/"/>
    
  </entry>
  
  <entry>
    <title>自定义类型：结构体，枚举，联合</title>
    <link href="https://gbrweb.github.io/2018/05/31/201862/"/>
    <id>https://gbrweb.github.io/2018/05/31/201862/</id>
    <published>2018-05-31T14:02:36.000Z</published>
    <updated>2018-06-02T09:55:34.305Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>对于C语言的学习，我们知道有基本数据类型，指针类型，自定义类型等。今天一起来探讨一下自定义类型。<br><a id="more"></a></p></blockquote><h1 id="结构体"><a href="#结构体" class="headerlink" title="结构体"></a>结构体</h1><h2 id="结构体的声明"><a href="#结构体的声明" class="headerlink" title="结构体的声明"></a>结构体的声明</h2><h3 id="结构的基础知识"><a href="#结构的基础知识" class="headerlink" title="结构的基础知识"></a>结构的基础知识</h3><blockquote><p>结构是一些值的集合，这些值称为成员变量。结构的每个成员可以是不同类型的变量。</p></blockquote><h3 id="结构的声明"><a href="#结构的声明" class="headerlink" title="结构的声明"></a>结构的声明</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">tag</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">member_list; <span class="comment">//成员列表</span></span><br><span class="line">&#125;variable_list;<span class="comment">//变量列表也称类型名，属于全局变量</span></span><br></pre></td></tr></table></figure><blockquote><p><em>注意：程序应尽可能少定义全局变量，在程序中到处引用全局变量，会导致程序难以控制，容易出错。且声明不占用内存</em></p></blockquote><p><strong>例如描述一个学生</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Stu</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">char</span> name[<span class="number">20</span>];<span class="comment">//名字</span></span><br><span class="line"><span class="keyword">int</span> age;<span class="comment">//年龄</span></span><br><span class="line"><span class="keyword">char</span> sex[<span class="number">5</span>];<span class="comment">//姓名</span></span><br><span class="line"><span class="keyword">char</span> telp[<span class="number">11</span>];<span class="comment">//电话号</span></span><br><span class="line"><span class="keyword">char</span> id[<span class="number">20</span>];<span class="comment">//学号</span></span><br><span class="line">&#125;;<span class="comment">//分号不能丢</span></span><br></pre></td></tr></table></figure></p><h3 id="特殊的声明"><a href="#特殊的声明" class="headerlink" title="特殊的声明"></a>特殊的声明</h3><blockquote><p>特殊声明就是不完全声明又叫匿名结构体类型声明</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//匿名结构体类型声明</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> a;</span><br><span class="line"><span class="keyword">char</span> b;</span><br><span class="line"><span class="keyword">float</span> c;</span><br><span class="line">&#125;x;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> a;</span><br><span class="line"><span class="keyword">char</span> b;</span><br><span class="line"><span class="keyword">float</span> c;</span><br><span class="line">&#125;a[<span class="number">20</span>],*p;</span><br></pre></td></tr></table></figure><blockquote><p><em>对于上面声明，均省略了结构体标签，而对于匿名结构体类型声明，编译器会把上面两个声明当成<strong>完全不同</strong>的 两个类型，所以对于<strong>p = &amp;x</strong>是非法的</em></p></blockquote><h2 id="结构的成员"><a href="#结构的成员" class="headerlink" title="结构的成员"></a>结构的成员</h2><blockquote><p>结构的成员可以是标量，数组，指针，甚至是其他结构体。</p></blockquote><h3 id="结构体成员的访问"><a href="#结构体成员的访问" class="headerlink" title="结构体成员的访问"></a>结构体成员的访问</h3><blockquote><ul><li>结构体变量访问成员： 结构变量成员通过点操作符（.）访问，点操作符接收两个操作数。</li><li>结构体访问指向变量的成员： 有时候我们得到不是一个结构体变量，而是一个指向结构体的指针，就应该用（-&gt;）操作符。</li></ul></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Stu</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">char</span> name[<span class="number">20</span>];<span class="comment">//名字</span></span><br><span class="line"><span class="keyword">int</span> age;<span class="comment">//年龄</span></span><br><span class="line">&#125;s;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(struct Stu* pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%s,%d\n"</span>,(*pc).name,(*pc).age);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%s,%d\n"</span>, pc-&gt;name, pc-&gt;age);</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="结构自引用"><a href="#结构自引用" class="headerlink" title="结构自引用"></a>结构自引用</h2><blockquote><p>简而言之就是在结构中包含一个类型为结构本身的成员</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">  <span class="keyword">int</span> data;</span><br><span class="line">  <span class="class"><span class="keyword">struct</span> <span class="title">Node</span>* <span class="title">next</span>;</span></span><br><span class="line">&#125;Node;</span><br></pre></td></tr></table></figure><h2 id="结构的不完整声明"><a href="#结构的不完整声明" class="headerlink" title="结构的不完整声明"></a>结构的不完整声明</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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">B</span>;</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">A</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">  <span class="keyword">int</span> a;</span><br><span class="line">  <span class="class"><span class="keyword">struct</span> <span class="title">B</span>* <span class="title">pb</span>;</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">B</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">  <span class="keyword">int</span> b;</span><br><span class="line">  <span class="class"><span class="keyword">struct</span> <span class="title">A</span>* <span class="title">pa</span>;</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="结构体变量定义及初始化"><a href="#结构体变量定义及初始化" class="headerlink" title="结构体变量定义及初始化"></a>结构体变量定义及初始化</h2><blockquote><p>有了结构体类型，定义及初始化就很简单了</p></blockquote><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="class"><span class="keyword">struct</span> <span class="title">Stu</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">int</span> y;</span><br><span class="line">&#125;p1; <span class="comment">//声明类型同时定义变量p1</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Stu</span> <span class="title">p2</span>;</span><span class="comment">//定义结构体变量p2</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Stu</span> <span class="title">P3</span> = &#123;</span> x, y &#125;;<span class="comment">//定义变量同时初始化</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Po</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">char</span> name[<span class="number">20</span>];</span><br><span class="line"><span class="keyword">int</span> age;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Po</span> <span class="title">s</span> = &#123;</span> <span class="string">"zhangsan"</span>, <span class="number">20</span> &#125;;<span class="comment">//定义变量同时初始化</span></span><br></pre></td></tr></table></figure><h2 id="结构体内存对齐"><a href="#结构体内存对齐" class="headerlink" title="结构体内存对齐"></a>结构体内存对齐</h2><blockquote><p>目前，我们已经掌握了结构体的基本使用了，现在来开始讨论一个问题：<strong>计算结构的大小</strong>。当然也是一个热门考点：<strong>结构体内存对齐</strong></p></blockquote><p><strong>如何计算？</strong></p><p><em>结构体内存对齐规则：</em></p><blockquote><ul><li>第一个成员在与结构体变量偏移量为0的地址处；</li><li>其他成员变量要对齐到某个数字（对齐数）的整数倍的地址处。<strong>对齐数</strong>=编译器默认对齐数 与该成员自身大小中的最小值。<strong>VS默认值为8，linux中gcc默认值为4.</strong></li><li>结构体总大小为最大对齐数的整数倍；</li><li>如果嵌套了结构体的情况，嵌套的结构体对齐到自己最大对齐数的整数倍处，结构体的大小就是所有对齐数中最大对齐数的整数倍。</li></ul></blockquote><p><strong>注意：</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> pack（n）    <span class="comment">//n表示系统默认最大对齐数</span></span></span><br><span class="line">...</span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> pack（）     <span class="comment">//使用完应立即取消自定义设置</span></span></span><br></pre></td></tr></table></figure></p><p><strong>为什么存在内存对齐？</strong></p><blockquote><p><strong>平台原因(移植原因):</strong></p><ul><li>不是所有硬件平台都能访问任意地址上的数据，某些硬件平台只能在某些地址处取某些特定类型的数据，否则肯呢个抛出硬件异常。</li></ul><p><strong>性能原因：</strong></p><ul><li>数据结构（尤其是栈）应该尽可能的在自然边界上对齐，原因在于：访问未对齐的内存，处理器需要两次访问，而访问对齐内存，处理器只需访问一次。</li></ul></blockquote><p><em>总的来说：</em>结构体内存对齐就是用空间换取时间的做法，而我们在设计的时候既要满足内存对齐，还要满足节省空间，那么唯一做法：<strong>让占用空间小的成员尽可能集中在一起。</strong></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></pre></td><td class="code"><pre><span class="line"><span class="comment">//练习一</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">S1</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">  <span class="keyword">double</span> d;</span><br><span class="line">  <span class="comment">//0-7</span></span><br><span class="line">  <span class="keyword">char</span> c;</span><br><span class="line">  <span class="comment">//8</span></span><br><span class="line">  <span class="keyword">int</span> i;</span><br><span class="line">  <span class="comment">//11-15</span></span><br><span class="line">&#125;;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,<span class="keyword">sizeof</span>(struct S1));        <span class="comment">//16</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//练习二</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">S2</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">  <span class="keyword">char</span> a;</span><br><span class="line">  <span class="comment">//0</span></span><br><span class="line">  <span class="class"><span class="keyword">struct</span> <span class="title">S1</span> <span class="title">S</span>;</span></span><br><span class="line">  <span class="comment">//8-23</span></span><br><span class="line">  <span class="keyword">double</span> f;</span><br><span class="line">  <span class="comment">//24-31</span></span><br><span class="line">&#125;;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,<span class="keyword">sizeof</span>(struct S2));        <span class="comment">//32</span></span><br></pre></td></tr></table></figure><p><em>附加：</em></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></pre></td><td class="code"><pre><span class="line"><span class="comment">//宏，表示结构体成员变量在内存中偏移量包含于头文件#include &lt;stddef.h&gt;</span></span><br><span class="line">offsetof(struct S,   A);</span><br><span class="line"></span><br><span class="line">宏实现：（<span class="keyword">size_t</span>）&amp;(((S*)<span class="number">0</span>)-&gt;m)</span><br></pre></td></tr></table></figure><h2 id="结构体传参"><a href="#结构体传参" class="headerlink" title="结构体传参"></a>结构体传参</h2><blockquote><p>讲解函数栈桢的时候，我们知道函数传参是需要参数压栈的，如果传递的是一个结构体对象，而结构体过大，参数压栈的系统开销就会很大，所以导致系统性能下降。</p></blockquote><p><strong>结论</strong></p><blockquote><p>结构体传参的时候要传<strong>结构体指针。</strong></p></blockquote><h2 id="位段"><a href="#位段" class="headerlink" title="位段"></a>位段</h2><h3 id="什么是位段？"><a href="#什么是位段？" class="headerlink" title="什么是位段？"></a>什么是位段？</h3><p><em>位段声明与结构体类型相似，有两个不同：</em></p><blockquote><ul><li>位段成员必须int 、unsigned int 或 signed int。</li><li>位段成员名后面有一个冒号和一个数字。</li></ul></blockquote><h3 id="位段内存分配"><a href="#位段内存分配" class="headerlink" title="位段内存分配"></a>位段内存分配</h3><blockquote><ul><li>位段成员可以是int 、unsigned int、signed int、或者char(整形家族)类型。</li><li>位段的空间上按四个字节（int）或者一个字节（char）方式开辟</li><li>位段涉及很多不确定因素，位段是不跨平台的，注重可移植性程序因避免使用位段。</li></ul></blockquote><p><strong>eg：</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">A</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> a:<span class="number">2</span>;</span><br><span class="line"><span class="keyword">int</span> b:<span class="number">5</span>;</span><br><span class="line"><span class="keyword">int</span> c:<span class="number">10</span>;</span><br><span class="line"><span class="keyword">int</span> d:<span class="number">30</span>;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d"</span>,<span class="keyword">sizeof</span>(struct A)); <span class="comment">//8</span></span><br></pre></td></tr></table></figure></p><h3 id="位段跨平台问题"><a href="#位段跨平台问题" class="headerlink" title="位段跨平台问题"></a>位段跨平台问题</h3><blockquote><ul><li>int位段当成有符号还是无符号是不确定的</li><li>位段中最大位数目不确定的</li><li>位段中成员是从左到右还是从右到左是不确定的</li><li>当一个结构体包含两个位段，第二个位段成员比较大，无法容纳于第一个位段剩余的位时，是舍弃剩余的还是利用，是不确定的</li></ul></blockquote><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><blockquote><p>跟结构相比，位段可以达到同样的效果，还节省空间，但是因为存在跨平台问题，所以运用的就不是很多了。</p></blockquote><h1 id="枚举"><a href="#枚举" class="headerlink" title="枚举"></a>枚举</h1><blockquote><p>枚举顾名思义就是一一列举。<br>比如：星期、颜色、性别等；</p></blockquote><h2 id="枚举类型定义"><a href="#枚举类型定义" class="headerlink" title="枚举类型定义"></a>枚举类型定义</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> Color</span><br><span class="line">&#123;</span><br><span class="line">RED,</span><br><span class="line">GRENE,</span><br><span class="line">BLUE</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><em>以上定义的enum Color 就是枚举类型，{}中内容就是可能取值，也叫枚举常量，默认从零开始一次递增1，当然有时候也可以自定义赋值：</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> Color</span><br><span class="line">&#123;</span><br><span class="line">RED = <span class="number">1</span>,</span><br><span class="line">GREEN = <span class="number">4</span>,</span><br><span class="line">BLUE = <span class="number">8</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></p><h2 id="枚举优点"><a href="#枚举优点" class="headerlink" title="枚举优点"></a>枚举优点</h2><blockquote><ul><li>增加代码可读性与可维护性</li><li>与#define相比有类型检查，更加严谨</li><li>防止命名污染</li><li>便于调试</li><li>使用方便，一次可定义多个常量</li></ul></blockquote><h1 id="联合（共用体）"><a href="#联合（共用体）" class="headerlink" title="联合（共用体）"></a>联合（共用体）</h1><h2 id="联合定义"><a href="#联合定义" class="headerlink" title="联合定义"></a>联合定义</h2><blockquote><p>联合也是一种特殊自定义类型，该类型定义变量也包含一系列成员，特征是这些成员公用一块空间。</p></blockquote><p><strong>eg</strong></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></pre></td><td class="code"><pre><span class="line"><span class="comment">//联合类型声明</span></span><br><span class="line"><span class="keyword">union</span> Un</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">char</span> c;</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">//联合变量的定义</span></span><br><span class="line"><span class="keyword">union</span> Un un;</span><br><span class="line"><span class="comment">//计算变量大小</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d"</span>,<span class="keyword">sizeof</span>(un)); <span class="comment">//4</span></span><br></pre></td></tr></table></figure><h2 id="联合特点"><a href="#联合特点" class="headerlink" title="联合特点"></a>联合特点</h2><blockquote><p>联合成员公用一块内存空间，这样一个联合变量大小，至少是最大成员大小。</p></blockquote><h2 id="经典应用"><a href="#经典应用" class="headerlink" title="经典应用"></a>经典应用</h2><blockquote><p>判断当前计算机大小端存储：</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> CheckSystem（）</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">union</span> Un</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> a;</span><br><span class="line"><span class="keyword">char</span> i;</span><br><span class="line">&#125;un;</span><br><span class="line">un.a = <span class="number">1</span>;</span><br><span class="line"><span class="comment">//返回为1,小端存储</span></span><br><span class="line"><span class="comment">//返回为0，大端存储</span></span><br><span class="line"><span class="keyword">return</span> nu.i;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="联合大小的计算"><a href="#联合大小的计算" class="headerlink" title="联合大小的计算"></a>联合大小的计算</h2><blockquote><ul><li>联合大小至少是最大成员大小</li><li>当最大成员大小不是最大对齐数整数倍时，就要对齐到最大对齐数的整数倍</li></ul></blockquote><p><strong>eg</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">union</span> UN1</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">char</span> arr[<span class="number">5</span>];</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">union</span> UN2</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">short</span> c[<span class="number">7</span>];</span><br><span class="line"><span class="keyword">int</span> i;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d"</span>,<span class="keyword">sizeof</span>(<span class="keyword">union</span> UN1));   <span class="comment">//8</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d"</span>,<span class="keyword">sizeof</span>(<span class="keyword">union</span> UN2));   <span class="comment">//16</span></span><br></pre></td></tr></table></figure></p><h1 id="结构体与联合巧妙使用："><a href="#结构体与联合巧妙使用：" class="headerlink" title="结构体与联合巧妙使用："></a>结构体与联合巧妙使用：</h1><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="comment">//将long类型ip地址，转换为电分十进制形式</span></span><br><span class="line"><span class="keyword">union</span> ip_addr</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">long</span> addr;</span><br><span class="line"><span class="class"><span class="keyword">struct</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">char</span> c1;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">char</span> c2;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">char</span> c3;</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">char</span> c4;</span><br><span class="line">&#125;ip;</span><br><span class="line"><span class="keyword">union</span> ip_addr my_ip;</span><br><span class="line">my_ip.addr = <span class="number">176238749</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d.%d.%d.%d"</span>,my_ip.ip.c4,my_ip.ip.c3,my_ip.ip.c2,my_ip.ip.c1,);</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p>通过自定义类型学习，掌握了内存对齐等相关运用，以及如何检验大小端问题。<br><strong>好好学习，天天编程</strong></p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;对于C语言的学习，我们知道有基本数据类型，指针类型，自定义类型等。今天一起来探讨一下自定义类型。&lt;br&gt;
    
    </summary>
    
      <category term="C语言知识及题集" scheme="https://gbrweb.github.io/categories/C%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86%E5%8F%8A%E9%A2%98%E9%9B%86/"/>
    
    
      <category term="结构体" scheme="https://gbrweb.github.io/tags/%E7%BB%93%E6%9E%84%E4%BD%93/"/>
    
  </entry>
  
  <entry>
    <title>【C语言】静态(动态)顺序表-通讯录</title>
    <link href="https://gbrweb.github.io/2018/05/29/2018529/"/>
    <id>https://gbrweb.github.io/2018/05/29/2018529/</id>
    <published>2018-05-29T13:54:55.000Z</published>
    <updated>2018-06-02T10:01:55.061Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>近期学习了自定义类型结构体以及顺序表，所以就试着利用顺序表模拟实现了一个通讯录。<br> <a id="more"></a></p></blockquote><h1 id="简要功能如下："><a href="#简要功能如下：" class="headerlink" title="简要功能如下："></a>简要功能如下：</h1><blockquote><ul><li>初始化通讯录</li><li>添加联系人</li><li>查找联系人</li><li>删除联系人</li><li>修改联系人</li><li>按姓名排序</li><li>清空联系人</li><li>联系人列表</li><li>退出</li></ul></blockquote><h1 id="项目效果展示："><a href="#项目效果展示：" class="headerlink" title="项目效果展示："></a>项目效果展示：</h1><p> <img src="/img/20185291.png" alt="图片加载中"></p><p> <img src="/img/20185292.png" alt="图片加载中"></p><p> <img src="/img/20185293.png" alt="图片加载中"></p><p> <img src="/img/20185294.png" alt="图片加载中"></p><h1 id="静态顺序表"><a href="#静态顺序表" class="headerlink" title="静态顺序表"></a>静态顺序表</h1><h2 id="参考代码："><a href="#参考代码：" class="headerlink" title="参考代码："></a>参考代码：</h2><h3 id="Contact-h"><a href="#Contact-h" class="headerlink" title="Contact.h"></a>Contact.h</h3><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/***********************************************************</span></span><br><span class="line"><span class="comment">*                      程序名称：通讯录（静态顺序表）         *</span></span><br><span class="line"><span class="comment">*                      编译环境：VS2013                     *</span></span><br><span class="line"><span class="comment">*                      编制日期：2018.5.28                  *</span></span><br><span class="line"><span class="comment">*                                      -----by Hunter  *</span></span><br><span class="line"><span class="comment">***********************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifndef</span> __CONTACT_H__</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> __CONTACT_H__</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;assert.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">enum</span> OPPTION</span><br><span class="line">&#123;</span><br><span class="line">EXIT,</span><br><span class="line">ADD,</span><br><span class="line">SEARCH,</span><br><span class="line">DEIETE,</span><br><span class="line">MODIFY,</span><br><span class="line">SORT,</span><br><span class="line">SHOW,</span><br><span class="line">EMPTY</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">char</span> datatype;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_NAME 10</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SEX 5</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_TEL 11</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_ADDR 30</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SIZE 1000</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">PeoInfo</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">datatype Name[MAX_NAME];</span><br><span class="line">datatype Sex[MAX_SEX];</span><br><span class="line"><span class="keyword">int</span> age;</span><br><span class="line">datatype Tel[MAX_TEL];</span><br><span class="line">datatype Addr[MAX_ADDR];</span><br><span class="line">&#125;PeoInfo, *pPeoInfo;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Contact</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">PeoInfo data[MAX_SIZE];</span><br><span class="line"><span class="keyword">int</span> size;</span><br><span class="line">&#125;Contact,*pContact;</span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//添加联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AddContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//查找联系人</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SearchContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//删除联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DeleteContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//修改联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ModifyContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//按姓排序</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SortContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//列表联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//清空联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">EmptyContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span> <span class="comment">//__CONTACT_H__</span></span></span><br></pre></td></tr></table></figure><h3 id="Contact-c"><a href="#Contact-c" class="headerlink" title="Contact.c"></a>Contact.c</h3><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><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"contact.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">memset</span>(pc-&gt;data, <span class="number">0</span>, <span class="keyword">sizeof</span>(pc-&gt;data));</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//添加联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AddContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (pc-&gt;size == MAX_SIZE)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t空间不足"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入姓名:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入性别:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Sex);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入年龄:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;pc-&gt;data[pc-&gt;size].age);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入电话号:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Tel);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入地址:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Addr);</span><br><span class="line">pc-&gt;size++;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t添加成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//查找联系人</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SearchContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">char</span> name[MAX_NAME];</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无此联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\tName\tSex\tAge\tTel\t\tAddr\n"</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == <span class="built_in">strcmp</span>(pc-&gt;data[i].Name, name))</span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n"</span>,</span><br><span class="line">pc-&gt;data[i].Name,</span><br><span class="line">pc-&gt;data[i].Sex,</span><br><span class="line">pc-&gt;data[i].age,</span><br><span class="line">pc-&gt;data[i].Tel,</span><br><span class="line">pc-&gt;data[i].Addr);</span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无此联系人\n"</span>);</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">&#125;</span><br><span class="line"><span class="comment">//删除联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DeleteContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> num = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">num = SearchContact(pc);</span><br><span class="line"><span class="keyword">if</span> (num != <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t确定删除？  1.yes,  2.no:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">1</span> == n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (i = num; i &lt; (pc-&gt;size) - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line">pc-&gt;data[i] = pc-&gt;data[i + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">pc-&gt;size--;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t删除成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//交换</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Swap</span><span class="params">(pPeoInfo *a, pPeoInfo *b)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">pPeoInfo *Tmp;</span><br><span class="line">Tmp = *a;</span><br><span class="line">*a = *b;</span><br><span class="line">*b = Tmp;</span><br><span class="line"></span><br><span class="line">&#125;</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="function"><span class="keyword">void</span> <span class="title">ModifyContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> modify = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">modify = SearchContact(pc);</span><br><span class="line"><span class="keyword">if</span> (modify != <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t确认修改？1.yes  2.no:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">1</span> == n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入姓名:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入性别:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Sex);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入年龄:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;pc-&gt;data[modify].age);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入电话号:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Tel);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入地址:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Addr);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t修改成功\n"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//按姓排序</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SortContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> flag = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 冒泡次数</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//冒泡排序</span></span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; pc-&gt;size - i - <span class="number">1</span>; j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strcmp</span>(pc-&gt;data[j].Name,pc-&gt;data[j + <span class="number">1</span>].Name)&gt;<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">Swap(&amp;pc-&gt;data[j], &amp;pc-&gt;data[j + <span class="number">1</span>]);</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == flag)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"排序成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//列表联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\tName\tSex\tAge\tTel\t\tAddr\n"</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n"</span>,</span><br><span class="line">pc-&gt;data[i].Name,</span><br><span class="line">pc-&gt;data[i].Sex,</span><br><span class="line">pc-&gt;data[i].age,</span><br><span class="line">pc-&gt;data[i].Tel,</span><br><span class="line">pc-&gt;data[i].Addr);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//清空联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">EmptyContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"清空成功"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="test-c"><a href="#test-c" class="headerlink" title="test.c"></a>test.c</h3><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"contact.h"</span></span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">meau</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t******         《通讯录》       ********\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****************************************\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 1.添加信息       2.查找信息******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 3.删除信息       4.修改信息******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 5.按姓排序       6.信息列表******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 7.清空信息       0.退出    ******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****************************************\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">test</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> input = <span class="number">0</span>;</span><br><span class="line">Contact pc;</span><br><span class="line">InitContact(&amp;pc);</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">&#123;</span><br><span class="line">meau();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请选择:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;input);</span><br><span class="line"><span class="keyword">switch</span> (input)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> ADD:</span><br><span class="line">AddContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SEARCH:</span><br><span class="line">SearchContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> DEIETE:</span><br><span class="line">DeleteContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> MODIFY:</span><br><span class="line">ModifyContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SORT:</span><br><span class="line">SortContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SHOW:</span><br><span class="line">ShowContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> EMPTY:</span><br><span class="line">EmptyContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> EXIT:</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t输入有误，请重新输入:&gt;"</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">while</span> (input);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">test();</span><br><span class="line">system(<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">&#125;</span><br></pre></td></tr></table></figure><h1 id="动态顺序表"><a href="#动态顺序表" class="headerlink" title="动态顺序表"></a>动态顺序表</h1><h2 id="参考代码"><a href="#参考代码" class="headerlink" title="参考代码"></a>参考代码</h2><h3 id="Contact-h-1"><a href="#Contact-h-1" class="headerlink" title="Contact.h"></a>Contact.h</h3><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/***********************************************************</span></span><br><span class="line"><span class="comment">*                      程序名称：通讯录（静态顺序表）     *</span></span><br><span class="line"><span class="comment">*                      编译环境：VS2013                    *</span></span><br><span class="line"><span class="comment">*                      编制日期：2018.5.28                 *</span></span><br><span class="line"><span class="comment">*                                      -----by Hunter   *</span></span><br><span class="line"><span class="comment">***********************************************************/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifndef</span> __CONTACT_H__</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> __CONTACT_H__</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;Windows.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;assert.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">enum</span> OPPTION</span><br><span class="line">&#123;</span><br><span class="line">EXIT,</span><br><span class="line">ADD,</span><br><span class="line">SEARCH,</span><br><span class="line">DEIETE,</span><br><span class="line">MODIFY,</span><br><span class="line">SORT,</span><br><span class="line">SHOW,</span><br><span class="line">EMPTY</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">char</span> datatype;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_NAME 10</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SEX 5</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_TEL 11</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_ADDR 30</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAX_SIZE 1000</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">PeoInfo</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">datatype Name[MAX_NAME];</span><br><span class="line">datatype Sex[MAX_SEX];</span><br><span class="line"><span class="keyword">int</span> age;</span><br><span class="line">datatype Tel[MAX_TEL];</span><br><span class="line">datatype Addr[MAX_ADDR];</span><br><span class="line">&#125;PeoInfo, *pPeoInfo;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Contact</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">pPeoInfo data;</span><br><span class="line"><span class="keyword">int</span> size;</span><br><span class="line"><span class="keyword">int</span> capacity;</span><br><span class="line">&#125;Contact, *pContact;</span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//添加联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AddContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//删除联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DeleteContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//查找联系人</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SearchContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//修改联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ModifyContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//按姓排序</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SortContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//列表联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//清空联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">EmptyContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"><span class="comment">//销毁</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DestoryContact</span><span class="params">(pContact pc)</span></span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span> <span class="comment">//__CONTACT_H__</span></span></span><br></pre></td></tr></table></figure><h3 id="Contact-c-1"><a href="#Contact-c-1" class="headerlink" title="Contact.c"></a>Contact.c</h3><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><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"contact.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">//初始化通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line">pc-&gt;capacity = <span class="number">3</span>;</span><br><span class="line">pc-&gt;data = (pPeoInfo)<span class="built_in">malloc</span>((pc-&gt;capacity)*<span class="keyword">sizeof</span>(PeoInfo));</span><br><span class="line"><span class="keyword">if</span> (pc-&gt;data == <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t内存分配失败"</span>);</span><br><span class="line"><span class="built_in">exit</span>(EXIT_FAILURE);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">memset</span>(pc-&gt;data,<span class="number">0</span>,<span class="keyword">sizeof</span>(pc-&gt;data));</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//检查扩容</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">CheckCapacity</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pPeoInfo *p = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">if</span> (pc-&gt;size == pc-&gt;capacity)</span><br><span class="line">&#123;</span><br><span class="line">p = (pPeoInfo)<span class="built_in">realloc</span>(pc-&gt;data, (pc-&gt;capacity + <span class="number">2</span>)*<span class="keyword">sizeof</span>(PeoInfo));</span><br><span class="line"><span class="keyword">if</span> (p != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line">pc-&gt;data = p;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t增容失败"</span>);</span><br><span class="line"><span class="built_in">exit</span>(EXIT_FAILURE);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pc-&gt;capacity += <span class="number">2</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t增容成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//添加联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">AddContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (pc-&gt;size == MAX_SIZE)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t空间不足"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">CheckCapacity(pc);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入姓名:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入性别:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Sex);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入年龄:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;pc-&gt;data[pc-&gt;size].age);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入电话号:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Tel);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入地址:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[pc-&gt;size].Addr);</span><br><span class="line">pc-&gt;size++;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t添加成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//查找联系人</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">SearchContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">char</span> name[MAX_NAME];</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无此联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\tName\tSex\tAge\tTel\t\tAddr\n"</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == <span class="built_in">strcmp</span>(pc-&gt;data[i].Name, name))</span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n"</span>,</span><br><span class="line">pc-&gt;data[i].Name,</span><br><span class="line">pc-&gt;data[i].Sex,</span><br><span class="line">pc-&gt;data[i].age,</span><br><span class="line">pc-&gt;data[i].Tel,</span><br><span class="line">pc-&gt;data[i].Addr);</span><br><span class="line"><span class="keyword">return</span> i;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无此联系人\n"</span>);</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">&#125;</span><br><span class="line"><span class="comment">//删除联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DeleteContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> num = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">num = SearchContact(pc);</span><br><span class="line"><span class="keyword">if</span> (num != <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t确定删除？  1.yes,  2.no:&gt;"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">1</span> == n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (i = num; i &lt; (pc-&gt;size) - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line">pc-&gt;data[i] = pc-&gt;data[i + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">pc-&gt;size--;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t删除成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//交换</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Swap</span><span class="params">(pPeoInfo *a, pPeoInfo *b)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">pPeoInfo *Tmp;</span><br><span class="line">Tmp = *a;</span><br><span class="line">*a = *b;</span><br><span class="line">*b = Tmp;</span><br><span class="line"></span><br><span class="line">&#125;</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="function"><span class="keyword">void</span> <span class="title">ModifyContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> modify = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">modify = SearchContact(pc);</span><br><span class="line"><span class="keyword">if</span> (modify != <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t确认修改？1.yes  2.no:&gt;"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;n);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">1</span> == n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入姓名:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入性别:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Sex);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入年龄:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;pc-&gt;data[modify].age);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入电话号:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Tel);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请输入地址:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>, pc-&gt;data[modify].Addr);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t修改成功\n"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//按姓排序</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SortContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> flag = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 冒泡次数</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//冒泡排序</span></span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; pc-&gt;size - i - <span class="number">1</span>; j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">strcmp</span>(pc-&gt;data[j].Name, pc-&gt;data[j + <span class="number">1</span>].Name)&gt;<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">Swap(&amp;pc-&gt;data[j], &amp;pc-&gt;data[j + <span class="number">1</span>]);</span><br><span class="line">flag = <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == flag)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"排序成功\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//列表联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="keyword">if</span> (<span class="number">0</span> == pc-&gt;size)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t无联系人\n"</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\tName\tSex\tAge\tTel\t\tAddr\n"</span>);</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; pc-&gt;size; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n"</span>,</span><br><span class="line">pc-&gt;data[i].Name,</span><br><span class="line">pc-&gt;data[i].Sex,</span><br><span class="line">pc-&gt;data[i].age,</span><br><span class="line">pc-&gt;data[i].Tel,</span><br><span class="line">pc-&gt;data[i].Addr);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//清空联系人</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">EmptyContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t清空成功"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//销毁通讯录</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DestoryContact</span><span class="params">(pContact pc)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">assert(pc);</span><br><span class="line"><span class="built_in">free</span>(pc-&gt;data);</span><br><span class="line">pc-&gt;data = <span class="literal">NULL</span>;</span><br><span class="line">pc-&gt;capacity = <span class="number">0</span>;</span><br><span class="line">pc-&gt;size = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t销毁成功"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="test-c-1"><a href="#test-c-1" class="headerlink" title="test.c"></a>test.c</h3><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"contact.h"</span></span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">meau</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t******         《通讯录》       ********\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****************************************\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 1.添加信息       2.查找信息******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 3.删除信息       4.修改信息******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 5.按姓排序       6.信息列表******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****** 7.清空信息       0.退出    ******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t****************************************\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">test</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> input = <span class="number">0</span>;</span><br><span class="line">Contact pc;</span><br><span class="line">InitContact(&amp;pc);</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">&#123;</span><br><span class="line">meau();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t请选择:&gt;"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;input);</span><br><span class="line"><span class="keyword">switch</span> (input)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> ADD:</span><br><span class="line">AddContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SEARCH:</span><br><span class="line">SearchContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> DEIETE:</span><br><span class="line">DeleteContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> MODIFY:</span><br><span class="line">ModifyContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SORT:</span><br><span class="line">SortContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> SHOW:</span><br><span class="line">ShowContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> EMPTY:</span><br><span class="line">EmptyContact(&amp;pc);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> EXIT:</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">1</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\t\t\t输入有误，请重新输入:&gt;"</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">while</span> (input);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">Contact pc;</span><br><span class="line">test();</span><br><span class="line"><span class="comment">//销毁通讯录</span></span><br><span class="line">DestoryContact(&amp;pc);</span><br><span class="line">  system(<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">&#125;</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p>今天简单实现了基于静态（动态）顺序表的通讯录，需再努力继续实现链表通讯录。  </p></blockquote><p> <strong>不忘初心，方得始终！</strong>      </p>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;近期学习了自定义类型结构体以及顺序表，所以就试着利用顺序表模拟实现了一个通讯录。&lt;br&gt;
    
    </summary>
    
      <category term="项目实战" scheme="https://gbrweb.github.io/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/"/>
    
    
      <category term="通讯录" scheme="https://gbrweb.github.io/tags/%E9%80%9A%E8%AE%AF%E5%BD%95/"/>
    
  </entry>
  
  <entry>
    <title>二分查找，你真的掌握了吗？</title>
    <link href="https://gbrweb.github.io/2018/05/27/2018528/"/>
    <id>https://gbrweb.github.io/2018/05/27/2018528/</id>
    <published>2018-05-27T13:54:50.000Z</published>
    <updated>2018-06-01T16:28:51.247Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>二分查找，最基本的算法之一，也是面试中常被考察的重点，因为基本的算法最能反映出一个人的基础是否扎实。本文对二分查找相关题目做一个总结。</p></blockquote><a id="more"></a><h2 id="二分查找函数实现："><a href="#二分查找函数实现：" class="headerlink" title="二分查找函数实现："></a>二分查找函数实现：</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">bin_search</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> mid = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line"><span class="keyword">while</span> (low &lt;= high)</span><br><span class="line">&#123;</span><br><span class="line">mid = low + (high - low) &gt;&gt; <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (arr[mid] == key)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span> mid;<span class="comment">//找到返回下标</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (arr[mid] &lt; key)</span><br><span class="line">&#123;</span><br><span class="line">low = mid + <span class="number">1</span>;</span><br><span class="line">&#125;</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">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">-1</span>;<span class="comment">//找不到返回-1</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="题目一"><a href="#题目一" class="headerlink" title="题目一"></a>题目一</h2><blockquote><p>给定一个有序（非降序）数组A，求任意一个i使得A[i]等于key，不存在则返回-1</p></blockquote><p><em>这个是最原始的二分查找题目，利用数组的有序特性，拆半查找，使得查找时间复杂度为O(logN)。请参考实现代码与注释。</em><br><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">int</span> <span class="title">search</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt;= high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="comment">// 注意：若使用(low+high)/2求中间位置容易溢出  </span></span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low)&gt;&gt;<span class="number">1</span>);   </span><br><span class="line">        <span class="keyword">if</span>(A[mid] == key)  </span><br><span class="line">            <span class="keyword">return</span> mid;  </span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(A[mid] &lt; key)  </span><br><span class="line">            low = mid+<span class="number">1</span>;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &gt; key  </span></span><br><span class="line">            high = mid<span class="number">-1</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目二"><a href="#题目二" class="headerlink" title="题目二"></a>题目二</h2><blockquote><p>给定一个有序（非降序）数组A，可含有重复元素，求最小的i使得A[i]等于key，不存在则返回-1</p></blockquote><p><em>此题也就是求key在数组中第一次出现的位置。这里可能会有人想先直接用原始的二分查找，如果不存在直接返回-1，如果存在，然后再顺序找到这个等于key值区间的最左位置，这样的话，最坏情况下的复杂度就是O（n）了，没有完全发挥出二分查找的优势。这里的解法具体过程请参考实现代码与注释。</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchFirstPos</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">if</span>(n &lt;= <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt; high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low)&gt;&gt;<span class="number">1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] &lt; key)  </span><br><span class="line">            low = mid+<span class="number">1</span>;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &gt;= key  </span></span><br><span class="line">            high = mid;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="comment">/*  </span></span><br><span class="line"><span class="comment">    循环过程中，当low大于0时，A[low-1]是小于key的，因为A[mid] &lt; key时，</span></span><br><span class="line"><span class="comment">    low=mid+1；当high小于n-1时，A[high]是大于等于key的，因为A[mid] &gt;= key时，</span></span><br><span class="line"><span class="comment">    high = mid；循环结束时，low 等于 high，所以，如果A[low](A[high])等于key，</span></span><br><span class="line"><span class="comment">    那么low(high)就是key出现的最小位置，否则key在数组中不存在。</span></span><br><span class="line"><span class="comment">    */</span>  </span><br><span class="line">    <span class="keyword">if</span>(A[low] != key)  </span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">else</span>  </span><br><span class="line">        <span class="keyword">return</span> low;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目三"><a href="#题目三" class="headerlink" title="题目三"></a>题目三</h2><blockquote><p>给定一个有序（非降序）数组A，可含有重复元素，求最大的i使得A[i]等于key，不存在则返回-1</p></blockquote><p><em>此题也就是求key在数组中最后一次出现的位置。与上一题基本一样，但是有个地方要注意，具体请参考实现代码与注释。</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchLastPos</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;     </span><br><span class="line">    <span class="keyword">if</span>(n &lt;= <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt; high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        这里中间位置的计算就不能用low+((high-low)&gt;&gt;1)了，因为当low+1等于high</span></span><br><span class="line"><span class="comment">        且A[low] &lt;= key时，会死循环；所以这里要使用low+((high-low+1)&gt;&gt;1)，</span></span><br><span class="line"><span class="comment">        这样能够保证循环会正常结束。</span></span><br><span class="line"><span class="comment">        */</span>  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low+<span class="number">1</span>)&gt;&gt;<span class="number">1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] &gt; key)  </span><br><span class="line">            high = mid<span class="number">-1</span>;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &lt;= key  </span></span><br><span class="line">            low = mid;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="comment">/*  </span></span><br><span class="line"><span class="comment">    循环过程中，当high小于n-1时，A[high+1]是大于key的，因为A[mid] &gt; key时，</span></span><br><span class="line"><span class="comment">    high=mid-1；当low大于0时，A[low]是小于等于key的，因为A[mid] &lt;= key时，</span></span><br><span class="line"><span class="comment">    low = mid；循环结束时，low 等于 high，所以，如果A[high](A[low])等于key，</span></span><br><span class="line"><span class="comment">    那么high(low)就是key出现的最大位置，否则key在数组中不存在。</span></span><br><span class="line"><span class="comment">    */</span>  </span><br><span class="line">    <span class="keyword">if</span>(A[high] != key)  </span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">else</span>  </span><br><span class="line">        <span class="keyword">return</span> high;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目四"><a href="#题目四" class="headerlink" title="题目四"></a>题目四</h2><blockquote><p>给定一个有序（非降序）数组A，可含有重复元素，求最大的i使得A[i]小于key，不存在则返回-1</p></blockquote><p><em>也就是求小于key的最大元素的位置。请参考实现代码与注释。</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchLastPosLessThan</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">if</span>(n &lt;= <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt; high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low+<span class="number">1</span>)&gt;&gt;<span class="number">1</span>); <span class="comment">// 注意，不要导致死循环  </span></span><br><span class="line">        <span class="keyword">if</span>(A[mid] &lt; key)  </span><br><span class="line">            low = mid;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &gt;= key  </span></span><br><span class="line">            high = mid<span class="number">-1</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="comment">/*  </span></span><br><span class="line"><span class="comment">    循环过程中，当low大于0时，A[low]是小于key的，因为A[mid] &lt; key时，</span></span><br><span class="line"><span class="comment">    low=mid；当high小于n-1时，A[high+1]是大于等于key的，因为A[mid] &gt;= key时，</span></span><br><span class="line"><span class="comment">    high = mid-1；循环结束时，low 等于 high，所以，如果A[low](A[high])小于key，</span></span><br><span class="line"><span class="comment">    那么low(high)就是要找的位置，否则不存在这样的位置（A[0] &gt;= key时）。</span></span><br><span class="line"><span class="comment">    */</span>  </span><br><span class="line">    <span class="keyword">return</span> A[low] &lt; key ? low : <span class="number">-1</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目五"><a href="#题目五" class="headerlink" title="题目五"></a>题目五</h2><blockquote><p>给定一个有序（非降序）数组A，可含有重复元素，求最小的i使得A[i]大于key，不存在则返回-1。</p></blockquote><p><em>也就是求大于key的最小元素的位置。请参考实现代码与注释。</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchFirstPosGreaterThan</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">if</span>(n &lt;= <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt; high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low)&gt;&gt;<span class="number">1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] &gt; key)  </span><br><span class="line">            high = mid;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &lt;= key  </span></span><br><span class="line">            low = mid+<span class="number">1</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="comment">/*  </span></span><br><span class="line"><span class="comment">    循环过程中，当low大于0时，A[low-1]是小于等于key的，因为A[mid] &lt;= key时，</span></span><br><span class="line"><span class="comment">    low=mid+1；当high小于n-1时，A[high]是大于key的，因为A[mid] &gt; key时，</span></span><br><span class="line"><span class="comment">    high = mid；循环结束时，low 等于 high，所以，如果A[high](A[low])大于key，</span></span><br><span class="line"><span class="comment">    那么high(low)就是要找的位置，否则不存在这样的位置（A[n-1] &lt;= key时）。</span></span><br><span class="line"><span class="comment">    */</span>  </span><br><span class="line">    <span class="keyword">return</span> A[high] &gt; key ? high : <span class="number">-1</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目六"><a href="#题目六" class="headerlink" title="题目六"></a>题目六</h2><blockquote><p>给定一个有序（非降序）数组A，可含有重复元素，求key在数组中出现的次数</p></blockquote><p><em>求出第一次出现位置和最后一次出现位置。由于前面都已实现，这里不多解释。请参考实现代码与注释</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">count</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> firstPos = searchFirstPos(A, n, key); <span class="comment">// 第一次出现位置  </span></span><br><span class="line">    <span class="keyword">if</span>(firstPos == <span class="number">-1</span>)  </span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> lastPos = searchLastPos(A, n, key);  <span class="comment">// 最后一次出现位置  </span></span><br><span class="line">    <span class="keyword">return</span> lastPos-firstPos+<span class="number">1</span>;  <span class="comment">// 出现次数  </span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目七"><a href="#题目七" class="headerlink" title="题目七"></a>题目七</h2><blockquote><p>给定一个有序（非降序）数组A，若key在数组中出现，返回位置，若不存在，返回它应该插入的位置</p></blockquote><p><em>如  [1,3,5,6], 5 → 2<br>[1,3,5,6], 2 → 1<br>[1,3,5,6], 7 → 4<br>[1,3,5,6], 0 → 0</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchInsert</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span> </span>&#123;  </span><br><span class="line">    <span class="comment">// 如果比最大值还大，那插入位置就是位置n  </span></span><br><span class="line">    <span class="keyword">if</span>(A[n<span class="number">-1</span>] &lt; key)   </span><br><span class="line">        <span class="keyword">return</span> n;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt; high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low)&gt;&gt;<span class="number">1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] &gt;= key)  </span><br><span class="line">            high = mid;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &lt; key  </span></span><br><span class="line">            low = mid+<span class="number">1</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="comment">/*   </span></span><br><span class="line"><span class="comment">    循环过程中，当low大于0时，A[low-1]是小于key的，因为A[mid] &lt; key时，  </span></span><br><span class="line"><span class="comment">    low=mid+1；当high小于n-1时，A[high]是大于等于key的，因为A[mid] &gt;= key时，  </span></span><br><span class="line"><span class="comment">    high = mid；循环结束时，low 等于 high，所以，如果A[low](A[high])等于key，  </span></span><br><span class="line"><span class="comment">    那么low(high)就是key出现的位置，否则low就是key在数组中应该插入的位置。  </span></span><br><span class="line"><span class="comment">    */</span>  </span><br><span class="line">    <span class="keyword">return</span> high;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目八"><a href="#题目八" class="headerlink" title="题目八"></a>题目八</h2><blockquote><p>给定一个有序（非降序）数组A，可含有重复元素，求绝对值最小的元素的位置</p></blockquote><p><em>找第一个大于等于0的位置，然后和前一个元素的绝对值比较，返回绝对值较小的元素的位置。请参考实现代码与注释</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchMinAbs</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt; high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low)&gt;&gt;<span class="number">1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] &lt; <span class="number">0</span>)  </span><br><span class="line">            low = mid+<span class="number">1</span>;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &gt;= 0  </span></span><br><span class="line">            high = mid;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="comment">/* 循环结束时，如果low != n-1，A[low] &gt;= 0，如果low&gt;0，A[low-1] &lt; 0 */</span>  </span><br><span class="line">    <span class="keyword">if</span>(low &gt; <span class="number">0</span> &amp;&amp; <span class="built_in">abs</span>(A[low<span class="number">-1</span>]) &lt; <span class="built_in">abs</span>(A[low]))  </span><br><span class="line">        <span class="keyword">return</span> low<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">else</span>  </span><br><span class="line">        <span class="keyword">return</span> low;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目九"><a href="#题目九" class="headerlink" title="题目九"></a>题目九</h2><blockquote><p>给定一个有序（非降序）数组A和一个有序（非降序）数组B，可含有重复元素，求两个数组合并结果中的第k(k&gt;=0)个数字</p></blockquote><p><em>这个题目出现了两个数组，有序的，不管怎样我们就应该首先考虑二分查找是否可行。若使用顺序查找，时间复杂度最低为O(k)，就是类似归并排序中的归并过程。使用用二分查找时间复杂度为O(logM+logN)。二分查找的具体实现过程请参考实现代码与注释。</em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">findKthIn2SortedArrays</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> m, <span class="keyword">int</span> B[], <span class="keyword">int</span> n, <span class="keyword">int</span> k)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">if</span>(m &lt;= <span class="number">0</span>) <span class="comment">// 数组A中没有元素，直接在B中找第k个元素  </span></span><br><span class="line">        <span class="keyword">return</span> B[k];  </span><br><span class="line">    <span class="keyword">if</span>(n &lt;= <span class="number">0</span>) <span class="comment">// 数组B中没有元素，直接在A中找第k个元素  </span></span><br><span class="line">        <span class="keyword">return</span> A[k];  </span><br><span class="line">    <span class="keyword">int</span> i = (m<span class="number">-1</span>)&gt;&gt;<span class="number">1</span>; <span class="comment">// 数组A的中间位置  </span></span><br><span class="line">    <span class="keyword">int</span> j = (n<span class="number">-1</span>)&gt;&gt;<span class="number">1</span>; <span class="comment">// 数组B的中间位置  </span></span><br><span class="line">    <span class="keyword">if</span>(A[i] &lt;= B[j])  <span class="comment">// 数组A的中间元素小于等于数组B的中间元素  </span></span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        设x为数组A和数组B中小于B[j]的元素数目，则i+1+j+1小于等于x，</span></span><br><span class="line"><span class="comment">        因为A[i+1]到A[m-1]中还可能存在小于等于B[j]的元素；</span></span><br><span class="line"><span class="comment">        如果k小于i+1+j+1，那么要查找的第k个元素肯定小于等于B[j]，</span></span><br><span class="line"><span class="comment">        因为x大于等于i+1+j+1；既然第k个元素小于等于B[j]，那么只</span></span><br><span class="line"><span class="comment">        需要在A[0]~A[m-1]和B[0]~B[j]中查找第k个元素即可，递归调用下去。</span></span><br><span class="line"><span class="comment">        */</span>  </span><br><span class="line">        <span class="keyword">if</span>(k &lt; i+<span class="number">1</span>+j+<span class="number">1</span>)  </span><br><span class="line">        &#123;  </span><br><span class="line">            <span class="keyword">if</span>(j &gt; <span class="number">0</span>)  </span><br><span class="line">                <span class="keyword">return</span> findKthIn2SortedArrays(A, m, B, j+<span class="number">1</span>, k);  </span><br><span class="line">            <span class="keyword">else</span> <span class="comment">// j == 0时特殊处理，防止死循环  </span></span><br><span class="line">            &#123;  </span><br><span class="line">                <span class="keyword">if</span>(k == <span class="number">0</span>)  </span><br><span class="line">                    <span class="keyword">return</span> min(A[<span class="number">0</span>], B[<span class="number">0</span>]);  </span><br><span class="line">                <span class="keyword">if</span>(k == m)  </span><br><span class="line">                    <span class="keyword">return</span> max(A[m<span class="number">-1</span>], B[<span class="number">0</span>]);  </span><br><span class="line">                <span class="keyword">return</span> A[k] &lt; B[<span class="number">0</span>] ? A[k] : max(A[k<span class="number">-1</span>], B[<span class="number">0</span>]);  </span><br><span class="line">            &#125;  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="comment">/*</span></span><br><span class="line"><span class="comment">        设y为数组A和数组B中小于于等于A[i]的元素数目，则i+1+j+1大于等于y；</span></span><br><span class="line"><span class="comment">        如果k大于等于i+1+j+1，那么要查找到第k个元素肯定大于A[i]，因为</span></span><br><span class="line"><span class="comment">        i+1+j+1大于等于y；既然第k个元素大于A[i]，那么只需要在A[i+1]~A[m-1]</span></span><br><span class="line"><span class="comment">        和B[0]~B[n-1]中查找第k-i-1个元素，递归调用下去。</span></span><br><span class="line"><span class="comment">        */</span>  </span><br><span class="line">        <span class="keyword">else</span>  </span><br><span class="line">            <span class="keyword">return</span> findKthIn2SortedArrays(A+i+<span class="number">1</span>, m-i<span class="number">-1</span>, B, n, k-i<span class="number">-1</span>);  </span><br><span class="line">    &#125;   </span><br><span class="line">    <span class="comment">// 如果数组A的中间元素大于数组B的中间元素，那么交换数组A和B，重新调用即可  </span></span><br><span class="line">    <span class="keyword">else</span>  </span><br><span class="line">        <span class="keyword">return</span> findKthIn2SortedArrays(B, n, A, m, k);  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目十"><a href="#题目十" class="headerlink" title="题目十"></a>题目十</h2><blockquote><p>一个有序（升序）数组，没有重复元素，在某一个位置发生了旋转后，求key在变化后的数组中出现的位置，不存在则返回-1</p></blockquote><p><em>如 0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2.<br>我们先比较中间元素是否是目标值，如果是返回位置。如果不是，我们就应该想办法将搜索区间减少一半。因为存在旋转变化，所以我们要多做一些判断。我们知道因为只有一次旋转变化，所以中间元素两边的子数组肯定有一个是有序的，那么我们可以判断key是不是在这个有序的子数组中，从而决定是搜索这个子数组还是搜索另一个子数组。具体请参考实现代码与注释。</em></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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchInRotatedArray</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> key)</span>   </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt;= high)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low)&gt;&gt;<span class="number">1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] == key)   </span><br><span class="line">            <span class="keyword">return</span> mid;  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] &gt;= A[low])   </span><br><span class="line">        &#123;  </span><br><span class="line">            <span class="comment">// low ~ mid 是升序的  </span></span><br><span class="line">            <span class="keyword">if</span>(key &gt;= A[low] &amp;&amp; key &lt; A[mid])  </span><br><span class="line">                high = mid<span class="number">-1</span>;  </span><br><span class="line">            <span class="keyword">else</span>  </span><br><span class="line">                low = mid+<span class="number">1</span>;  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="keyword">else</span>  </span><br><span class="line">        &#123;  </span><br><span class="line">            <span class="comment">// mid ~ high 是升序的  </span></span><br><span class="line">            <span class="keyword">if</span>(key &gt; A[mid] &amp;&amp; key &lt;= A[high])  </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">        &#125;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>如果这样的数组中存在重复元素，还能使用二分吗？答案是不能。请看几个栗子：<br>[1, 2, 2, 2, 2], [2, 1, 2, 2, 2], [2, 2, 1, 2, 2], [2, 2, 2, 1, 2], [2, 2, 2, 2, 1]这些都是有第一个数组旋转一次变化来的，我们不能通过二分确定是否存在元素1. </strong></p><h2 id="题目十一"><a href="#题目十一" class="headerlink" title="题目十一"></a>题目十一</h2><blockquote><p>一个有序（升序）数组，没有重复元素，在某一个位置发生了旋转后，求最小值所在位置</p></blockquote><p><em>如果中间元素小于左端元素，则最小值在左半区间内（包含中间元素）；如果中间元素大于右端元素，则最小值在右半区间内（包含中间元素）。请参考实现代码与注释。</em><br><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">int</span> <span class="title">searchMinInRotatedArray</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n)</span>   </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">if</span>(n == <span class="number">1</span>)  </span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> low = <span class="number">0</span>, high = n<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span>(low &lt; high<span class="number">-1</span>) <span class="comment">// 保证mid != low且mid != high  </span></span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> mid = low+((high-low)&gt;&gt;<span class="number">1</span>);  </span><br><span class="line">        <span class="keyword">if</span>(A[mid] &lt; A[low]) <span class="comment">// 最小值在low~mid  </span></span><br><span class="line">            high = mid;  </span><br><span class="line">        <span class="keyword">else</span> <span class="comment">// A[mid] &gt; A[low], // 最小值在mid和high之间  </span></span><br><span class="line">            low = mid;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">return</span> A[low] &lt; A[low+<span class="number">1</span>] ? low : low+<span class="number">1</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目十二"><a href="#题目十二" class="headerlink" title="题目十二"></a>题目十二</h2><blockquote><p>一个有序（升序）数组，没有重复元素，在某一个位置发生了旋转后，求第k(k &gt; 0)小元素的位置</p></blockquote><p><em>我们可以利用上一题的解答，求出最小值所在位置后，便可以求出第k小元素。请参考实现代码与注释 </em><br><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searchKthInRotatedArray</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> n, <span class="keyword">int</span> k)</span>   </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> posMin = searchMinInRotatedArray(A, n);  </span><br><span class="line">    <span class="keyword">return</span> (posMin+k<span class="number">-1</span>)%n;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="题目十三"><a href="#题目十三" class="headerlink" title="题目十三"></a>题目十三</h2><blockquote><p>查找数组中第一个比k大的数的下标</p></blockquote><p><em>当low和high都是非负数时，使用 mid = low + (high - low) / 2;这种形式可以避免溢出。<br>当low和high一个为负另一个为非负时，用mid = (low + high) / 2;这种形式可以避免溢出。</em></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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">searrrch_first_larger_k</span><span class="params">(<span class="keyword">int</span> arr[], <span class="keyword">int</span> length, <span class="keyword">int</span> key)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">if</span> (arr == <span class="literal">nullptr</span> || length &lt;= <span class="number">0</span> || arr[length - <span class="number">1</span>] &lt;= key)  </span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">int</span> res = length - <span class="number">1</span>,low=<span class="number">0</span>,high=length<span class="number">-1</span>;  </span><br><span class="line">    <span class="keyword">while</span> (low &lt;= high)</span><br><span class="line">    &#123;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> mid = low + (high - low) / <span class="number">2</span>;  </span><br><span class="line">        <span class="keyword">if</span> (arr[mid] &gt; key)  </span><br><span class="line">        &#123;  </span><br><span class="line">            res = mid;  </span><br><span class="line">            high = mid - <span class="number">1</span>;  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="keyword">else</span><span class="comment">// if (arr[mid] &lt;= key)  </span></span><br><span class="line">            low = mid + <span class="number">1</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">return</span> res;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p>二分查找是个普遍考查点，只要深入了解某几个点就可以对二分查找运用自如。</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;二分查找，最基本的算法之一，也是面试中常被考察的重点，因为基本的算法最能反映出一个人的基础是否扎实。本文对二分查找相关题目做一个总结。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="算法境界" scheme="https://gbrwebr.github.io/categories/%E7%AE%97%E6%B3%95%E5%A2%83%E7%95%8C/"/>
    
    
      <category term="二分查找" scheme="https://gbrweb.github.io/tags/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/"/>
    
  </entry>
  
  <entry>
    <title>【C语言】经典小游戏-三子棋</title>
    <link href="https://gbrweb.github.io/2018/05/26/2018527/"/>
    <id>https://gbrweb.github.io/2018/05/26/2018527/</id>
    <published>2018-05-26T13:54:45.000Z</published>
    <updated>2018-06-01T16:28:51.247Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>要实现三子棋，首先思考三子棋怎么样实现的，如一下几点：</p><ul><li>实现三子棋，在一个3*<em>3的二维数组下把二维数组都初始化为 ‘</em> *’</li><li>电脑随机生成坐标，判断该坐标是否合法，合法赋值为 ‘0’</li><li>玩家输入合法坐标，该坐标赋值为  ‘X’</li><li>判断输赢，每一行，每一列，或者对角线上的值相等，则为赢。如果棋盘满了，还没有赢家，则为平局！返回 ‘Q’</li></ul></blockquote><a id="more"></a><h2 id="项目效果展示："><a href="#项目效果展示：" class="headerlink" title="项目效果展示："></a>项目效果展示：</h2><p><img src="/img/201844.png" alt="图片加载"></p><h2 id="参考代码："><a href="#参考代码：" class="headerlink" title="参考代码："></a>参考代码：</h2><h3 id="game-h"><a href="#game-h" class="headerlink" title="game.h"></a>game.h</h3><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/*********************************************************</span></span><br><span class="line"><span class="comment">*                      程序名称：三子棋                   *</span></span><br><span class="line"><span class="comment">*                      编译环境：vs2013                   *</span></span><br><span class="line"><span class="comment">*                      编辑日期：2018.5.26                *</span></span><br><span class="line"><span class="comment">*                                        ------by Hunter  *</span></span><br><span class="line"><span class="comment">**********************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifndef</span> __GAME_H__</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> __GAME_H__</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;time.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;string.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">unsigned</span> <span class="keyword">int</span> uint;</span><br><span class="line"></span><br><span class="line"><span class="keyword">enum</span> APP</span><br><span class="line">&#123;</span><br><span class="line">EXIT,</span><br><span class="line">START</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> ROW 3</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span>  COL 3</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//初始化棋盘</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitBoard</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span>;</span><br><span class="line"><span class="comment">//打印棋盘</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintBoard</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span>;</span><br><span class="line"><span class="comment">//电脑走</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ComputerMove</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span>;</span><br><span class="line"><span class="comment">//玩家走</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PlayerMove</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span>;</span><br><span class="line"><span class="comment">//判输赢</span></span><br><span class="line"><span class="function"><span class="keyword">char</span> <span class="title">is_win</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span> <span class="comment">//__GAME_H__</span></span></span><br></pre></td></tr></table></figure><h3 id="game-c"><a href="#game-c" class="headerlink" title="game.c"></a>game.c</h3><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><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">"game.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitBoard</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">memset</span>(board, <span class="string">' '</span>, <span class="keyword">sizeof</span>(<span class="keyword">char</span>)* row*col);</span><br><span class="line">&#125;<span class="comment">//memset函数用来对一段内存空间全部设置为某个字符</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintBoard</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; row; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">" %c | %c | %c \n"</span>, board[i][<span class="number">0</span>], board[i][<span class="number">1</span>], board[i][<span class="number">2</span>]);</span><br><span class="line"><span class="keyword">if</span> (i != <span class="number">2</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"---|---|---\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span>  <span class="title">PlayerMove</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> x = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> y = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"请输入落子的坐标：\n"</span>);</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &amp;x, &amp;y);</span><br><span class="line"><span class="comment">//保证输入坐标的合法性,玩家输入的坐标是从1开始的</span></span><br><span class="line"><span class="keyword">if</span> (((x &gt;= <span class="number">1</span>) &amp;&amp; (x &lt;= row)) &amp;&amp; ((y &gt;= <span class="number">1</span>) &amp;&amp; (y &lt;= col)))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (board[x - <span class="number">1</span>][y - <span class="number">1</span>] == <span class="string">' '</span>)</span><br><span class="line">&#123;</span><br><span class="line">board[x - <span class="number">1</span>][y - <span class="number">1</span>] = <span class="string">'X'</span>;<span class="comment">//玩家落子</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"该坐标已被占用，请换一个坐标：\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"输入坐标不合法，请重新输入：\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ComputerMove</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> x = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> y = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">x = rand() % row;</span><br><span class="line">y = rand() % col;<span class="comment">//利用rand函数生成随机坐标</span></span><br><span class="line"><span class="keyword">if</span> (board[x][y] == <span class="string">' '</span>)</span><br><span class="line">&#123;</span><br><span class="line">board[x][y] = <span class="string">'0'</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">int</span> <span class="title">is_full</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span></span><br><span class="line"><span class="function"><span class="comment">//函数is_full只在is_win中被调用，可以加上static改变其链接属性</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; row; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; col; j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (board[i][j] == <span class="string">' '</span>)</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;<span class="comment">//判断棋盘是否下满了</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">char</span> <span class="title">is_win</span><span class="params">(<span class="keyword">char</span> board[ROW][COL], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; row; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> ((board[i][<span class="number">0</span>] == board[i][<span class="number">1</span>]) &amp;&amp; (board[i][<span class="number">1</span>] == board[i][<span class="number">2</span>]) &amp;&amp; (board[i][<span class="number">2</span>] != <span class="string">' '</span>))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>  board[i][<span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (j = <span class="number">0</span>; j &lt; col; j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> ((board[<span class="number">0</span>][j] == board[<span class="number">1</span>][j]) &amp;&amp; (board[<span class="number">1</span>][j] == board[<span class="number">2</span>][j]) &amp;&amp; (board[<span class="number">2</span>][j] != <span class="string">' '</span>))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span>  board[<span class="number">1</span>][j];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> ((board[<span class="number">0</span>][<span class="number">0</span>] == board[<span class="number">1</span>][<span class="number">1</span>]) &amp;&amp; (board[<span class="number">1</span>][<span class="number">1</span>] == board[<span class="number">2</span>][<span class="number">2</span>]) &amp;&amp; (board[<span class="number">2</span>][<span class="number">2</span>] != <span class="string">' '</span>))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span> board[<span class="number">1</span>][<span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> ((board[<span class="number">0</span>][<span class="number">2</span>] == board[<span class="number">1</span>][<span class="number">1</span>]) &amp;&amp; (board[<span class="number">1</span>][<span class="number">1</span>] == board[<span class="number">2</span>][<span class="number">0</span>]) &amp;&amp; (board[<span class="number">1</span>][<span class="number">1</span>] != <span class="string">' '</span>))</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span> board[<span class="number">1</span>][<span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (is_full(board, ROW, COL) == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="string">'Q'</span>;<span class="comment">//表示棋盘下满了</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">return</span> <span class="string">' '</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="test-c"><a href="#test-c" class="headerlink" title="test.c"></a>test.c</h3><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">"game.h"</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">menu</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"***** 《三子棋游戏》*****\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"******   1.play   *******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"******   0.exit   *******\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"*************************\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"*************************\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">game</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">char</span> ret;</span><br><span class="line"><span class="keyword">char</span> board[ROW][COL];</span><br><span class="line">InitBoard(board, ROW, COL);</span><br><span class="line">PrintBoard(board, ROW, COL);</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"玩家走：\n"</span>);</span><br><span class="line">PlayerMove(board, ROW, COL);</span><br><span class="line">PrintBoard(board, ROW, COL);</span><br><span class="line">ret = is_win(board, ROW, COL);</span><br><span class="line"><span class="keyword">if</span> (ret != <span class="string">' '</span>)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"电脑走：\n"</span>);</span><br><span class="line">ComputerMove(board, ROW, COL);</span><br><span class="line">PrintBoard(board, ROW, COL);</span><br><span class="line">ret = is_win(board, ROW, COL);</span><br><span class="line"><span class="keyword">if</span> (ret != <span class="string">' '</span>)</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (ret == <span class="string">'X'</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">" 你赢了！\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (ret == <span class="string">'0'</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">" 你输了\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (ret == <span class="string">'Q'</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"平局\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">test</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> input = <span class="number">0</span>;</span><br><span class="line">srand((uint)time(<span class="literal">NULL</span>));</span><br><span class="line"><span class="keyword">do</span> &#123;</span><br><span class="line">menu();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"请选择:"</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;input);</span><br><span class="line"><span class="keyword">switch</span> (input)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> START:</span><br><span class="line">game();</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> EXIT:</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125; <span class="keyword">while</span> (input);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">test();</span><br><span class="line">system(<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">&#125;</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p><strong>天天编程，天天向上！</strong></p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;要实现三子棋，首先思考三子棋怎么样实现的，如一下几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实现三子棋，在一个3*&lt;em&gt;3的二维数组下把二维数组都初始化为 ‘&lt;/em&gt; *’&lt;/li&gt;
&lt;li&gt;电脑随机生成坐标，判断该坐标是否合法，合法赋值为 ‘0’&lt;/li&gt;
&lt;li&gt;玩家输入合法坐标，该坐标赋值为  ‘X’&lt;/li&gt;
&lt;li&gt;判断输赢，每一行，每一列，或者对角线上的值相等，则为赢。如果棋盘满了，还没有赢家，则为平局！返回 ‘Q’&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="项目实战" scheme="https://gbrweb.github.io/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/"/>
    
    
      <category term="三子棋" scheme="https://gbrweb.github.io/tags/%E4%B8%89%E5%AD%90%E6%A3%8B/"/>
    
  </entry>
  
  <entry>
    <title>函数调用过程（栈桢）</title>
    <link href="https://gbrweb.github.io/2018/05/25/2018526/"/>
    <id>https://gbrweb.github.io/2018/05/25/2018526/</id>
    <published>2018-05-25T13:54:40.000Z</published>
    <updated>2018-06-01T16:28:51.246Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>栈帧也叫过程活动记录，是编译器用来实现函数调用过程的一种数据结构。C语言中，每个栈帧对应着一个未运行完的函数。从逻辑上讲，栈帧就是一个函数执行的环境：函数调用框架、函数参数、函数的局部变量、函数执行完后返回到哪里等等。栈是从高地址向低地址延伸的。每个函数的每次调用，都有它自己独立的一个栈帧，这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部（高地址），寄存器esp指向当前的栈帧的顶部（低地址）。<br><a id="more"></a></p></blockquote><h1 id="Add-函数调用深度剖析"><a href="#Add-函数调用深度剖析" class="headerlink" title="Add()函数调用深度剖析"></a>Add()函数调用深度剖析</h1><blockquote><p>我们以Add（）函数为例深入的研究一下函数的调用过程。<br>先看一段简单的代码：</p></blockquote><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="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">Add</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> z = <span class="number">0</span>;</span><br><span class="line">  z = x + y;</span><br><span class="line">  <span class="keyword">return</span> z;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> a = <span class="number">10</span>;</span><br><span class="line">  <span class="keyword">int</span> b = <span class="number">20</span>;</span><br><span class="line">  <span class="keyword">int</span> ret = Add(a, b) ;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"ret = %d\n"</span>, ret) ;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>当开始剖析程序调试的时候， 查看【调用堆栈】（按F10进入调试-&gt;窗口-&gt;调用堆栈，或快捷键ctrl+alt+C），用VS2013调试 如下图：</p></blockquote><p><img src="/img/2018526.png" alt="图片加载"></p><blockquote><p>我们发现其实main函数在 <strong>tmai nCRTStartup 函数中调用的，而 </strong>tmai nCRTStartup 函数是在 mai nCRTStartup 被调用的。我们知道每一次函数调用都是一个过程。这个过程我们通常称之为： 函数的调用过程。这个过程要为函数开辟栈空间（运行时堆栈）， 用于本次函数的调用中临时变量的保存、 现场保护。 这块栈空间我们称之为函数栈帧。所以函数调用过程实际上就是函数栈桢创建与销毁。</p></blockquote><blockquote><p>而栈帧的维护我们必须了解ebp和esp两个寄存器。 在函数调用的过程中这两个寄存器存放了维护这个栈的栈底和栈顶指针。比如：调用main函数， 我们为main函数分配栈帧空间， 那么栈帧维护如下：</p></blockquote><p><img src="/img/20285261.png" alt="图片加载"></p><blockquote><p>ebp存放了指向函数栈帧栈底的地址。esp存放了指向函数栈帧栈顶的地址。</p></blockquote><p><em>注意：ebp指向当前位于系统栈最上边一个栈帧的底部，而不是系统栈的底部。严格说来，“栈帧底部”和“栈底”是不同的概念;esp所指的栈帧顶部和系统栈的顶部是同一个位置。</em></p><p><strong>1 . main函数开始。</strong> 要展开main函数的调用就得为main函数创建栈帧， 那我们先来看main函数栈帧的创建。转到反汇编可以更清晰的看到过程：</p><p><img src="/img/20185262.png" alt="图片加载"></p><p><strong>过程分析：</strong></p><blockquote><ul><li>首先mainCRTStartup()，__mainCRTStartup()函数的调用，调main()函数；</li><li>将ebp压栈处理，保存指向栈底的ebp的地址（方便函数返回之后的现场恢复），此时esp指向新的栈顶位置；</li><li>将esp的值赋给ebp，产生新的ebp；</li><li>给esp减去一个16进制数0E4H（为main函数预开辟空间）；</li><li>push ebx、esi、edi；</li><li>lea指令，加载有效地址；</li><li>初始化预开辟的空间为0xcccccccc；</li><li>创建变量a与b。</li></ul></blockquote><p><strong>2. 接下来Add函数的调用。</strong></p><blockquote><p>参数传递过程：(从右到左传参)</p></blockquote><p><img src="/img/20185263.png" alt="图片加载"></p><p><strong>过程分析：</strong></p><blockquote><ul><li>将b存入寄存器eax,对b进行实例化_b ;</li><li>将a存入寄存器ecx,对a进行实例化_a ;</li><li>call指令的调用，先要压栈call指令下一条指令的地址，然后跳转到Add()函数的地方。</li></ul></blockquote><p><strong>执行call指令的时候按F11 ， 来到了这里。</strong></p><p><img src="/img/20185264.png" alt="图片加载"></p><p><strong>再按F11 就进入Add函数的执行代码处。Add函数栈帧的创建：</strong><br><img src="/img/20185265.png" alt="图片加载">  </p><p><strong>过程分析：</strong></p><blockquote><ul><li>首先将main()函数ebp压栈处理，保存指向main()函数栈帧底部的ebp的地址（方便函数返回之后的现场恢复），此时esp指向新的栈顶位置；</li><li>将esp的值赋给ebp，产生新的ebp，即Add()函数栈帧的ebp；<br>给esp减去一个16进制数0E4H（为Add()函数预开辟空间）；</li><li>push ebx、esi、edi；</li><li>lea指令，加载有效地址；</li><li>初始化预开辟的空间为0xcccccccc；</li><li>创建变量z；</li><li>获取形参的a和b再相加，将结果存储到z中；</li><li>将结果存储到eax寄存器，通过寄存器带回函数的返回值。</li></ul></blockquote><p> <strong>剩下的就是是函数返回部分：</strong></p><p><img src="/img/20185266.png" alt="图片加载">  </p><p><strong>过程分析：</strong></p><blockquote><ul><li>pop 3次，edi、esi、ebx依次出栈,esp 向下移动；</li><li>将ebp赋给esp，使esp指向ebp指向的地方;</li><li>ebp 出栈，将出栈的内容给ebp（即main()函数ebp），回到main()函数的栈帧；</li><li>ret 指令，出栈一次，并将出栈的内容当做地址，并跳转到该地址处 。<br><img src="/img/20185267.png" alt="图片加载">  </li></ul></blockquote><p><strong>注： 栈帧这部分内容在不同的编译器上实现存在差异， 但是思想都是一致的。</strong></p><blockquote><p>对于函数调用具体过程剖析完了，我们来个小测验：</p></blockquote><p><strong>在VC6.0环境中， 下面代码的结果是什么？</strong></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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">fun</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> tmp = <span class="number">10</span>;</span><br><span class="line"><span class="keyword">int</span> *p = (<span class="keyword">int</span> *)(*(&amp;tmp + <span class="number">1</span>));</span><br><span class="line">*(p - <span class="number">1</span>) = <span class="number">20</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> a = <span class="number">0</span>;</span><br><span class="line">fun();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"a = %d\n"</span>, a);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>事实上在不同平台下这段代码有不同的输出，可自行验证。</strong></p><p><em>此处提供VS编译器答案：20</em></p><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p><strong>堆和栈的关系</strong></p><blockquote><p><strong>我们平时说的堆栈其实是指栈，而实际上堆和栈是两种不同的内存分配。简单罗列如下各方面的异同点。</strong></p><ul><li>堆需要用户在程序中显式申请，栈不用，由系统自动完成。申请/释放堆内存的API，在C中是malloc/free，在C++中是new/delete。申请与释放一定要配对使用，否则会造成内存泄漏(memory leak)，久而久之系统就无内存可用了，出现OOM（Out Of Memory）错误。一般在return/exit或break/continue等语句时容易忘记释放内存，所以检查内存泄漏的代码时要关注这些语句，看它们前面是否有必要的释放语句free/delete。</li></ul><ul><li><p>堆的空间比较大，栈比较小。所以申请大的内存一般在堆中申请；栈上不要有较大的内存使用，比如大的静态数组；而且除非算法必要，否则一般不要使用较深的迭代函数调用，那样栈消耗内存会随着迭代次数的增加飞涨。</p></li><li><p>关于生命周期。栈较短，随着函数退出或返回，本函数的栈就完成了使用；堆就要看什么时候释放，生命周期就什么时候结束。</p></li></ul></blockquote><p>关于函数调用即栈桢创建与销毁就浅析到此！</p>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;栈帧也叫过程活动记录，是编译器用来实现函数调用过程的一种数据结构。C语言中，每个栈帧对应着一个未运行完的函数。从逻辑上讲，栈帧就是一个函数执行的环境：函数调用框架、函数参数、函数的局部变量、函数执行完后返回到哪里等等。栈是从高地址向低地址延伸的。每个函数的每次调用，都有它自己独立的一个栈帧，这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部（高地址），寄存器esp指向当前的栈帧的顶部（低地址）。&lt;br&gt;
    
    </summary>
    
      <category term="C语言知识及题集" scheme="https://gbrweb.github.io/categories/C%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86%E5%8F%8A%E9%A2%98%E9%9B%86/"/>
    
    
      <category term="栈桢" scheme="https://gbrweb.github.io/tags/%E6%A0%88%E6%A1%A2/"/>
    
  </entry>
  
  <entry>
    <title>平均数三种境界</title>
    <link href="https://gbrweb.github.io/2018/05/24/2018524/"/>
    <id>https://gbrweb.github.io/2018/05/24/2018524/</id>
    <published>2018-05-24T13:54:20.000Z</published>
    <updated>2018-06-01T16:28:51.245Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>平均数:平均数是指在一组数据中所有数据之和再除以数据的个数。平均数是表示一组数据集中趋势的量数，它是反映数据集中趋势的一项指标。今天就简单讲解一下编程界平均数几种简要解法。<br><a id="more"></a></p></blockquote><h2 id="解法一："><a href="#解法一：" class="headerlink" title="解法一："></a>解法一：</h2><blockquote><p>这种方法最为简单，弊端是如果a和b非常大的话，a+b的值可能超过了整型的储存范围（最大值为2147483647），导致溢出，得到错误的结果。</p></blockquote><ul><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;  </span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">  <span class="keyword">int</span> a=<span class="number">10</span>;    </span><br><span class="line"></span><br><span class="line">  <span class="keyword">int</span> b=<span class="number">20</span>;    </span><br><span class="line"></span><br><span class="line">  <span class="keyword">int</span> avg=<span class="number">0</span>;    </span><br><span class="line"></span><br><span class="line">  avg=(a+b)/<span class="number">2</span>;<span class="comment">//平局值    </span></span><br><span class="line"></span><br><span class="line">  <span class="comment">//或者</span></span><br><span class="line">  avg=(a+b)&gt;&gt;<span class="number">1</span>:<span class="comment">//右移表示除2，左移表示乘2。</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">//【-1除外】（右移一位为-1，左移一位为-2）    </span></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"%d\n"</span>,avg);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="解法二："><a href="#解法二：" class="headerlink" title="解法二："></a>解法二：</h2><blockquote><p>用一个较大值减去另一个较小值得到二者之差，将差除2后加上较小值即得到了二者平均值，可有效防止溢出的情况的出现。</p></blockquote><p><strong>步骤如图：</strong></p><p><img src="/img/2018523.png" alt="图片加载">  </p><ul><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;  </span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">  <span class="keyword">int</span> a=<span class="number">10</span>;   </span><br><span class="line"></span><br><span class="line">  <span class="keyword">int</span> b=<span class="number">20</span>;    </span><br><span class="line"></span><br><span class="line">  <span class="keyword">int</span> avg=<span class="number">0</span>;    </span><br><span class="line"></span><br><span class="line">  avg=b+(a-b)/<span class="number">2</span>;<span class="comment">//平均值    </span></span><br><span class="line"></span><br><span class="line">  <span class="comment">//或者    </span></span><br><span class="line">  avg=b+(a-b)&gt;&gt;<span class="number">1</span>:<span class="comment">//右移表示除2，左移表示乘2</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">//【-1除外】（右移一位为-1，左移一位为-2）</span></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"%d\n"</span>,avg);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="方法三："><a href="#方法三：" class="headerlink" title="方法三："></a>方法三：</h2><blockquote><p>将两个数的二进制位分为相同部分和不同部分，利用按位与求出相同部分的平均数，然后再用按位异或求出不同部分的平均数，加起来就是两个数的平均数。</p></blockquote><p><strong>这里举个栗子：</strong>  </p><blockquote><ul><li>a = 10,b = 12;</li><li>10&amp;12可得到        1000</li><li>10^12可得到        0110<br><em>计算a与b的平均值C语言表达式:</em></li></ul><ul><li>avg = (a&amp;b)  + (a^b)&gt;&gt;1</li></ul></blockquote><ul><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;  </span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">  <span class="keyword">int</span> a=<span class="number">10</span>;    </span><br><span class="line"></span><br><span class="line">  <span class="keyword">int</span> b=<span class="number">20</span>;    </span><br><span class="line"></span><br><span class="line">  <span class="keyword">int</span> avg=<span class="number">0</span>;    </span><br><span class="line"></span><br><span class="line">  avg = (a&amp;b)  + (a^b)&gt;&gt;<span class="number">1</span>;    </span><br><span class="line"></span><br><span class="line">  <span class="comment">//或者    </span></span><br><span class="line">  avg = (a&amp;b)  + (a^b)/<span class="number">2</span>;    </span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"%d\n"</span>,avg);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p>知识在于汇总，方法在于总结。<br>不忘初心，励志前行！</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;平均数:平均数是指在一组数据中所有数据之和再除以数据的个数。平均数是表示一组数据集中趋势的量数，它是反映数据集中趋势的一项指标。今天就简单讲解一下编程界平均数几种简要解法。&lt;br&gt;
    
    </summary>
    
      <category term="C语言知识及题集" scheme="https://gbrweb.github.io/categories/C%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86%E5%8F%8A%E9%A2%98%E9%9B%86/"/>
    
    
      <category term="平均数" scheme="https://gbrweb.github.io/tags/%E5%B9%B3%E5%9D%87%E6%95%B0/"/>
    
  </entry>
  
  <entry>
    <title>C/C++代码规范</title>
    <link href="https://gbrweb.github.io/2018/05/23/2018525/"/>
    <id>https://gbrweb.github.io/2018/05/23/2018525/</id>
    <published>2018-05-23T13:54:33.000Z</published>
    <updated>2018-06-01T16:28:51.245Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>本文摘录自谷歌开源项目开源指南。</p><p>详见  —&gt;<a href="http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/" target="_blank" rel="noopener">谷歌开源项目开源指南</a><br><a id="more"></a></p></blockquote><h1 id="头文件"><a href="#头文件" class="headerlink" title="头文件"></a>头文件</h1><blockquote><p>每通常一个  .c/.cpp文件都有一个对应的  .h 文件。也有一些常见例外，如单元测试代码和只包含 main() 函数的 .c/.cpp文件。正确使用头文件可令代码在可读性，文件大小和性能上大为改观。</p></blockquote><p><strong>下面的规则将引导你规避使用头文件时的各种陷阱。</strong></p><h2 id="自包含的头文件"><a href="#自包含的头文件" class="headerlink" title="自包含的头文件"></a>自包含的头文件</h2><blockquote><p>头文件应该能够自给自足（自包含的，也就是可以作为第一个头文件被引入），以  .h 结尾。至于用来插入文本的文件，说到底它们并不是头文件，所以以应  .inc 结尾不允许。出分离 -inl.h 头文件的做法。所有头文件要能够自给自足。换言之，用户和重构工具不需要为特别场合而包含额外的头文件。详言之，一个头文件要有  <a href="http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/headers/#define-guard" target="_blank" rel="noopener">1.2。#define</a>保护，统计包含它所需要的其它头文件，也不要求定义任何特别的符号。</p></blockquote><blockquote><p>不过有一个例外，即一个文件并不是自足的，而是作为文本插入到代码某处。或者，文件内容实际上是其它头文件的特定平台（特定于平台）扩展部分，这些文件就要用  .inc 文件扩展名。</p></blockquote><blockquote><p>如果  .h 文件声明了一个模板或内联函数，同时也在该文件加以定义。有用凡是到这些的  .cpp 文件，就得统统包含该头文件，否则程序可能会在构建中链接失败。不要把这些定义放到分离的 -inl.h 文件里（译者注：过去该规范曾提倡把定义放到-inl.h里过）。</p></blockquote><p><em>有个例外：如果某函数模板为所有相关模板参数显式实例化，或本身就是某类的一个私有成员，它就那么定义只能在实例化该模板的  .cpp 文件里。</em></p><h2 id="define保护"><a href="#define保护" class="headerlink" title="#define保护"></a>#define保护</h2><blockquote><p>所有头文件都应该使用  #define 来防止头文件被多重包含，命名格式当是： <project><em><path></path></em><file>_H_ 。<br>为保证唯一性，头文件的命名应该基于所有项目源代码树的全路径。例如，项目  foo 中的头文件 foo/src/bar/baz.h 可按如下方式保护：</file></project></p></blockquote><blockquote><p>#ifndef FOO_BAR_BAZ_H_</p><p>#define FOO_BAR_BAZ_H_  </p><p>…</p><p>#endif // FOO_BAR_BAZ_H_</p></blockquote><h2 id="前置声明"><a href="#前置声明" class="headerlink" title="前置声明"></a>前置声明</h2><blockquote><p>尽可能地避免使用前置声明。使用  #include 所有游戏需要的头文件即可。<br>定义：<br><strong>所谓「前置声明」（forward declaration）是类，函数和模板的纯粹声明，没伴随着其定义。</strong></p></blockquote><p><strong>优点：</strong></p><blockquote><p>前置声明能够节省编译时间，的多余  #include 会迫使compile-器展开更多的文件，处理更多的输入。<br>前置声明能够节省不必要的重新编译的时间。  #include 使代码因为头文件中无关的改动而被重新编译多次。</p></blockquote><p> <strong>缺点：</strong></p><blockquote><p>前置声明隐藏了依赖关系，头文件改动时，用户的代码会跳过必要的重新编译过程。<br>前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时会妨碍头文件开发者变动其API。例如扩大形参类型，加个自带默认参数的模板形参等等。<br>前置声明来自命名空间  std:: 的符号时，其行为未定义。<br>很难判断什么时候该用前置声明，时候什么用该  #include 极端情况下，用前置声明代替。 includes 甚至都会暗暗地改变代码的含义：</p></blockquote><p>// bh：<br>struct  B  {};<br>struct  D  ： B  {}</p><p>// good_user.cpp：<br>＃包括 “BH”<br>void  f （B <em> ）;<br>void  f （void </em> ）;<br>void  test （D *  x ） {  f （x ）;  }</p><p>//调用f（B <em>）<br>如果  #include 被  B 状语从句：  D 的前置声明替代，  test() 就会调用  f(void</em>) 。<br>前置声明了include 不少来自头文件的符号时，就会比单单一行的  冗长。<br>仅仅为了能前置声明而重构代码（比如用指针成员代替对象成员）会使代码变得更慢更复杂。</p><p><strong>结论：</strong></p><blockquote><p>尽量避免前置声明那些定义在其他项目中的实体。</p><p>函数：总是使用  #include。</p><p>类模板：优先使用  #include。</p><p>至于什么时候包含头文件，参见 <strong>1.5。#include的路径及顺序 </strong>。</p></blockquote><h2 id="内联函数"><a href="#内联函数" class="headerlink" title="内联函数"></a>内联函数</h2><blockquote><p>只有当函数只有10行甚至更少时才将其定义为内联函数。<br>定义：<strong>当函数被声明为内联函数之后，编译器会将其内联展开，而不是按通常的函数调用机制进行调用。</strong></p></blockquote><p> <strong>优点：</strong></p><blockquote><p>只要内联的函数体小小，内联该函数可以令目标代码更加高效。对于存取函数以及其它函数体比较短，性​​能关键的函数，鼓励使用内联。</p></blockquote><p> <strong>缺点：</strong></p><blockquote><p>滥用内联将导致程序变得更慢。内联可能使目标代码量或增或减，这取决于内联函数的大小。内联非常短小的存取函数通常会减少代码大小，但内联一个相当大的函数将戏剧性的增加代码大小。现代处理器由于更好的利用了指令缓存，小巧的代码往往执行更快。</p></blockquote><p> <strong>结论：</strong></p><blockquote><p>一个较为合理的经验准则是，不要内联超过10行的函数。谨谨对待析构函数，析构函数往往比其表面看起来要更长，因为有隐含的成员和基类析构函数被调用！</p></blockquote><blockquote><p>另一个实用的经验准则：内联那些包含循环或  switch 语句的函数常常是得不偿失（除非在大多数情况下，这些循环或  switch 语句从不被执行）。</p></blockquote><blockquote><p>有些函数即使声明为内联的也不一定会被编译器内联，这点很重要; 比如虚函数和递归函数就不会被正常内联。通常，递归函数不应该声明成内联函数。（YuleFox注：递归调用堆栈的展开并不像循环那么简单，比如递进层数在编译时可能是未知的，大多数编译器都不支持内联递归函数）。虚函数内联的主要原因是想把它的函数体放在类定义内，为了图个方便，抑或是当作文件描述其行为，比如精短的存取函数。</p></blockquote><h2 id="include-的路径及顺序"><a href="#include-的路径及顺序" class="headerlink" title="#include 的路径及顺序"></a>#include 的路径及顺序</h2><blockquote><p>使用标准的头文件包含顺序可增强可读性，避免隐藏依赖：相关头文件，C库，C ++库，其他库的  .h，本项目内的  .h。<br>项目内部文件应按照项目源代码目录树结构排列，避免使用UNIX特殊的快捷目录  .（当前目录）或  .. （上级目录）。</p></blockquote><blockquote><p>例如，  google-awesome-project/src/base/logging.h 应该按如下方式包含：#include  “base / logging.h”<br>又如，  dir/foo.cpp 或  dir/foo_test.cpp 的主要作用英文的英文实现或测试  dir2/foo2.h 的功能， foo.cpp 中包含头文件的次序如下：dir2/foo2.h （优先位置，详情如下）<br>C系统文件<br>C ++系统文件<br>库其他的  .h 文件<br>项目本。内  .h 文件<br>优先这种顺序的排序保证当  dir2/foo2.h 遗漏某些必要的库时，  dir/foo.cpp 或 dir/foo_test.cpp 的构建会立刻中止。因此这一条规则保证维护这些文件的人们首先看到构建中止的消息而不是维护其他包的人们。</p></blockquote><blockquote><p>dir/foo.cpp 和  dir2/foo2.h 通常位于同一目录下(如base/basictypes_unittest.cpp 和 base/basictypes.h），但也可放在不同目录下。按字母顺序分别对每种类型的头文件进行二次排序是不错的主意。注意较老的代码可不符合这条规则，要在方便的时候改正它们。</p></blockquote><blockquote><p>您所依赖的符号（符号）被哪些头文件所定义，您就应该包含（包括）哪些头文件，前置声明  （向前声明）情况除外。您比如要用到  bar.h 中的某个符号，哪怕您所包含的  foo.h 已经包含了 bar.h，也照样得包含  bar.h，除非foo.h 有明确  说明它会自动向您提供  bar.h 中符号。不过，凡是cc文件所对应的「相关头文件」已经包含的，就不用再重复包含进其cc文件里面了，就像 foo.cpp 只包含  foo.h就够了，不用再管后者所包含的其它内容。</p></blockquote><h1 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h1><h2 id="参数顺序"><a href="#参数顺序" class="headerlink" title="参数顺序"></a>参数顺序</h2><blockquote><p>总述:函数的参数顺序为：输入参数在先，后跟输出参数。</p></blockquote><p><strong>说明</strong></p><blockquote><p>C / C ++中的函数参数或者是函数的输入，或者是函数的输出，或兼而有之。输入参数通常是值参或 const 引用，输出参数或输入/输出参数则一般为非  const 指针。在排列参数顺序时，将所有的输入参数置于输出参数之前。特别要注意，在加入新参数时不要因为它们是新参数就置于参数列表最后，而是仍然要按照前述的规则，即将新的输入参数也置于输出参数之前。</p></blockquote><blockquote><p>这并非一个硬性规定。输入/输出参数（通常是类或结构体）让这个问题变得复杂。并且，有时候为了其他函数保持一致，你可能不得不不所有变通。</p></blockquote><h2 id="编写简短函数"><a href="#编写简短函数" class="headerlink" title="编写简短函数"></a>编写简短函数</h2><blockquote><p>总述:我们倾向于编写简短，凝练的函数。</p></blockquote><p><strong>说明</strong></p><blockquote><p>我们承认长函数有时是合理的，因此并不硬限制函数的长度。如果函数超过40行，可以思索一下能不能在不影响程序结构的前提下对其进行分割。</p></blockquote><blockquote><p>即使一个长函数现在工作的非常好，一旦有人对其修改，有可能出现新的问题，甚至导致难以发现的错误。使函数尽量简短，以便于他在他人阅读和修改代码。</p></blockquote><blockquote><p>在处理代码时，你可能会发现复杂的长函数。不要害怕修改现有代码：如果证实这些代码使用/调试起来很困难，或者你只需​​要使用其中的一小段代码，考虑将其分割为更加简短并易于管理的若干函数。</p></blockquote><h2 id="引用参数"><a href="#引用参数" class="headerlink" title="引用参数"></a>引用参数</h2><blockquote><p>总述:所有按引用传递的参数必须加上  const。</p></blockquote><p><strong>说明</strong></p><p>》在C语言中，如果函数需要修改变量的值，参数必须为指针，如  。在C ++中，函数还可以声明为引用参数：  。int foo(int *pval)int foo(int &amp;val)</p><p><strong>优点</strong></p><blockquote><p>引用定义参数可以防止出现  (*pval)++ 这样丑陋的代码。引用参数对于拷贝构造函数这样的应用也是必需的。同时也更明确地不接受空指针。</p></blockquote><p><strong>缺点</strong></p><blockquote><p>容易引起误解，因为引用在语法上是值变量却拥有指针的语义。</p></blockquote><p><strong>结论</strong></p><blockquote><p>函数参数列表中，所有引用参数都必须是  const：void  Foo （const  string  ＆in ， string  * out ）;<br>事实上这在Google Code是一个硬性约定：输入参数是值参或  const 引用，输出参数为指针。输入参数可以是  const 指针，但决不能是非  const 引用参数，除非特殊要求，比如  swap()。<br>有时候，在输入形参中用针指更明智。</p><p>比如：const T<em>const T&amp;可能会传递空指针。<br>函数要把指针或对地址的引用赋值给输入形参。<br>总而言之，大多时候输入形参往往是  。用若   则说明输入侧另有处理。所以若要使用  ，则应给出相应的理由，否则会使读者感到迷惑。const T&amp;const T</em>const T*</p></blockquote><h2 id="函数重载"><a href="#函数重载" class="headerlink" title="函数重载"></a>函数重载</h2><p><strong>总述</strong></p><p>》若要使用函数重载，则必须能让读者一看调用点就胸有成竹，而不用花心思猜测调用的重载函数到底是哪一种。这一规则也适用于构造函数。</p><p><strong>定义</strong></p><blockquote><p>你可以编写一个参数类型的函数，然后用另一个参数类型函数对其进行重载：</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="built_in">string</span>&amp;<span class="keyword">const</span> <span class="keyword">char</span>* <span class="class"><span class="keyword">class</span>  <span class="title">MyClass</span>  &#123;</span></span><br><span class="line">   <span class="keyword">public</span> ：</span><br><span class="line">   <span class="keyword">void</span>  Analyze （<span class="keyword">const</span>  <span class="built_in">string</span>  ＆text ）;</span><br><span class="line">   <span class="keyword">void</span>  分析（<span class="keyword">const</span>  <span class="keyword">char</span>  * text ， <span class="keyword">size_t</span>  textlen ）;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><strong>优点</strong></p><blockquote><p>通过重载参数不同的同名函数，可以令代码更直观。模板化代码需要重载，这同时也能为使用者带来便利。</p></blockquote><p><strong>缺点</strong></p><blockquote><p>如果函数单靠不同的参数类型而重载（acgtyrant注：这意味着参数数量不变），读者就得十分熟悉C ++五花八门的匹配规则，以了解匹配过程具体到底如何。另外，如果派生类只重载了某个函数的部分变体，继承语义就容易令人困惑。</p></blockquote><p><strong>结论</strong></p><blockquote><p>如果打算重载一个函数，可以试试改在函数名里加参数信息。例如，用  AppendString()和 AppendInt() 等，而不是一口气重载多个  Append()。如果重载函数的目的是为了支持不同数量的同一类型参数，则优先考虑使用  std::vector 以便使用者可以用  列表初始化指定参数。</p></blockquote><h2 id="缺省参数"><a href="#缺省参数" class="headerlink" title="缺省参数"></a>缺省参数</h2><p><strong>总述</strong></p><blockquote><p>只允许在非虚函数中使用缺省参数，且必须保证缺省参数的值始终一致。参数缺省与  函数重载  遵循同样的规则。一般情况下建议使用函数重载，尤其是在缺省函数带来的可读性提升不能弥补下文中所提到的缺点的情况下。</p></blockquote><p><strong>优点</strong></p><blockquote><p>有些函数一般情况下使用默认参数，但有时需要又使用非默认的参数。缺省参数为这样的情形提供了便利，使程序员不需要为了极少的例外情况编写大量的函数。和函数重载相比，缺省参数的语法更简洁明了，减少了大量的样板代码，也更好地区别了“必要参数”和“可选参数”。</p></blockquote><p><strong>缺点</strong></p><blockquote><ul><li>缺省参数实际上是函数重载语义的另一种实现方式，因此所有  不应当使用函数重载的理由  也都适用于缺省参数。</li><li>虚函数调用的缺省参数取决于目标对象的静态类型，此时无法保证给定函数的所有重载声明的都是同样的缺省参数。</li><li>缺省参数是在每个调用点都要进行重新求值的，这会造成生成的代码迅速膨胀。作为读者，一般来说也更希望缺省的参数在声明时就已经被固定了，而不是在每次调用时都可能会有不同的取值。</li><li>缺省参数会干扰函数指针，导致函数签名与调用点的签名不一致。而函数重载不会导致这样的问题。</li></ul></blockquote><p><strong>结论</strong></p><blockquote><p>对于虚函数，不允许使用缺省参数，因为在虚函数中缺省参数不一定能正常工作。如果在每个调用点缺省参数的值都有可能不同，在这种情况下缺省函数也不允许使用。（例如，不要写像   这样的代码。）void f(int n = counter++);</p></blockquote><p><strong>在其他情况下，如果缺省参数对可读性的提升远远超过了以上提及的缺点的话，可以使用缺省参数。如果仍有疑惑，就使用函数重载。</strong></p><h2 id="函数返回类型后置语法"><a href="#函数返回类型后置语法" class="headerlink" title="函数返回类型后置语法"></a>函数返回类型后置语法</h2><p><strong>总述</strong></p><blockquote><p>只有在常规写法（返回类型前置）不便于书写或不便于阅读时使用返回类型后置语法。</p></blockquote><p><strong>定义</strong></p><blockquote><p>C ++现在允许两种不同的函数声明方式。以往的写法是将返回类型置于函数名之前。例如：</p></blockquote><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span>  foo （<span class="keyword">int</span>  x ）;</span><br></pre></td></tr></table></figure><blockquote><p>C ++ 11引入了这一新的形式。现在可以在函数名前使用  auto 关键字，在参数列表之后后置返回类型。例如：</p></blockquote><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">auto</span>  foo （<span class="keyword">int</span>  x ） - &gt;  <span class="keyword">int</span> ;</span><br></pre></td></tr></table></figure><blockquote><p>后置返回类型为函数作用域。对于像  int 这样简单的类型，两种写法没有区别。但对于复杂的情况，例如类域中的类型声明或者以函数参数的形式书写的类型，写法的不同会造成区别。</p></blockquote><p><strong>优点</strong></p><blockquote><p>后置返回类型是显式地指定  Lambda表达式  的返回值的唯一方式。某些情况下，编译器可以自动推导出Lambda表达式的返回类型，但并不是在所有的情况下都能实现。即使编译器能够自动推导，显式地指定返回类型也能让读者更明了。</p></blockquote><blockquote><p>有时在已经出现了的函数参数列表之后指定返回类型，能够让书写更简单，也更易读，尤其是在返回类型依赖于模板参数时。<br>例如：</p></blockquote><figure class="highlight c++"><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="keyword">template</span>  &lt; <span class="class"><span class="keyword">class</span>  <span class="title">T</span> ， <span class="title">class</span>  <span class="title">U</span> &gt;  <span class="title">auto</span>  <span class="title">add</span> （<span class="title">T</span>  <span class="title">t</span> ， <span class="title">U</span>  <span class="title">u</span> ） - &gt;  </span></span><br><span class="line"><span class="class"><span class="title">decltype</span> （<span class="title">t</span>  +  <span class="title">u</span> ）;</span></span><br></pre></td></tr></table></figure><p>对比下面的例子：<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>  &lt; <span class="class"><span class="keyword">class</span>  <span class="title">T</span> ， <span class="title">class</span>  <span class="title">U</span> &gt;  <span class="title">decltype</span> （<span class="title">declval</span> &lt; T ＆&gt; （） +  <span class="title">declval</span> &lt; U ＆gt ;） add （T  t ， U  u ）;</span></span><br></pre></td></tr></table></figure></p><p><strong>缺点</strong></p><blockquote><p>后置返回类型相对来说是非常新的语法，而且在C和Java中都没有相似的写法，因此可能对读者来说比较陌生。<br>在已有的代码中有大量的函数声明，你不可能把它们都用新的语法重写一遍。因此实际的做法只能是使用旧的语法或者新旧混用。在这种情况下，只使用一种版本是相对来说更规整的形式。</p></blockquote><p><strong>结论</strong></p><blockquote><p>在大部分情况下，应当继续使用以往的函数声明写法，即将返回类型置于函数名前。只有在必要的时候（如Lambda表达式）或者使用后置语法能够简化书写并且提高易读性的时候才使用新的返回类型后置语法。但是后一种情况一般来说是很少见的，大部分时候都出现在相当复杂的模板代码中，而多数情况下不鼓励写这样  复杂的模板代码。</p></blockquote><h1 id="命名约定"><a href="#命名约定" class="headerlink" title="命名约定"></a>命名约定</h1><blockquote><p>最重要的一致性规则是命名管理。命名的风格能让我们在不需要去查找类型声明的条件下快速地了解某个名字代表的含义：类型，变量，函数，常量，宏，等等，甚至。我们大脑中的模式匹配引擎非常依赖这些命名规则。</p></blockquote><blockquote><p>命名规则具有一定随意性，但相比按个人喜好命名，一致性更重要，所以无论你认为它们是否重要，规则总归是规则。</p></blockquote><h2 id="通用命名规则"><a href="#通用命名规则" class="headerlink" title="通用命名规则"></a>通用命名规则</h2><p><strong>总述</strong></p><blockquote><p>函数命名，变量命名，文件命名要有描述性; 少用缩写。</p></blockquote><p><strong>说明</strong></p><blockquote><p>尽可能使用描述性的命名，别心疼空间，毕竟相比之下让代码易于新读者理解更重要。不要用只有项目开发者能理解的缩写，也不要通过砍掉几个字母来缩写单词。</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span>  price_count_reader ;     <span class="comment">//无缩写</span></span><br><span class="line"><span class="keyword">int</span>  num_errors ;             <span class="comment">//“num”是一个常见的写法</span></span><br><span class="line"><span class="keyword">int</span>  num_dns_connections ;    <span class="comment">//人人都知道“DNS”是什么</span></span><br><span class="line"><span class="keyword">int</span>  n ;                      <span class="comment">//毫无意义。</span></span><br><span class="line"><span class="keyword">int</span>  nerr ;                   <span class="comment">//含糊不清的缩写。</span></span><br><span class="line"><span class="keyword">int</span>  n_comp_conns ;           <span class="comment">//含糊不清的缩写。</span></span><br><span class="line"><span class="keyword">int</span>  wgc_connections ;        <span class="comment">//只有贵团队知道是什么意思</span></span><br><span class="line"><span class="keyword">int</span>  pc_reader ;              <span class="comment">//“pc”有太多可能的解释了。</span></span><br><span class="line"><span class="keyword">int</span>  cstmr_id ;               <span class="comment">//删减了若干字母。</span></span><br></pre></td></tr></table></figure><blockquote><p>注意，一些特定的广为人知的缩写是允许的，例如用  i 表示迭代变量和用  T 表示模板参数。</p></blockquote><blockquote><p>模板参数的命名应当遵循对应的分类：类型模板参数应当遵循  类型命名  的规则，而非类型模板应当 遵循变量命名  的规则。</p></blockquote><h2 id="文件命名"><a href="#文件命名" class="headerlink" title="文件命名"></a>文件命名</h2><p><strong>总述</strong></p><blockquote><p>文件名要全部小写，可以包含下划线（_）或连-字符（），依照项目的约定。如果没有约定，那么“ _” 更好。</p></blockquote><p><strong>说明</strong></p><blockquote><p>可接受的文件命名示例：</p></blockquote><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></pre></td><td class="code"><pre><span class="line">my_useful_class.cpp</span><br><span class="line">my-useful-<span class="class"><span class="keyword">class</span>.<span class="title">cpp</span></span></span><br><span class="line"><span class="class"><span class="title">myusefulclass</span>.<span class="title">cpp</span></span></span><br><span class="line"><span class="class"><span class="title">myusefulclass_test</span>.<span class="title">cpp</span> //  _<span class="title">unittest</span></span></span><br><span class="line"><span class="class">状语从句：  _<span class="title">regtest</span> 已弃用。</span></span><br></pre></td></tr></table></figure><blockquote><p>C ++文件要以  .cpp结尾，头文件以  .h 结尾。专门插入文本的文件则以  .inc 结尾，参见  头文件自足。</p></blockquote><blockquote><p>不要使用已经存在于  /usr/include 下的文件名（Yang.Y注：即编译器搜索系统头文件的路径），如 db.h。</p></blockquote><blockquote><p>通常应尽量让文件名更加明确。  http_server_logs.h 就比  logs.h 要好。定义类时文件名一般成对出现，如  foo_bar.h 和  foo_bar.cpp，对应于类  FooBar。</p></blockquote><blockquote><p>联内必须函数放在  .h 文件中。如果内联函数比较短，就直接放在  .h 中。</p></blockquote><h2 id="类型命名"><a href="#类型命名" class="headerlink" title="类型命名"></a>类型命名</h2><p><strong>总述</strong></p><blockquote><p>类型名称的每个单词首字母均大写，不包含下划线：  MyExcitingClass，  MyExcitingEnum。</p></blockquote><p><strong>说明</strong></p><blockquote><p>所有类型命名 - 类，结构体，类型定义（typedef），枚举，类型模板参数 - 均使用相同约定，即以大写字母开始，每个单词首字母均大写，不包含下划线。例如：</p></blockquote><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//类和结构体</span></span><br><span class="line">类 UrlTable  &#123;  ...</span><br><span class="line"><span class="class"><span class="keyword">class</span>  <span class="title">UrlTableTester</span>  &#123;</span>  ...</span><br><span class="line"><span class="class"><span class="keyword">struct</span>  <span class="title">UrlTableProperties</span>  &#123;</span>  ...</span><br><span class="line"></span><br><span class="line"><span class="comment">//类型定义</span></span><br><span class="line"><span class="keyword">typedef</span>  hash_map &lt; UrlTableProperties  * ， <span class="built_in">string</span> &gt;  PropertiesMap ;</span><br><span class="line"></span><br><span class="line"><span class="comment">//使用别名</span></span><br><span class="line">使用 PropertiesMap  =  hash_map &lt; UrlTableProperties  * ， <span class="built_in">string</span> &gt; ;</span><br><span class="line"></span><br><span class="line"><span class="comment">//枚举</span></span><br><span class="line"><span class="keyword">enum</span>  UrlTableErrors  &#123;  ...</span><br></pre></td></tr></table></figure><h2 id="变量命名"><a href="#变量命名" class="headerlink" title="变量命名"></a>变量命名</h2><p><strong>总述</strong></p><blockquote><p>变量（包括函数参数）和数据成员名一律小写，单词之间用下划线连接。类的成员变量以下划线结尾，但结构体的就不用，如：  a_local_variable，  a_struct_data_member， a_class_data_member_。</p></blockquote><p><strong>说明</strong></p><blockquote><p>普通变量命名</p></blockquote><p><strong>举例</strong>：</p><blockquote><p>字符串 table_name ;   //好 - 用下划线。<br>字符串 表名;    //好 - 全小写。<br>字符串 tableName ;   //差 - 混合大小写<br>类数据成员</p></blockquote><p><strong>不管是静态的还是非静态的，类数据成员都可以和普通变量一样，但要接下划线。</strong><br><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">类 TableInfo  &#123;</span><br><span class="line"> ...</span><br><span class="line"><span class="keyword">private</span> ：</span><br><span class="line"> <span class="built_in">string</span>  table_name_ ;   <span class="comment">//好 - 后加下划线。</span></span><br><span class="line"> 字符串 tablename_ ;    <span class="comment">//好。</span></span><br><span class="line"> 静态 池&lt; TableInfo &gt; *  pool_ ;   <span class="comment">//好。</span></span><br><span class="line">&#125;;</span><br><span class="line">结构体变量</span><br><span class="line"></span><br><span class="line">不管是静态的还是非静态的，结构体数据成员都可以和普通变量一样，不用像类那样接下划线：</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span>  <span class="title">UrlTableProperties</span>  &#123;</span></span><br><span class="line"> <span class="built_in">string</span>  name ;</span><br><span class="line"> <span class="keyword">int</span>  num_entries ;</span><br><span class="line"> 静态 池&lt; UrlTableProperties &gt; *  池;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></p><blockquote><p>结构体与类的使用讨论，参考 结构体与类。</p></blockquote><h2 id="常量命名"><a href="#常量命名" class="headerlink" title="常量命名"></a>常量命名</h2><p><strong>总述</strong></p><blockquote><p>声明为  constexpr 或  const 的变量，或在程序运行期间其值始始保持不变的，命名时以“k”开头，大小写混合。例如：<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span>  <span class="keyword">int</span>  kDaysInAWeek  =  <span class="number">7</span> ;</span><br></pre></td></tr></table></figure></p></blockquote><p><strong>说明</strong></p><blockquote><p>所有具有静态存储类型的变量（例如静态变量或全局变量，参见  存储类型）都应当以此方式命名。对于其他存储类型的变量，如自动变量等，这条规则是可选的。如果不采用这条规则，就按照一般的变量命名规则。</p></blockquote><h2 id="命名空间命名"><a href="#命名空间命名" class="headerlink" title="命名空间命名"></a>命名空间命名</h2><p><strong>总述</strong></p><blockquote><p>命名空间以小写字母命名。最高级命名空间的名字取决于项目名称。要注意避免嵌套命名空间的名字之间和常见的顶级命名空间的名字之间发生冲突。</p></blockquote><blockquote><p>顶级命名空间的名称应当是项目名或者是该命名空间中的代码所属的团队的名字。命名空间中的代码，应当存放于和命名空间的名字匹配的文件夹或其子文件夹中。</p></blockquote><blockquote><p>注意  不使用缩写作为名称  的规则同样适用于命名空间。命名空间中的代码极少需要涉及命名空间的名称，因此没有必要在命名空间中使用缩写。</p></blockquote><blockquote><p>要避免嵌套的命名空间与常见的顶级命名空间发生名称冲突。由于名称查找规则的存在，命名空间之间的冲突完全有可能导致编译失败。尤其是，不要创建嵌套的  std 命名空间。建议使用更独特的项目标识符（websearch::index，  websearch::index_util）而非常见的极易发生冲突的名称（比如 websearch::util）。</p></blockquote><blockquote><p>对于  internal 命名空间，要当心加入到同一  internal 命名空间的代码之间发生冲突（由于内部维护人员通常来自同一团队，因此常有可能导致冲突）。在这种情况下，请使用文件名以使内部名称独一无二（例如对于  frobber.h，使用  websearch::index::frobber_internal）。</p></blockquote><h2 id="枚举命名"><a href="#枚举命名" class="headerlink" title="枚举命名"></a>枚举命名</h2><p><strong>总述</strong></p><blockquote><p>枚举命名应当状语从句：  常量  或  宏  harmony和谐：  kEnumName 或是  ENUM_NAME。</p></blockquote><p><strong>说明</strong></p><blockquote><p>单独枚举值应该优先采用  常量  的命名方式。但  宏  方式的命名也可以接受。<br>枚举名 UrlTableErrors （以及  AlternateUrlTableErrors）是类型，所以要用大小写混合的方式。</p></blockquote><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><br><span class="line"><span class="keyword">enum</span>  UrlTableErrors  &#123;</span><br><span class="line">   kOK  =  <span class="number">0</span> ，</span><br><span class="line">   kErrorOutOfMemory ，</span><br><span class="line">   kErrorMalformedInput ，</span><br><span class="line">&#125;;</span><br><span class="line">枚举 AlternateUrlTableErrors  &#123;</span><br><span class="line">   OK  =  <span class="number">0</span> ，</span><br><span class="line">   OUT_OF_MEMORY  =  <span class="number">1</span> ，</span><br><span class="line">   MALFORMED_INPUT  =  <span class="number">2</span> ，</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="宏命名"><a href="#宏命名" class="headerlink" title="宏命名"></a>宏命名</h2><p><strong>总述</strong></p><blockquote><p>你并不打算  使用宏，对吧？如果你一定要用，像这样命名：  MY_MACRO_THAT_SCARES_SMALL_CHILDREN。</p></blockquote><p><strong>说明</strong></p><blockquote><p>参考  预处理宏 ; 通常  不应该  使用宏。如果不得不使用，其命名像枚举命名一样全部大写，使用下划线：</p></blockquote><figure class="highlight c"><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="meta">#<span class="meta-keyword">define</span> ROUND（x）...</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PI_ROUNDED 3.0</span></span><br></pre></td></tr></table></figure><h2 id="命名规则的特例"><a href="#命名规则的特例" class="headerlink" title="命名规则的特例"></a>命名规则的特例</h2><p><strong>总述</strong></p><blockquote><p>如果你命名的实体与已有C / C ++实体相似，可参考现有命名策略。</p></blockquote><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">bigopen()：函数名，参照  open() 的形式</span><br><span class="line"></span><br><span class="line">uint： <span class="keyword">typedef</span></span><br><span class="line"></span><br><span class="line">bigpos：  <span class="class"><span class="keyword">struct</span> 或  <span class="title">class</span>，参照  <span class="title">pos</span> 的形式</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">sparse_hash_map</span>：<span class="title">STL</span>型实体;</span> 参照STL命名约定</span><br><span class="line"></span><br><span class="line">LONGLONG_MAX：常量，如同 INT_MAX</span><br></pre></td></tr></table></figure><h1 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h1><blockquote><p>注释虽然写起来很痛苦，但对保证代码可读性至关重要。下面的规则描述了如何注释以及在哪儿注释。当然也要记住：注释固然很重要，但最好的代码应当本身就是文档。有意义的类型名和变量名，要远胜过要用注释解释的含糊不清的名字。</p></blockquote><blockquote><p>你写的注释是给代码读者看的，也就是下一个需要理解你的代码的人。所以慷慨些吧，下一个读者可能就是你！</p></blockquote><h2 id="注释风格"><a href="#注释风格" class="headerlink" title="注释风格"></a>注释风格</h2><p><strong>总述</strong></p><blockquote><p>使用  // 或  /*<em> </em> */ 统一就好。</p></blockquote><p>说明</p><blockquote><p>// 或 /*<em> </em> */  都可以; 但 //更  常用。要在如何注释及注释风格上确保统一。</p></blockquote><h2 id="文件注释"><a href="#文件注释" class="headerlink" title="文件注释"></a>文件注释</h2><p><strong>总述</strong></p><blockquote><p>在每一个文件开头加入版权公告。</p></blockquote><blockquote><p>文件注释描述了该文件的内容。如果一个文件只声明，或实现或测试了一个对象，并且这个对象已经在它的声明处进行了详细的注释，那么就没有必要再加上文件注释。除此之外的其他文件都需要文件注释。</p></blockquote><p><strong>说明</strong></p><blockquote><p>法律公告和作者信息</p><p>每个文件都应该包含许可证引用。为项目选择合适的许可证版本（比如，Apache 2.0，BSD，LGPL，GPL）</p><p>如果你对原始作者的文件做了重大修改，请考虑删除原作者信息。</p></blockquote><p><strong>文件内容</strong></p><blockquote><p>如果一个  .h 文件声明了多个概念，则文件注释应当对文件的内容做一个大致的说明，同时说明各个概念之间的联系。一个一到两行的文件注释就足够了，对于每个概念的详细文档应当放在各个概念中，而不是文件注释中。</p></blockquote><p><strong>不要在  .h 和  .cpp 之间复制注释，这样的注释偏离了注释的实际意义。</strong></p><h2 id="类注释"><a href="#类注释" class="headerlink" title="类注释"></a>类注释</h2><p><strong>总述</strong></p><blockquote><p>每个类的定义都要附带一份注释，描述类的功能和用法，除非它的功能相当明显。</p></blockquote><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><br><span class="line"><span class="comment">//遍历GargantuanTable的内容。</span></span><br><span class="line"><span class="comment">//示例：</span></span><br><span class="line"><span class="comment">// GargantuanTableIterator * iter = table-&gt; NewIterator（）;</span></span><br><span class="line"><span class="comment">// it for（iter-&gt; Seek（“foo”）;！iter-&gt; done（）; iter-&gt; Next（））&#123;</span></span><br><span class="line"><span class="comment">// process（iter-&gt; key（），iter-&gt; value（））;</span></span><br><span class="line"><span class="comment">//&#125;</span></span><br><span class="line"><span class="comment">//删除它;</span></span><br><span class="line">类 GargantuanTableIterator  &#123;</span><br><span class="line"> ...</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><strong>说明</strong></p><blockquote><p>类注释应当为读者理解如何使用与何时使用类提供足够的信息，同时应当提醒读者在正确使用此类时应当考虑的因素。如果类有任何同步前提，请用文档说明。如果该类的实例可被多线程访问，要特别注意文档说明多线程环境下相关的规则和常量使用。</p></blockquote><blockquote><p>如果你想用一小段代码演示这个类的基本用法或通常用法，放在类注释里也非常合适。</p></blockquote><blockquote><p>如果类的声明和定义分开了（例如分别放在了  .h 和  .cpp 文件中），此时，描述类用法的注释应当和接口定义放在一起，描述类的操作和实现的注释应当和实现放在一起。</p></blockquote><h2 id="函数注释"><a href="#函数注释" class="headerlink" title="函数注释"></a>函数注释</h2><p><strong>总述</strong></p><blockquote><p>函数声明处的注释描述函数功能; 定义处的注释描述函数实现。</p></blockquote><p><strong>说明</strong></p><blockquote><p>函数声明:基本上每个函数声明处前都应当加上注释，描述函数的功能和用途。只有在函数的功能简单而明显时才能省略这些注释（例如，简单的取值和设值函数）。注释使用叙述式（“打开文件”）而非指令式（“打开文件”）; 注释只是为了描述函数，而不是命令函数做什么。通常，注释不会描述函数如何工作。那是函数定义部分的事情。</p></blockquote><p><strong>函数声明处注释的内容：</strong></p><blockquote><p>函数的输入输出。<br>对类成员函数而言：函数调用期间对象是否需要保持引用参数，是否会释放这些参数。<br>函数是否分配了必须由调用者释放的空间。<br>参数是否可以为空指针。<br>是否存在函数使用上的性能隐患。<br>如果函数是可重入的，其同步提提是什么？<br>举例如下：</p></blockquote><blockquote><p>//返回此表的迭代器。<br>当迭代器完成时，它是<br>客户端的责任//并且一旦<br>创建<br>迭代器的GargantuanTable对象被删除，它就不能使用迭代器。//<br>//迭代器最初位于表的开始位置。<br>//<br>//此方法等同于：<br>// Iterator <em> iter = table-&gt; NewIterator（）;<br>// iter-&gt; Seek（“”）;<br>//返回iter;<br>//如果您要立即寻找到<br>返回的迭代器<br>中的其他位置，则使用NewIterator（）会更快，并避免额外的查找。<br>Iterator </em>  GetIterator （） const;<br>但也要避免罗罗嗦嗦，或者对显着易见的内容进行说明。下面的注释就没有必要加上“否则返回false”，因为已经暗含其中了：<br>//如果表不能包含更多条目，则返回true。<br>bool  IsTableFull （）;<br>注释函数重载时，注释的重点应该是函数中被重载的部分，而不是简单的重复被重载的函数的注释。多数情况下，函数重载不需要额外的文档，因此也没有必要加上注释。</p></blockquote><blockquote><p>注释构造/析构函数，切记读代码的人知道构造/析构函数的所有功能，所以“销毁这一对象”这样的注释是没有意义的。你应该注意的是注意构造函数对参数做了什么（例如，是否取得指针所有权）以及析构函数清理了什么。如果都是些无关紧要的内容，直接省掉注释。析构函数前没有注释是很正常的。</p></blockquote><p><strong>函数定义</strong></p><blockquote><p>如果函数的实现过程中用到了很巧妙的方式，那么在函数定义处应当加上解释性的注释。例如，你所使用的编程技巧，实现的大致步骤，或解释如此实现的理由。举个例子，你可以说明为什么函数的前半部分要加锁而后半部分不需要。</p></blockquote><blockquote><p>不要  从  .h 文件或其他地方的函数声明处直接复制注释。简要重述函数功能是可以的，但注释重点要放在如何实现上。</p></blockquote><h2 id="变量注释"><a href="#变量注释" class="headerlink" title="变量注释"></a>变量注释</h2><p><strong>总述</strong></p><blockquote><p>通常变量名本身足以很好说明变量用途。某些情况下，也需要额外的注释说明。</p></blockquote><p><strong>说明</strong></p><blockquote><p>类数据成员:每个类数据成员（也叫实例变量或成员变量）都应该用注释说明用途。如果有非变量的参数（例如特殊值，数据成员之间的关系，生命周期等）不能够使用类型与变量名明确表达，则应当加上注释。然而，如果变量类型与变量名已经足够描述一个变量，那么就不需要加上注释。</p></blockquote><p><strong>特别地，如果变量可以接受  NULL 或  -1 等警戒值，须加以说明。比如：</strong><br><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><br><span class="line"><span class="keyword">private</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="keyword">int</span>  num_total_entries_ ;</span><br><span class="line">全局变量</span><br><span class="line"></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="keyword">const</span>  <span class="keyword">int</span>  kNumTestCases  =  <span class="number">6</span> ;</span><br></pre></td></tr></table></figure></p><h2 id="实现注释"><a href="#实现注释" class="headerlink" title="实现注释"></a>实现注释</h2><p><strong>总述</strong></p><blockquote><p>对于代码中巧妙的，晦涩的，有趣的，重要的地方加以注释。</p></blockquote><p><strong>说明</strong></p><blockquote><p>代码前注释:巧妙或复杂的代码段前要加注释。比如：</p></blockquote><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="comment">//将结果除以2，考虑到x</span></span><br><span class="line"><span class="comment">//包含来自add的进位。</span></span><br><span class="line"><span class="keyword">for</span>  （<span class="keyword">int</span>  i  =  <span class="number">0</span> ;  i  &lt;  result - &gt; size （）;  i ++ ） &#123;</span><br><span class="line"> x  =  （x  &lt;&lt;  <span class="number">8</span> ） +  （* result ）[ i ];</span><br><span class="line"> （* 结果）[ i ]  =  x  &gt;&gt;  <span class="number">1</span> ;</span><br><span class="line"> x  ＆=  <span class="number">1</span> ;</span><br><span class="line">&#125;</span><br><span class="line">行注释</span><br><span class="line"></span><br><span class="line">比较隐晦的地方要在行尾加入注释。在行尾空两格进行注释。比如：</span><br><span class="line"></span><br><span class="line"><span class="comment">//如果我们有足够的内存，也可以对数据部分进行mmap。</span></span><br><span class="line">mmap_budget  =  max &lt; int64 &gt; （<span class="number">0</span> ， mmap_budget  -  index_ - &gt; length （））;</span><br><span class="line"><span class="keyword">if</span>  （mmap_budget  &gt; =  data_size_  &amp;&amp;  ！MmapData （mmap_chunk_bytes ， mlock ））</span><br><span class="line"> <span class="keyword">return</span> ;   <span class="comment">//错误已经记录。</span></span><br><span class="line">注意，这里用了两段注释分别描述这段代码的作用，并提示函数返回错误已经被记入日志。</span><br><span class="line"></span><br><span class="line">如果你需要连续进行多行注释，可以使之对齐获得更好的可读性：</span><br><span class="line"></span><br><span class="line">DoSomething （）;                   <span class="comment">//在这里发表评论，以便评论排成一行。</span></span><br><span class="line">DoSomethingElseThatIsLonger （）;   <span class="comment">//代码和注释之间有两个空格。</span></span><br><span class="line">&#123;  <span class="comment">//允许打开一个新的作用域时，在注释之前的一个空格</span></span><br><span class="line"> <span class="comment">// //因此注释与下面的注释和代码一起排列。</span></span><br><span class="line"> DoSomethingElse （）;   <span class="comment">//通常在行注释之前有两个空格。</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">std</span> :: <span class="built_in">vector</span> &lt; <span class="built_in">string</span> &gt;  <span class="built_in">list</span> &#123;</span><br><span class="line">                   <span class="comment">//支撑列表中的注释描述下一个元素...</span></span><br><span class="line">                   “First item” ，</span><br><span class="line">                   <span class="comment">// ..并且应该适当地对齐。</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><strong>函数参数注释</strong></p><p><strong>如果函数参数的意义不明显，考虑用下面的方式进行弥补：</strong></p><blockquote><p>如果参数是一个字面常量，并且这一常量在多处函数调用中被使用，用以推断它们一致，你应该用一个常量名让这个约定变得更明显，并且保证这一约定不会被打破。<br>考虑更改函数的签名，让某个  bool 类型的参数变为  enum 类型，这样可以让这个参数的值表达其意义。<br>如果某个函数有多个配置选项，你可以考虑定义一个类或结构体以保存所有的选项，并传入类或结构体的实例。这样的方法有许多优点，例如这样的选项可以在调用处用变量名引用，这样就能清晰地表明其意义。同时也减少了函数参数的数量，使得函数调用更易读也易写。除此之外，以这样的方式，如果你使用其他的选项，就无需对调用点进行更改。<br>用具名变量代替大段而复杂的嵌套表达式。<br>万不得已时，才考虑在调用点用注释阐明参数的意义。</p></blockquote><p><strong>不允许的行为</strong></p><blockquote><p>不要描述显而易见的现象，  永远不要  用自然语言翻译代码作为注释，除非即使对深入理解C ++的读者来说代码的行为都是不明显的。要假设读代码的人C ++水平比你高，即便他/她可能不知道你的用意.</p></blockquote><blockquote><p>你所提供的注释应当解释代码  为什么  要这么做和代码的目的，或者最好是让代码自文档化.</p></blockquote><h2 id="标点，拼写和语法"><a href="#标点，拼写和语法" class="headerlink" title="标点，拼写和语法"></a>标点，拼写和语法</h2><p><strong>总述</strong></p><blockquote><p>注意标点，拼写和语法; 写的好的注释比差的要易读的多。</p></blockquote><p><strong>说明</strong></p><blockquote><p>注释的通常写法是包含正确大小写和结尾句号的完整叙述性语句。大多数情况下，完整的句子比句子片段可读性更高。短一点的注释，比如代码行尾注释，可以随意点，但依然要注意风格的一致性。</p></blockquote><blockquote><p>虽然被别人指出该用分号时却用了逗号多少有些尴尬，但清晰易读的代码还是很重要的。正确的标点，拼写和语法对此会有很大帮助。</p></blockquote><h2 id="行长度"><a href="#行长度" class="headerlink" title="行长度"></a>行长度</h2><p><strong>总述</strong></p><blockquote><p>每一行代码字符数不超过80。</p></blockquote><blockquote><p>我们也认识到这条规则是有争议的，但很多已有代码都遵照这一规则，因此我们感觉一致性更重要。</p></blockquote><p><strong>优点</strong></p><blockquote><p>提倡该原则的人认为强迫他们调整编辑器窗口大小是很野蛮的行为。很多人同时并排开几个代码窗口，根本没有多余的空间拉伸窗口。大家都把窗口最大尺寸加以限定，并且80列宽是传统标准。那么为什么要改变呢？</p></blockquote><p><strong>缺点</strong></p><blockquote><p>反对该原则的人则认为更宽的代码行更易阅读。80列的限制是上个世纪60年代的大型机的古板缺陷;现代设备具有更宽的显示屏，可以很轻松地显示更多代码。</p></blockquote><p><strong>结论</strong></p><blockquote><p>80个字符是最大值。</p></blockquote><blockquote><p>如果无法在不伤害易读性的条件下进行断行，那么注释行可以超过80个字符，这样可以方便复制粘贴。例如，带有命令示例或URL的行可以超过80个字符。长所有游戏的路径  #include 语句可以超出80列。</p></blockquote><p><strong>文件头保护  可以无视该原则。</strong></p><h2 id="函数调用"><a href="#函数调用" class="headerlink" title="函数调用"></a>函数调用</h2><p><strong>总述</strong></p><blockquote><p>要么一行写完函数调用，要么在圆括号里对参数分行，要么参数另起一行且缩进四格。如果没有其它顾虑的话，尽可能精简行数，比如把多个参数适当地放在同一行里。</p></blockquote><p><strong>说明</strong></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></pre></td><td class="code"><pre><span class="line">函数调用遵循如下形式：</span><br><span class="line"></span><br><span class="line"><span class="keyword">bool</span>  retval  =  DoSomething （argument1 ， argument2 ， argument3 ）;</span><br><span class="line">如果同一行放不下，可断为多行，后面每一行都和第一个实参对齐，左圆括号后和右圆括号前不要留空格：</span><br><span class="line"></span><br><span class="line"><span class="keyword">bool</span>  retval  =  DoSomething （averyveryveryverylongargument1 ，</span><br><span class="line">                         argument2 ， argument3 ）;</span><br><span class="line">参数也可以放在次行，缩进四格：</span><br><span class="line"></span><br><span class="line">如果 （...） &#123;</span><br><span class="line"> ...</span><br><span class="line"> ...</span><br><span class="line"> <span class="keyword">if</span>  （...） &#123;</span><br><span class="line">   DoSomething （</span><br><span class="line">       argument1 ， argument2 ，  <span class="comment">// 4空格缩进</span></span><br><span class="line">       argument3 ， argument4 ）;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure><blockquote><p>把多个参数放在同一行以减少函数调用所需的行数，除非影响到可读性。有人认为把每个参数都独立成行，不仅更好读，而且方便编辑参数。</p></blockquote><h2 id="循环和开关选择语句"><a href="#循环和开关选择语句" class="headerlink" title="循环和开关选择语句"></a>循环和开关选择语句</h2><p><strong>总述</strong></p><blockquote><p>switch 语句可以使用大括号分段，以表明cases之间不是连在一起的。在单语句循环里，括号可用可不用。循环空应行业释义体育使用  {} 或  continue。</p></blockquote><p><strong>说明</strong></p><blockquote><p>switch 语句中的  case 块可以使用大括号也可以不用，取决于你的个人喜好。如果用的话，要按照下文所述的方法。</p></blockquote><blockquote><p>如果有不满足  case 条件的枚举值，  switch 应该default 总是包含一个  匹配（如果有输入值没有case去处理，编译器将给出警告）。如果  default 应该永远执行不到，简单的加条  assert：</p></blockquote><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">switch</span>  （var ） &#123;</span><br><span class="line"> <span class="keyword">case</span>  <span class="number">0</span> ： &#123;   <span class="comment">// 2空格缩进</span></span><br><span class="line">   ...       <span class="comment">// 4空格缩进</span></span><br><span class="line">   <span class="keyword">break</span> ;</span><br><span class="line"> &#125;</span><br><span class="line"> 案例 <span class="number">1</span> ： &#123;</span><br><span class="line">   ...</span><br><span class="line">   <span class="keyword">break</span> ;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">default</span> ： &#123;</span><br><span class="line">   assert （<span class="literal">false</span> ）;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>在单语句循环里，括号可用可不用：</strong><br><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><br><span class="line"><span class="keyword">for</span>  （<span class="keyword">int</span>  i  =  <span class="number">0</span> ;  i  &lt;  kSomeNumber ;  ++ i ）</span><br><span class="line"> <span class="built_in">printf</span> （“我爱你\ n ” ）;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span>  （<span class="keyword">int</span>  i  =  <span class="number">0</span> ;  i  &lt;  kSomeNumber ;  ++ i ） &#123;</span><br><span class="line"> <span class="built_in">printf</span> （“我拿回来\ n ” ）;</span><br><span class="line">&#125;</span><br><span class="line">空循环体应使用  &#123;&#125; 或  <span class="keyword">continue</span>，而不是一个简单的分号。</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>  （condition ） &#123;</span><br><span class="line"> <span class="comment">//反复循环直到条件失效。</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>  （<span class="keyword">int</span>  i  =  <span class="number">0</span> ;  i  &lt;  kSomeNumber ;  ++ i ） &#123;&#125;   <span class="comment">//可 - 空循环体。</span></span><br><span class="line">同时 （条件） 继续;   <span class="comment">//可 -  contunue表明没有逻辑。</span></span><br><span class="line"><span class="keyword">while</span>  （condition ）;   <span class="comment">//差 - 看起来仅仅只是while / loop的部分之一。</span></span><br></pre></td></tr></table></figure></p><h2 id="构造函数初始值列表"><a href="#构造函数初始值列表" class="headerlink" title="构造函数初始值列表"></a>构造函数初始值列表</h2><p><strong>总述*</strong></p><blockquote><p>构造函数初始化列表放在同一行或按四格缩进并排多行。</p></blockquote><p><strong>说明</strong></p><blockquote><p>下面两种初始值列表方式都可以接受：</p></blockquote><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//如果所有变量能放在同一行：</span></span><br><span class="line">MyClass :: MyClass （<span class="keyword">int</span>  var ） ： some_var_ （var ） &#123;</span><br><span class="line"> DoSomething （）;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//如果不能放在同一行，</span></span><br><span class="line"><span class="comment">//必须置于冒号后，并缩进4个空格</span></span><br><span class="line">MyClass :: MyClass （<span class="keyword">int</span>  var ）</span><br><span class="line">   ： some_var_ （var ）， some_other_var_ （var  +  <span class="number">1</span> ） &#123;</span><br><span class="line"> DoSomething （）;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//如果初始化列表需要置于多行，将每个成员放在单独的一行</span></span><br><span class="line"><span class="comment">//并逐行对齐</span></span><br><span class="line">MyClass :: MyClass （<span class="keyword">int</span>  var ）</span><br><span class="line">   ： some_var_ （var ），             <span class="comment">// 4空格缩进</span></span><br><span class="line">     some_other_var_ （var  +  <span class="number">1</span> ） &#123;   <span class="comment">//列队</span></span><br><span class="line"> DoSomething （）;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//右大括号&#125;可以和左大括号&#123;放在同一行</span></span><br><span class="line"><span class="comment">//如果这样做合适的话</span></span><br><span class="line">MyClass :: MyClass （<span class="keyword">int</span>  var ）</span><br><span class="line">   ： some_var_ （var ） &#123;&#125;</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p>代码规范是项目开发非常重要的一点，作为一名合格的程序猿应该将代码规范熟记于心。</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;本文摘录自谷歌开源项目开源指南。&lt;/p&gt;
&lt;p&gt;详见  —&amp;gt;&lt;a href=&quot;http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;谷歌开源项目开源指南&lt;/a&gt;&lt;br&gt;
    
    </summary>
    
      <category term="C++知识及题集" scheme="https://gbrweb.github.io/categories/C-%E7%9F%A5%E8%AF%86%E5%8F%8A%E9%A2%98%E9%9B%86/"/>
    
    
      <category term="c/c++代码规范" scheme="https://gbrweb.github.io/tags/c-c-%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/"/>
    
  </entry>
  
  <entry>
    <title>【C语言】经典小游戏-扫雷</title>
    <link href="https://gbrweb.github.io/2018/05/22/201855223/"/>
    <id>https://gbrweb.github.io/2018/05/22/201855223/</id>
    <published>2018-05-22T05:27:47.000Z</published>
    <updated>2018-06-01T16:28:51.249Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>扫雷，是一个Windows平台下一个经典的小游戏，今有兴趣玩了几把后，就利用所学二维数组的相关知识模拟实现了一个“扫雷游戏”。由于学识浅薄，界面有点简陋，尽请谅解！<br><a id="more"></a></p></blockquote><h1 id="项目思路"><a href="#项目思路" class="headerlink" title="项目思路:"></a>项目思路:</h1><ul><li>首先想一想扫雷游戏在Windows平台下是如何实现的。</li></ul><ul><li>其次通过观察游戏，我们可以想到需要用两个二维数组来实现扫雷的功能。</li></ul><ul><li>游戏刚开始，需要需要显示棋盘，用“*”遮盖雷的坐标，所以要有一个填充棋盘的函数。</li><li>通过rand()函数，随机生成雷的坐标，埋雷的函数。</li><li>每次扫过后，都要显示新的棋盘，显示棋盘的函数。</li><li>如果要想第一次踩不到雷的，需要把该坐标下得雷移动到其他不是雷的坐标，并且点击不是雷，还要满足一点击一片的效果。</li><li>最后需要一个函数判断是否扫雷成功。</li></ul><h1 id="项目展示："><a href="#项目展示：" class="headerlink" title="项目展示："></a>项目展示：</h1><p><img src="/img/5231.png" alt="图片加载">  </p><p><img src="/img/5232.png" alt="图片加载"><br><strong>是不是很有意思？当然重中之重的是：</strong></p><blockquote><p>要注意需要用二维数组来打印两个棋盘，假如我们要打印10X10的棋盘，那我们的二维数组元素也要为10X10个吗？，不能，因为我们在设计算法时需要统计坐标周围8个方位雷的个数，假如要统计边界坐标周围雷的个数，那么就会有数组越界的问题，那我们就要在10X10的边界多上一圈元素，也就要定义12X12的数组元素，这些元素我们不要打印出来，心里有数就行。</p></blockquote><h1 id="项目源码："><a href="#项目源码：" class="headerlink" title="项目源码："></a>项目源码：</h1><h2 id="game-h"><a href="#game-h" class="headerlink" title="game.h:"></a>game.h:</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/*********************************************************************************************</span></span><br><span class="line"><span class="comment">*                     项目名称：扫雷游戏                                                       *</span></span><br><span class="line"><span class="comment">*             编译环境：Vs 2013                                                *</span></span><br><span class="line"><span class="comment">*                     创建日期：2018.4.18                                                      *</span></span><br><span class="line"><span class="comment">*                     项目编辑：Mr.Yao                                                         *  </span></span><br><span class="line"><span class="comment">***********************************************************************************************/</span>  </span><br><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">//2.函数  </span></span><br><span class="line"><span class="comment">//3.循环  </span></span><br><span class="line"><span class="comment">//4.扩展内容： 递归 (内存换取时间)  </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifndef</span> __GAME_H_  </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> __GAME_H_  </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;  </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;Windows.h&gt;  </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;time.h&gt;  </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string.h&gt;  </span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">enum</span> opp  </span><br><span class="line">&#123;  </span><br><span class="line">    EXIT,  </span><br><span class="line">    PLAY  </span><br><span class="line">&#125;;  </span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> EASY 10  </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> HARD 30  </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> ROW 10  </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> COL 10  </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> ROWS (ROW+2)  </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> COLS (COL+2)  </span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitMap</span><span class="params">(<span class="keyword">char</span> arr[ROWS][COLS], <span class="keyword">int</span> row,<span class="keyword">int</span> col, <span class="keyword">char</span> <span class="built_in">set</span>)</span></span>; <span class="comment">//创建初始化棋盘  </span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintMap</span><span class="params">(<span class="keyword">char</span> arr[ROWS][COLS], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span></span>;  <span class="comment">//打印棋盘  </span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SetMy</span><span class="params">(<span class="keyword">char</span> arr[ROWS][COLS], <span class="keyword">int</span> row, <span class="keyword">int</span> col, <span class="keyword">int</span> count)</span></span>; <span class="comment">//布雷  </span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SweepMap</span><span class="params">(<span class="keyword">char</span> my_map[ROWS][COLS], <span class="keyword">char</span> player_map[ROWS][COLS], <span class="keyword">int</span> row, <span class="keyword">int</span> cow, <span class="keyword">int</span> sum)</span></span>; <span class="comment">//扫雷  </span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MoveLei</span><span class="params">(<span class="keyword">char</span> my_map[ROWS][COLS], <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span>; <span class="comment">//若第一次扫到雷，则移动雷的位置  </span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GetCount</span><span class="params">(<span class="keyword">char</span> my_map[ROWS][COLS], <span class="keyword">char</span> player_map[ROWS][COLS], <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span></span>;<span class="comment">//统计雷数  </span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></table></figure><h2 id="game-c"><a href="#game-c" class="headerlink" title="game.c:"></a>game.c:</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><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><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1  </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"game.h"</span>  </span></span><br><span class="line"><span class="comment">//初始化棋盘</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">InitMap</span><span class="params">(<span class="keyword">char</span> arr[ROWS][COLS], <span class="keyword">int</span> row, <span class="keyword">int</span> col, <span class="keyword">char</span> <span class="built_in">set</span>)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="built_in">memset</span>(arr, <span class="built_in">set</span>, col*row*<span class="keyword">sizeof</span>(arr[<span class="number">0</span>][<span class="number">0</span>]));  </span><br><span class="line">&#125;  </span><br><span class="line"><span class="comment">//打印棋盘</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">PrintMap</span><span class="params">(<span class="keyword">char</span> arr[ROWS][COLS], <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">        <span class="keyword">int</span> i = <span class="number">0</span>;  </span><br><span class="line">        <span class="keyword">int</span> j = <span class="number">0</span>;  </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"   "</span>);  </span><br><span class="line">        <span class="keyword">for</span> (i = <span class="number">1</span>; i&lt;=row ; i++)  </span><br><span class="line">        &#123;  </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"%3d"</span>, i);  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"\n"</span>);  </span><br><span class="line">        <span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;=row; i++)  </span><br><span class="line">        &#123;  </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"---"</span>);  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"\n"</span>);  </span><br><span class="line">        <span class="keyword">for</span> (i = <span class="number">1</span>; i &lt;= row; i++)  </span><br><span class="line">        &#123;                                  </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"%2d|"</span>, i);  </span><br><span class="line">            <span class="keyword">for</span> (j = <span class="number">1</span>; j &lt;= col ; j++)  </span><br><span class="line">            &#123;  </span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">"%3c"</span>, arr[i][j]);  </span><br><span class="line">            &#125;  </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"\n"</span>);  </span><br><span class="line">        &#125;  </span><br><span class="line"></span><br><span class="line">&#125;  </span><br><span class="line"><span class="comment">//布雷</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SetMy</span><span class="params">(<span class="keyword">char</span> arr[ROWS][COLS], <span class="keyword">int</span> row, <span class="keyword">int</span> col, <span class="keyword">int</span> sum)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> count = sum;  </span><br><span class="line">    <span class="keyword">int</span> x = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> y = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">while</span> (count)  </span><br><span class="line">    &#123;  </span><br><span class="line">        x = rand() % row + <span class="number">1</span>;  </span><br><span class="line">        y = rand() % col + <span class="number">1</span>;  </span><br><span class="line">        <span class="keyword">if</span> (arr[x][y] == <span class="string">'0'</span>)  </span><br><span class="line">        &#123;  </span><br><span class="line">            arr[x][y] = <span class="string">'1'</span>;  </span><br><span class="line">            count--;  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;  </span><br><span class="line"><span class="comment">//扫雷</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">SweepMap</span><span class="params">(<span class="keyword">char</span> my_map[ROWS][COLS],<span class="keyword">char</span> player_map[ROWS][COLS], <span class="keyword">int</span> row, <span class="keyword">int</span> col, <span class="keyword">int</span> sum)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> x = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> y = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> count = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> temp = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> win = <span class="number">0</span>;  </span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (win &lt; (row * col - sum))  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"请输入你扫雷坐标:&gt;"</span>);  </span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">"%d%d"</span>, &amp;x, &amp;y);  </span><br><span class="line">        temp++;  </span><br><span class="line">        <span class="keyword">if</span> (x &gt;= <span class="number">1</span> &amp;&amp; x &lt;= row&amp;&amp;y &gt;= <span class="number">1</span> &amp;&amp; y &lt;= col)  </span><br><span class="line">        &#123;  </span><br><span class="line"></span><br><span class="line">            <span class="keyword">while</span> ((my_map[x][y] == <span class="string">'1'</span>) &amp;&amp; (temp == <span class="number">1</span>))  </span><br><span class="line">            &#123;  </span><br><span class="line">                <span class="comment">//保证玩家第一次不死  </span></span><br><span class="line">                MoveLei(my_map, x, y);  </span><br><span class="line">                <span class="comment">//对周围的雷数进行遍历  </span></span><br><span class="line">                GetCount(my_map, player_map, x, y);  </span><br><span class="line">            &#125;  </span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (my_map[x][y] == <span class="string">'1'</span>)  </span><br><span class="line">            &#123;  </span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">"\n恭喜你，壮烈牺牲\n"</span>);  </span><br><span class="line">                PrintMap(my_map, ROW, COL);  </span><br><span class="line">                <span class="keyword">break</span>;  </span><br><span class="line">            &#125;  </span><br><span class="line">            <span class="keyword">else</span>  </span><br><span class="line">            &#123;  </span><br><span class="line">                GetCount(my_map, player_map, x, y);  </span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">"\n"</span>);  </span><br><span class="line">                win++;  </span><br><span class="line">            &#125;  </span><br><span class="line">            PrintMap(player_map, ROW, COL);  </span><br><span class="line">        &#125;  </span><br><span class="line">        <span class="keyword">else</span>  </span><br><span class="line">        &#123;  </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"坐标输入有误\n"</span>);  </span><br><span class="line">        &#125;  </span><br><span class="line"></span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="keyword">if</span>(win == (row * col - sum))  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"恭喜你，排完了\n"</span>);  </span><br><span class="line">    &#125;  </span><br><span class="line"></span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="comment">//若输入的坐标无雷，则要遍历周围，统计雷数    </span></span><br><span class="line"><span class="comment">//若周围无雷，则递归遍历，统计周围雷数    </span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GetCount</span><span class="params">(<span class="keyword">char</span> my_map[ROWS][COLS], <span class="keyword">char</span> player_map[ROWS][COLS], <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> ((my_map[x][y] == <span class="string">'0'</span>))  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">int</span> count = <span class="number">0</span>;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (my_map[x - <span class="number">1</span>][y - <span class="number">1</span>] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (my_map[x - <span class="number">1</span>][y] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (my_map[x - <span class="number">1</span>][y + <span class="number">1</span>] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (my_map[x][y - <span class="number">1</span>] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (my_map[x][y + <span class="number">1</span>] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line">        <span class="keyword">if</span> (my_map[x + <span class="number">1</span>][y - <span class="number">1</span>] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (my_map[x + <span class="number">1</span>][y] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (my_map[x + <span class="number">1</span>][y + <span class="number">1</span>] == <span class="string">'1'</span>)  </span><br><span class="line">            count++;  </span><br><span class="line"></span><br><span class="line">        player_map[x][y] = (count + <span class="string">'0'</span>);  </span><br><span class="line">    &#125;  </span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (player_map[x][y] == <span class="string">'0'</span>)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">if</span> (player_map[x - <span class="number">1</span>][y - <span class="number">1</span>] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x - <span class="number">1</span>, y - <span class="number">1</span>);  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (player_map[x - <span class="number">1</span>][y] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x - <span class="number">1</span>, y);  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (player_map[x - <span class="number">1</span>][y + <span class="number">1</span>] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x - <span class="number">1</span>, y + <span class="number">1</span>);  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (player_map[x][y - <span class="number">1</span>] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x, y - <span class="number">1</span>);  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (player_map[x][y + <span class="number">1</span>] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x, y + <span class="number">1</span>);  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (player_map[x + <span class="number">1</span>][y - <span class="number">1</span>] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x + <span class="number">1</span>, y - <span class="number">1</span>);  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (player_map[x + <span class="number">1</span>][y] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x + <span class="number">1</span>, y);  </span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (player_map[x + <span class="number">1</span>][y + <span class="number">1</span>] == <span class="string">'*'</span>)  </span><br><span class="line">            GetCount(my_map, player_map, x + <span class="number">1</span>, y + <span class="number">1</span>);  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="comment">//为提高游戏体验，设置玩家第一次无论如何都不会被炸死    </span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">MoveLei</span><span class="params">(<span class="keyword">char</span> my_map[ROWS][COLS], <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> ret = <span class="number">1</span>;  </span><br><span class="line">    <span class="keyword">do</span>  </span><br><span class="line">    &#123;  </span><br><span class="line">        my_map[x][y] = <span class="string">'0'</span>;  </span><br><span class="line">        <span class="keyword">while</span> (ret)  </span><br><span class="line">        &#123;  </span><br><span class="line">            x = rand() % ROW + <span class="number">1</span>;  </span><br><span class="line">            y = rand() % COL + <span class="number">1</span>;  </span><br><span class="line">            <span class="keyword">if</span> (my_map[x][y] == <span class="string">'0'</span>)  </span><br><span class="line">            &#123;  </span><br><span class="line">                my_map[x][y] = <span class="string">'1'</span>;  </span><br><span class="line">            &#125;  </span><br><span class="line">            ret--;  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125; <span class="keyword">while</span> (ret);  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="test-c"><a href="#test-c" class="headerlink" title="test.c"></a>test.c</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><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1  </span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"game.h"</span>  </span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">GotoXY</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> <span class="comment">//设定输出位置  </span></span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    COORD c;  </span><br><span class="line">    c.X = x - <span class="number">1</span>;  </span><br><span class="line">    c.Y = y - <span class="number">1</span>;  </span><br><span class="line">    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);  </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">meau</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    GotoXY(<span class="number">10</span>, <span class="number">5</span>); <span class="built_in">printf</span>(<span class="string">"开始游戏\n         Let's Go!"</span>);  </span><br><span class="line">    Sleep(<span class="number">1500</span>);  </span><br><span class="line">    system(<span class="string">"cls"</span>);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"****    《扫雷》    ****\n"</span>);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"************************\n"</span>);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"*******  1.play  *******\n"</span>);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"*******  0.exit  *******\n"</span>);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"************************\n"</span>);  </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">game</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> input = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> sum = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">char</span> my_map[ROWS][COLS];  </span><br><span class="line">    <span class="keyword">char</span> player_map[ROWS][COLS];  </span><br><span class="line"></span><br><span class="line">    InitMap(my_map,ROWS,COLS,<span class="string">'0'</span>);  </span><br><span class="line">    InitMap(player_map, ROWS, COLS, <span class="string">'*'</span>);  </span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"**** 1.Easy 0.Hard *****\n"</span>);  </span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;input);  </span><br><span class="line">    <span class="keyword">switch</span> (input)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">case</span> PLAY:  </span><br><span class="line">            sum = EASY;  </span><br><span class="line">            <span class="keyword">break</span>;  </span><br><span class="line">        <span class="keyword">case</span> EXIT:  </span><br><span class="line">            sum = HARD;  </span><br><span class="line">            <span class="keyword">break</span>;  </span><br><span class="line">        <span class="keyword">default</span>:  </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"输入有误\n"</span>);  </span><br><span class="line">            <span class="keyword">break</span>;  </span><br><span class="line">    &#125;  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"\n这个棋盘有%d个雷。\n"</span>, sum);  </span><br><span class="line">    SetMy(my_map,ROW,COL,sum);  </span><br><span class="line"></span><br><span class="line">    PrintMap(player_map, ROW, COL);  </span><br><span class="line">    <span class="comment">//PrintMap(my_map, ROW, COL);  </span></span><br><span class="line">    SweepMap(my_map,player_map ,ROW, COL, sum);  </span><br><span class="line">    system(<span class="string">"pause"</span>);  </span><br><span class="line">&#125;  </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="keyword">void</span> <span class="title">test</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;      </span><br><span class="line">    <span class="keyword">int</span> input = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">do</span>  </span><br><span class="line">    &#123;  </span><br><span class="line">        meau();  </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"请选择:&gt;"</span>);  </span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;input);  </span><br><span class="line">        <span class="keyword">switch</span> (input)  </span><br><span class="line">        &#123;  </span><br><span class="line">        <span class="keyword">case</span> PLAY:  </span><br><span class="line">            game();  </span><br><span class="line">            <span class="keyword">break</span>;  </span><br><span class="line">        <span class="keyword">case</span> EXIT:  </span><br><span class="line">            <span class="keyword">break</span>;  </span><br><span class="line">        <span class="keyword">default</span>:  </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"输出有误\n"</span>);  </span><br><span class="line">        &#125;  </span><br><span class="line"></span><br><span class="line">    &#125; <span class="keyword">while</span> (input);  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    srand((<span class="keyword">unsigned</span>)time(<span class="literal">NULL</span>));  </span><br><span class="line">    test();  </span><br><span class="line">    system(<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">&#125;</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p>简单利用C语言做了一个小游戏，如有不正之处，欢迎双击评论！</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;扫雷，是一个Windows平台下一个经典的小游戏，今有兴趣玩了几把后，就利用所学二维数组的相关知识模拟实现了一个“扫雷游戏”。由于学识浅薄，界面有点简陋，尽请谅解！&lt;br&gt;
    
    </summary>
    
      <category term="项目实战" scheme="https://gbrweb.github.io/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/"/>
    
    
      <category term="扫雷" scheme="https://gbrweb.github.io/tags/%E6%89%AB%E9%9B%B7/"/>
    
  </entry>
  
  <entry>
    <title>【Git命令】大全</title>
    <link href="https://gbrweb.github.io/2018/05/22/20180522/"/>
    <id>https://gbrweb.github.io/2018/05/22/20180522/</id>
    <published>2018-05-22T05:27:47.000Z</published>
    <updated>2018-06-01T16:28:51.244Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>经过搜集、整理，现得到以下Git相关知识，相互学习，相互促进。</p><ul><li>上传日期：2018.5.22  </li><li>整理员：Hunter<a id="more"></a>  </li></ul></blockquote><h1 id="git命令学习笔记"><a href="#git命令学习笔记" class="headerlink" title="git命令学习笔记"></a>git命令学习笔记</h1><h2 id="●配置name和email"><a href="#●配置name和email" class="headerlink" title="●配置name和email"></a>●配置name和email</h2><p>$ git config –global user.name “your name”</p><p>$ git config –global user.email “your <a href="mailto:email@example.com" target="_blank" rel="noopener">email@example.com</a>“</p><p>//–global是全局参数，表示这个账户上所以的Git仓库都使用这个配置</p><h2 id="●配置别名"><a href="#●配置别名" class="headerlink" title="●配置别名"></a>●配置别名</h2><p>$ git config –global alias.st status</p><h2 id="●各种状态显示不同颜色"><a href="#●各种状态显示不同颜色" class="headerlink" title="●各种状态显示不同颜色"></a>●各种状态显示不同颜色</h2><p>$ git config –global color.ui true</p><h2 id="●创建并成为让Git管理的仓库"><a href="#●创建并成为让Git管理的仓库" class="headerlink" title="●创建并成为让Git管理的仓库"></a>●创建并成为让Git管理的仓库</h2><p>$ mkdir &lt;文件名&gt;</p><p>$ cd &lt;文件名&gt;</p><p>$ git init//初始化一个仓库</p><p>$ ls -ah//此命令用于看见隐藏的.git</p><h2 id="●将文件添加到Git的仓库里"><a href="#●将文件添加到Git的仓库里" class="headerlink" title="●将文件添加到Git的仓库里"></a>●将文件添加到Git的仓库里</h2><p>$ git add &lt;文件名&gt;</p><p>//第一步，把文件放到暂存区</p><p>$ git commit -m”本次提交的说明”</p><p>//把暂存区的所有内容提交到当前分支</p><h2 id="●查看工作区当前状态"><a href="#●查看工作区当前状态" class="headerlink" title="●查看工作区当前状态"></a>●查看工作区当前状态</h2><p>$ git status</p><h2 id="●查看修改内容"><a href="#●查看修改内容" class="headerlink" title="●查看修改内容"></a>●查看修改内容</h2><p>$ git diff</p><p>补充：查看工作区和版本库最新版本的区别</p><p>$ git diff HEAD – 文件名</p><h2 id="●回退版本"><a href="#●回退版本" class="headerlink" title="●回退版本"></a>●回退版本</h2><p>$ git reset –hard HEAD^</p><p>//回退上一个版本</p><p>$ git reset –hard HEAD^^</p><p>//回退上上个版本</p><p>$ git reset –hard HEAD~100</p><p>//回退上100个版本</p><p>$ git reset –hard commit_id</p><p>//在历史版本里任意穿梭</p><h2 id="●查看历史"><a href="#●查看历史" class="headerlink" title="●查看历史"></a>●查看历史</h2><p>$ git log//查看提交历史</p><p>$ git log –pretty=oneline</p><p>//查看简单的提交历史</p><p>$ git reflog//查看命令历史</p><h2 id="●丢弃工作区的修改"><a href="#●丢弃工作区的修改" class="headerlink" title="●丢弃工作区的修改"></a>●丢弃工作区的修改</h2><p>$ git checkout – 文件名</p><p>//在没有添加到暂存区内</p><p>$ git reset HEAD 文件名</p><p>$ git checkout – 文件名</p><p>//添加到暂存区内</p><h2 id="●删除文件"><a href="#●删除文件" class="headerlink" title="●删除文件"></a>●删除文件</h2><p>$ rm 文件名</p><p>$ git rm 文件名</p><p>//确实要删除这个文件</p><p>$ git checkout – 文件名</p><p>//误删</p><p>补充：强制删除未被合并的分支</p><p>$ git branch -D 分支名</p><h2 id="●生成ssh秘钥"><a href="#●生成ssh秘钥" class="headerlink" title="●生成ssh秘钥"></a>●生成ssh秘钥</h2><p>$ ssh-keygen -t rsa -C”<a href="mailto:youremail@example.com" target="_blank" rel="noopener">youremail@example.com</a>“</p><h2 id="●关联远程库"><a href="#●关联远程库" class="headerlink" title="●关联远程库"></a>●关联远程库</h2><p>$ git remote add origin <a href="mailto:git@githup.com" target="_blank" rel="noopener">git@githup.com</a>:&lt;账户名&gt;/&lt;仓库名&gt;.git</p><h2 id="●推送本地内容到远程库"><a href="#●推送本地内容到远程库" class="headerlink" title="●推送本地内容到远程库"></a>●推送本地内容到远程库</h2><p>$ git push -u origin master</p><p>//第一次推送需要加 -u参数</p><p>$ git push origin master</p><p>//以后操作不用 -u参数</p><h2 id="●克隆仓库"><a href="#●克隆仓库" class="headerlink" title="●克隆仓库"></a>●克隆仓库</h2><p>$ git clone <a href="mailto:git@githup.com" target="_blank" rel="noopener">git@githup.com</a>:&lt;账户名&gt;/&lt;仓库名&gt;.git</p><h2 id="●关于分支的命令"><a href="#●关于分支的命令" class="headerlink" title="●关于分支的命令"></a>●关于分支的命令</h2><p>$ git branch 分支名</p><p>//创建一个新的分支</p><p>$ git checkout 分支名</p><p>//切换分支</p><p>$ git checkout -b 分支名</p><p>//创建并切换分支</p><p>$ git branch</p><p>//查看当前分支</p><p>$ git merge 分支名</p><p>//合并此分支到当前分支(Fast forward模式)</p><p>$ git merge –no-ff -m”说明文字” 分支名（禁用Fast forward模式）</p><p>$ git branch -d 分支名</p><h2 id="●查看分支合并情况"><a href="#●查看分支合并情况" class="headerlink" title="●查看分支合并情况"></a>●查看分支合并情况</h2><p>$ git log –graph=oneline –abbrev-commit</p><h2 id="●储存工作现场"><a href="#●储存工作现场" class="headerlink" title="●储存工作现场"></a>●储存工作现场</h2><p>$ git stash<br>//储存工作现场</p><p>$ git stash</p><p>//储存工作现场的列表</p><p>$ git stash apply</p><p>//恢复工作现场，stash内容不删除</p><p>$ git stash drop</p><p>//删除stash的内容</p><p>$ git stash pop</p><p>//恢复工作现场的同时删除stash内容</p><p>$ git stash apply stash@{0}</p><p>//恢复指定stash</p><h2 id="●查看远程库信息"><a href="#●查看远程库信息" class="headerlink" title="●查看远程库信息"></a>●查看远程库信息</h2><p>$ git remote</p><p>$ git remote -v</p><p>//查看更详细的信息</p><h2 id="●推送指定分支"><a href="#●推送指定分支" class="headerlink" title="●推送指定分支"></a>●推送指定分支</h2><p>$ git push origin 分支名</p><h2 id="●从远程库抓取最新的提交"><a href="#●从远程库抓取最新的提交" class="headerlink" title="●从远程库抓取最新的提交"></a>●从远程库抓取最新的提交</h2><p>$ git pull</p><h2 id="●在本地创建远程分支对应分支"><a href="#●在本地创建远程分支对应分支" class="headerlink" title="●在本地创建远程分支对应分支"></a>●在本地创建远程分支对应分支</h2><p>$ git checkout -b 分支名 origin/分支名</p><h2 id="●建立本地分支和远程分支的关联"><a href="#●建立本地分支和远程分支的关联" class="headerlink" title="●建立本地分支和远程分支的关联"></a>●建立本地分支和远程分支的关联</h2><p>$ git checkout -set-upstream 分支名 origin/分支名</p><h2 id="●关于标签的命令"><a href="#●关于标签的命令" class="headerlink" title="●关于标签的命令"></a>●关于标签的命令</h2><p>$ git tag 标签名</p><p>//打一个新的标签</p><p>$ git tag</p><p>//查看所有标签</p><p>$ git tag 标签名 commit_id</p><p>//给任意提交过的版本打标签</p><p>$ git show 标签名</p><p>//查看标签信息</p><p>$ git tag -a 标签名 -m”说明文字” commit_id</p><p>//创建带有说明的标签 -a指定标签名 -m指定说明文字</p><p>$ git push origin 标签名</p><p>//推送指定标签</p><p>$ git push origin –tags</p><p>//一次性推送所有标签到远程库</p><p>$ git tag -d 标签名</p><p>//删除指定标签</p><p>$ git push origin:refs/tags/标签名</p><p>//删除远程库的标签</p><p>git push origin –delete HEAD</p><p>//删除分支 HEAD</p><p>$ sudo rm test</p><p>$ git add -u</p><p>$ git commit -m “delete test”</p><p>$ git push</p><p>//删除服务器文件</p>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;经过搜集、整理，现得到以下Git相关知识，相互学习，相互促进。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上传日期：2018.5.22  &lt;/li&gt;
&lt;li&gt;整理员：Hunter
    
    </summary>
    
      <category term="其他" scheme="https://gbrweb.github.io/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="git" scheme="https://gbrweb.github.io/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>字符串左右旋转问题</title>
    <link href="https://gbrweb.github.io/2018/05/20/20180520/"/>
    <id>https://gbrweb.github.io/2018/05/20/20180520/</id>
    <published>2018-05-20T05:27:47.000Z</published>
    <updated>2018-06-02T09:55:40.080Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="题目"><a href="#题目" class="headerlink" title="题目"></a>题目</h1><blockquote><p>实现一个函数，可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA<br><a id="more"></a>  </p></blockquote><h2 id="方法一：【暴力移位法】"><a href="#方法一：【暴力移位法】" class="headerlink" title="方法一：【暴力移位法】"></a>方法一：【暴力移位法】</h2><p>算法思想：用移的步数作为while循环条件(每移1位完了减1)，1位1位的移动，即只需要一个空的变量来存移出去的字符，而这时变量i已经到了数组最后的空位置，此时把先前移出去的字符再补回来即可<br><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="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1  </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;  </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;assert.h&gt;  </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string.h&gt;  </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">left_move</span><span class="params">(<span class="keyword">char</span> *str, <span class="keyword">int</span> k)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    assert(str);  </span><br><span class="line">    <span class="keyword">char</span> temp = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">int</span> len = <span class="built_in">strlen</span>(str);  </span><br><span class="line">    k = k%len;  </span><br><span class="line">    <span class="keyword">while</span> (k--)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">char</span> *cur = str;  </span><br><span class="line">        temp = *cur;  </span><br><span class="line">        <span class="keyword">while</span> (*(cur + <span class="number">1</span>) != <span class="string">'\0'</span>)  </span><br><span class="line">        &#123;  </span><br><span class="line">            *cur = *(cur + <span class="number">1</span>);  </span><br><span class="line">            cur++;  </span><br><span class="line">        &#125;  </span><br><span class="line">        *cur = temp;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;  </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">char</span> arr[] = <span class="string">"abcdef"</span>;  </span><br><span class="line">    <span class="keyword">int</span> k = <span class="number">0</span>;  </span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;k);  </span><br><span class="line">    left_move(arr, k);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"%s"</span>, arr);  </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h2 id="方法二：【三步翻转法】"><a href="#方法二：【三步翻转法】" class="headerlink" title="方法二：【三步翻转法】"></a>方法二：【三步翻转法】</h2><p>算法思想：以移动的步数为界限，左边字符串整体逆置，右边字符串整体逆置，再整个字符串整体逆置，即需要调用3次整体逆置字符串函数，要注意各个逆置区间的定义</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1  </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;    </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;string.h&gt;  </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;assert.h&gt;    </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reverse</span><span class="params">(<span class="keyword">char</span> *left, <span class="keyword">char</span>*right)</span><span class="comment">//逆序    </span></span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    assert(left&amp;&amp;right);  </span><br><span class="line">    <span class="keyword">while</span> (left &lt; right)  </span><br><span class="line">    &#123;  </span><br><span class="line">        <span class="keyword">char</span> tmp;  </span><br><span class="line">        tmp = *left;  </span><br><span class="line">        *left = *right;  </span><br><span class="line">        *right = tmp;  </span><br><span class="line">        left++,  </span><br><span class="line">        right--;  </span><br><span class="line">    &#125;  </span><br><span class="line">&#125;  </span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reverse_left</span><span class="params">(<span class="keyword">char</span> *str, <span class="keyword">int</span> k)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> len = <span class="number">0</span>;  </span><br><span class="line">    assert(str);  </span><br><span class="line">    len = <span class="built_in">strlen</span>(str);  </span><br><span class="line">    k = k%len;  </span><br><span class="line">    reverse(str, (str + k - <span class="number">1</span>));<span class="comment">//要旋转的k个字符逆序    </span></span><br><span class="line">    reverse((str + k), (str + len - <span class="number">1</span>));<span class="comment">//之后的字符逆序    </span></span><br><span class="line">    reverse(str, (str + len - <span class="number">1</span>));<span class="comment">//所有的字符逆序    </span></span><br><span class="line">&#125;  </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> k = <span class="number">0</span>;  </span><br><span class="line">    <span class="keyword">char</span> str[] = <span class="string">"abcdefgh"</span>;  </span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;k);  </span><br><span class="line">    reverse_left(str, k);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"%s"</span>, str);  </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="方法三：【穷举法】"><a href="#方法三：【穷举法】" class="headerlink" title="方法三：【穷举法】"></a>方法三：【穷举法】</h2><p>算法思想：(相当于穷举法)申请一个是原来2倍+1(算上\0)的数组空间，将原来的字符串复制一遍存在这个空间里，然后从原来的首元素加上移动的步数开始输出len个长度的字符串，完成左旋效果(先后用到strcpy strcat strncpy函数)</p><h3 id="注意："><a href="#注意：" class="headerlink" title="注意："></a>注意：</h3><p>(1)变量定义一定要放在表达式前面，否则乱报错；<br>(2)用malloc函数申请完空间记得释放，头文件&lt;stdlib.h&gt;<br><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="meta-keyword">define</span> _CRT_SECURE_NO_WARNINGS 1  </span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;    </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string.h&gt;    </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;   </span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;assert.h&gt;  </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reverse_string</span><span class="params">(<span class="keyword">char</span> *str, <span class="keyword">int</span> k)</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">int</span> len = <span class="built_in">strlen</span>(str);  </span><br><span class="line">    <span class="keyword">char</span> *tmp = (<span class="keyword">char</span>*)<span class="built_in">malloc</span>(<span class="number">2</span> * len + <span class="number">1</span>); <span class="comment">//申请2倍的原数组空间   </span></span><br><span class="line">    assert(str);  </span><br><span class="line">    <span class="built_in">strcpy</span>(tmp, str);  <span class="comment">//把原来的字符串拷贝到这个大空间里    </span></span><br><span class="line">    <span class="built_in">strcat</span>(tmp, str);  <span class="comment">//把原来的字符串再拼接到后面(复制2遍)    </span></span><br><span class="line">    <span class="built_in">strncpy</span>(str, tmp + k, len);  <span class="comment">//从要移动的位数后一位起，获取原来长度的字符串，达到左旋效果    </span></span><br><span class="line">    <span class="built_in">free</span>(tmp);  </span><br><span class="line"></span><br><span class="line">&#125;  </span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span>  </span></span><br><span class="line"><span class="function"></span>&#123;  </span><br><span class="line">    <span class="keyword">char</span> arr[] = <span class="string">"abcdef"</span>;  </span><br><span class="line">    <span class="keyword">int</span> k = <span class="number">0</span>;  </span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;k);  </span><br><span class="line">    reverse_string(arr, k);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"%s"</span>, arr);  </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p>考查字符串和字符数组的相关操作，注意在没有明确指定是否允许使用库函数的时候，就默认允许使用库函数，在不允许的情况下需要自定义实现这些函数（本题中只需要自定义实现strlen()、strstr()、strcat()这些函数），这样就很OK了！</p>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;题目&quot;&gt;&lt;a href=&quot;#题目&quot; class=&quot;headerlink&quot; title=&quot;题目&quot;&gt;&lt;/a&gt;题目&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;实现一个函数，可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA&lt;br&gt;
    
    </summary>
    
      <category term="C语言知识及题集" scheme="https://gbrweb.github.io/categories/C%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86%E5%8F%8A%E9%A2%98%E9%9B%86/"/>
    
    
      <category term="字符串旋转" scheme="https://gbrweb.github.io/tags/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%97%8B%E8%BD%AC/"/>
    
  </entry>
  
  <entry>
    <title>浅析（命令行参数 ）&amp;&amp;（main函数参数）</title>
    <link href="https://gbrweb.github.io/2018/05/20/201852222-2/"/>
    <id>https://gbrweb.github.io/2018/05/20/201852222-2/</id>
    <published>2018-05-20T05:27:47.000Z</published>
    <updated>2018-06-01T16:28:51.244Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><h2 id="命令行参数"><a href="#命令行参数" class="headerlink" title="命令行参数:"></a>命令行参数:</h2><blockquote><p>● 命令行参数是控制命令执行的一种方式。  </p><p>● 命令行参数类似于函数的参数，只是命令行参数是传送给命令的。命令执行时，内核已经将命令行参数放入命令的栈中，命令执行时则可以获取命令行参数，解析，执行。</p><p>● 命令行参数使命令可以执行不同任务。<br><a id="more"></a></p></blockquote><h2 id="linux系统下的实现"><a href="#linux系统下的实现" class="headerlink" title="linux系统下的实现:"></a>linux系统下的实现:</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;    </span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> *argv[])</span>    </span></span><br><span class="line"><span class="function"></span></span><br><span class="line"><span class="function"></span>&#123;    </span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">"%d\n"</span>,argc);    </span><br><span class="line"></span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">"%s\n"</span>,argv[<span class="number">0</span>]);    </span><br><span class="line"></span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">"%s\n"</span>,argv[<span class="number">1</span>]);    </span><br><span class="line"></span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">"%s\n"</span>,argv[<span class="number">2</span>]);    </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在这个例子中，我们给main函数传递两个参数：argc，argv：</p><blockquote><p>● argc是int类型的，它表示的是命令行参数的个数。不许要用户传递，它会根据用户从命令行输入的参数个数，自动确定。</p><p>● argv是char* argv[]类型的，即是指针数组类型，它的作用是存储用户从命令行传递进来的参数。它的第一个成员是程序执行的.exe文件。</p><p>● main函数还有一个参数是envp，是一个 指针数组类型，每个元素存储指向一个环境变量的字符指针。这里不予赘述。</p></blockquote><p>对于上面的例子，我们将其保存为test.c，用gcc编译生成目标文件为a.out</p><p><strong>编译结果如下</strong>：</p><p><img src="/img/2018522.png" alt="图片加载中"><br><strong>执行结果如下</strong>：</p><p><img src="/img/20185221.png" alt="图片加载中"></p><p>这里第一个输出的是argc，因为我们只输入了./a.out，所以argc为1，即只有一个命令行参数。后面输出的第一个命令行参数也是./a.out。接着程序就出错了，因为程序要说输出第二、第三参数，而后面已经没有第二个和第三个参数了，在写实际的应用时，应注意对这一部分进行容错处理。所谓容错处理就是指软件运行时，能对由非正常因素引起的运行错误给出适当的处理或信息提示，使软件运行正常结束。而这个错误也就是程序员很容易犯得<a href="https://blog.csdn.net/sunshine_okey/article/details/7367332" target="_blank" rel="noopener">段错误</a>。</p><blockquote><p>当在命令行输入./a.out、linux、nihao三个参数时，执行结果如图：</p></blockquote><p><img src="/img/20185222.png" alt="图片加载中"><br>命令行参数个数为3，第一个参数./a.out、第二个参数linux、第三个参数nihao。</p><blockquote><p>当输入./a.out、”linux nihao”、hehe、”hi apple”四个参数时，执行结果如图：</p></blockquote><p><img src="/img/20185223.png" alt="图片加载中"><br>当输入四个参数，命令行参数个数就为4，但需要注意的是就是如果一个参数之间有空格，需要用双引号引起来，以免产生不必要的错误。</p><p><strong>当然对于具体情况请看下图</strong>：</p><p><img src="/img/20185224.png" alt="图片加载中">  </p><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><blockquote><p>对于main函数第二个参数argv，其数据类型可以写成三种形式：<br>char *argv[]、char **argv、char argv[][]，当然第三个函数参数envp同理。</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;h2 id=&quot;命令行参数&quot;&gt;&lt;a href=&quot;#命令行参数&quot; class=&quot;headerlink&quot; title=&quot;命令行参数:&quot;&gt;&lt;/a&gt;命令行参数:&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;● 命令行参数是控制命令执行的一种方式。  &lt;/p&gt;
&lt;p&gt;● 命令行参数类似于函数的参数，只是命令行参数是传送给命令的。命令执行时，内核已经将命令行参数放入命令的栈中，命令执行时则可以获取命令行参数，解析，执行。&lt;/p&gt;
&lt;p&gt;● 命令行参数使命令可以执行不同任务。&lt;br&gt;
    
    </summary>
    
      <category term="C语言知识及题集" scheme="https://gbrweb.github.io/categories/C%E8%AF%AD%E8%A8%80%E7%9F%A5%E8%AF%86%E5%8F%8A%E9%A2%98%E9%9B%86/"/>
    
    
      <category term="命令行参数 main函数" scheme="https://gbrweb.github.io/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0-main%E5%87%BD%E6%95%B0/"/>
    
  </entry>
  
  <entry>
    <title>My First Blog</title>
    <link href="https://gbrweb.github.io/2018/05/20/My-First-Blog/"/>
    <id>https://gbrweb.github.io/2018/05/20/My-First-Blog/</id>
    <published>2018-05-20T05:27:47.000Z</published>
    <updated>2018-06-01T16:28:51.252Z</updated>
    
    <content type="html"><![CDATA[<hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><blockquote><p>人生，走着走着便懂了，对于未来，不再迷茫彷徨，而是以更坚定的步伐迈向预定的目标；人生，走着走着便懂了，对于爱情，不再痴迷悲伤，而是以更理智的心态去接受爱情细水长流的平淡；人生，走着走着便懂了，对于生活，不再困惑感伤，而是以积极乐观的心态去迎接每一个黎明的到来。<br><a id="more"></a></p></blockquote><p><img src="/img/587000.jpg" alt="图片加载中"></p><blockquote><p>白驹过隙，转眼间，我已是大二学生，虽然已经在大学生活了一年，却依然对未来很迷茫，这种迷茫也带来了一系列的恐惧：能否找到称心如意的工作、能否有能力赡养自己的父母，买不起房怎么办、程序员真的是青春饭吗……<br>我是通信学院物联网工程专业的一名普通的不能再普通的学生。说实话，上大学以来，我并没有为了某些事情真正地努力过，即使是一些很简单的事情 。</p></blockquote><blockquote><p>曾听人说大学有四个阶段：不知道自己不知道-&gt;知道自己不知道-&gt;不知道自己知道-&gt;知道自己知道。就目前情况来看我应该处于第二阶段，我认识到自己缺乏太多的专业知识以及社交原则，我也会经常阅读搞IT的成功人士的案例来寻求安慰与激励，但这只是短暂的麻痹罢了。</p></blockquote><blockquote><p>曾经很“牛逼”地对好朋友说过：“我不想过一辈子穷苦生活！”现在想起当时的自己真的是既无知又可笑，我特么拿什么去过理想中的生活呢？殊不知：开水不响，响水不开。被打的人才会大吼几声来搏回一点颜面，而真正有实力的人都是深藏不露的。</p></blockquote><blockquote><p>小时候家里还种地的时候，我也像其他孩子一样要去田里除草。烈日炎炎下，站在田地里往前一看，我的妈，还有这么多的草要拔呀！还没干活便没了一半的力气。而如果一步一步的做好眼前的这一块，便在不知不觉中就到了地头。我现在何尝又不是当年那个拔草的少年呢，我还有海量的东西要学，我为何不能脚踏实地的学好现在的东西呢？</p></blockquote><blockquote><p>现于公元二零一八年，特写此篇 ，抒己所感。我并不是为自己起初愚笨忏悔，而是把压在心里的东西排出来轻松一下，并且要警示自己从现在起，静下心来，虚心学习，因为仅剩的大学时光不多了。说实话，像我这样无实力的人连现在的生活都掌控不好，有何权利去畅想未来？关键是要把自己变强大，才能在困难面前有获胜的筹码。曾听过一句自认为非常好的话，毅然当作了自己的座右铭：人生在勤，不索何获！</p></blockquote><p><strong>作此篇亦献给正处于迷茫中的你，希望能够共勉，一起进步!</strong></p>]]></content>
    
    <summary type="html">
    
      &lt;hr&gt;
&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;人生，走着走着便懂了，对于未来，不再迷茫彷徨，而是以更坚定的步伐迈向预定的目标；人生，走着走着便懂了，对于爱情，不再痴迷悲伤，而是以更理智的心态去接受爱情细水长流的平淡；人生，走着走着便懂了，对于生活，不再困惑感伤，而是以积极乐观的心态去迎接每一个黎明的到来。&lt;br&gt;
    
    </summary>
    
      <category term="程序人生" scheme="https://gbrweb.github.io/categories/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/"/>
    
    
      <category term="人生在勤，不索何获" scheme="https://gbrweb.github.io/tags/%E4%BA%BA%E7%94%9F%E5%9C%A8%E5%8B%A4%EF%BC%8C%E4%B8%8D%E7%B4%A2%E4%BD%95%E8%8E%B7/"/>
    
  </entry>
  
</feed>
