<!-- markdown css tag --><div class="pinggu_markdown">
<div class="pinggu_markdown__html"><p>需要<em>pointer</em>和<em>array</em>的前置知识,因为你会发现字符串和数组关系是很紧密的。<br>
首先,字符串是什么?本质上来说字符串就是一组<em>characters</em>字符,字符是指字母,数字和符号这些东西,本质上就是文本,对我们来说当然会需要用某种方式把文本的形状和格式在电脑上表示出来。what you should do , i don’t know how it works,</p>
<p>how characters work .</p>
<p>it is not about encoding</p>
<p>单一字符、整个段落、一个单词、一堆单词…所有这些被称为字符串,<em>string of text</em>(文本字符串)</p>
<p>C++中有一种数字类型叫<em>char</em>,它是<em>character</em>的缩写,占用 1 个字节内存。它很有用,因为能把指针转换为 char 类型指针,让你根据字节进行指针运算。它对分配内存缓冲区也很有用,如果你想分配 1k 的内存,你分配 1024 个 char 就行了。<br>
它对字符串和文本也很有用,因为 C++默认处理的字符方式就是<em>ASCII</em>(aski)字符.<br>
字符也可以是大于一个字节的(比如中文、日文),可以有 2-4 个字节的字符。</p>
<p>如果我们只用 1 字节来表示字符,1 字节=8bit,这意味着我们有<span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mn>8</mn></msup><mo>=</mo><mn>256</mn></mrow><annotation encoding="application/x-tex">2^8=256</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.814108em; vertical-align: 0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">8</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">2</span><span class="mord">5</span><span class="mord">6</span></span></span></span></span> 种可能,显然数量不够,没法适配所有语言。<br>
所以我们有了<em>utf-16</em>,也就是 16 位的字符编码,这意味着我们有<span class="katex--inline"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mn>16</mn></msup><mo>=</mo><mn>65536</mn></mrow><annotation encoding="application/x-tex">2^{16}=65536</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height: 0.814108em; vertical-align: 0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">6</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">6</span><span class="mord">5</span><span class="mord">5</span><span class="mord">3</span><span class="mord">6</span></span></span></span></span> 种可能.</p>
<p>但是在 C++基础语言中不适用任何库只是原始数据类型的话,<em>char</em>就是 1 字节。fonts is huge complicated problem.</p>
<h2 id="const-char">1. const* char</h2>
<p>经验法则:如果你不用<em>new</em>关键字,那就不要用<em>delete</em></p>
<pre class=" language-cpp"><code class="prism language-cpp"> <span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> name <span class="token operator">=</span> <span class="token string">"Cherno"</span><span class="token punctuation">;</span> <span class="token comment">// C语言风格定义字符串的方式</span>
name<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'a'</span><span class="token punctuation">;</span> <span class="token comment">// 无法实现,如果你知道不会去修改字符串就加上const,否则就去掉</span>
</code></pre>
<p>C++11 开始,将字符串常量直接赋值给非<code>const</code>的<code>char*</code>指针被视为不安全的行为。<br>
故用</p>
<pre class=" language-cpp"><code class="prism language-cpp"><span class="token keyword">char</span> name<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Cherno"</span><span class="token punctuation">;</span>
</code></pre>
<p><img src="./storage%20bag/Pasted%20image%2020230705122342.png" alt=""></p>
<p>图中给的<code>00</code>字符被称为<em>the null termination character</em>(空终止符),这样我们就知道字符串在哪里结束,也便于知道字符串大小 ^26e746</p>
<pre class=" language-cpp"><code class="prism language-cpp"><span class="token keyword">char</span> name2<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'C'</span><span class="token punctuation">,</span><span class="token string">'h'</span><span class="token punctuation">,</span><span class="token string">'e'</span><span class="token punctuation">,</span><span class="token string">'r'</span><span class="token punctuation">,</span><span class="token string">'n'</span><span class="token punctuation">,</span><span class="token string">'o'</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
std<span class="token operator">::</span>cout <span class="token operator"><<</span> name2 <span class="token operator"><<</span> std<span class="token operator">::</span>endl<span class="token punctuation">;</span> <span class="token comment">// Cherno烫烫烫烫烫......</span>
</code></pre>
<p><img src="./storage%20bag/Pasted%20image%2020230705123511.png" alt=""></p>
<p>分配了***array guard***,但是没有空终止符,所以 cout 不知道打印到哪里结束</p>
<pre class=" language-cpp"><code class="prism language-cpp"><span class="token keyword">char</span> name2<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'C'</span><span class="token punctuation">,</span><span class="token string">'h'</span><span class="token punctuation">,</span><span class="token string">'e'</span><span class="token punctuation">,</span><span class="token string">'r'</span><span class="token punctuation">,</span><span class="token string">'n'</span><span class="token punctuation">,</span><span class="token string">'o'</span><span class="token punctuation">,</span><span class="token string">'\0'</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">// 直接写成0也行</span>
</code></pre>
<p><img src="./storage%20bag/Pasted%20image%2020230705123808.png" alt=""><br>
正常输出</p>
<h2 id="stdstring">2. std::string</h2>
<p>std::string 有个接受参数为 char 指针或者 const char 指针的构造函数<br>
<img src="./storage%20bag/Pasted%20image%2020230705124249.png" alt=""><br>
还有很多内置方法</p>
<pre class=" language-cpp"><code class="prism language-cpp">std<span class="token operator">::</span>string name <span class="token operator">=</span> <span class="token string">"Cherno"</span><span class="token punctuation">;</span>
std<span class="token operator">::</span>cout <span class="token operator"><<</span> name <span class="token operator"><<</span> std<span class="token operator">::</span>endl<span class="token punctuation">;</span> <span class="token comment">// Cherno</span>
std<span class="token operator">::</span>cout <span class="token operator"><<</span> name<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><<</span> std<span class="token operator">::</span>endl<span class="token punctuation">;</span> <span class="token comment">// 6</span>
</code></pre>
<h3 id="字符串拼接">字符串拼接</h3>
<pre class=" language-cpp"><code class="prism language-cpp">std<span class="token operator">::</span>string name <span class="token operator">=</span> <span class="token string">"Cherno"</span> <span class="token operator">+</span> <span class="token string">"hello"</span><span class="token punctuation">;</span> <span class="token comment">//'+': cannot add two pointers</span>
</code></pre>
<p>上面提到了它们是 const char 数组,不是真正的 string</p>
<pre class=" language-cpp"><code class="prism language-cpp">std<span class="token operator">::</span>string name <span class="token operator">=</span> <span class="token string">"Cherno"</span><span class="token punctuation">;</span>
name <span class="token operator">+</span><span class="token operator">=</span> <span class="token string">"hello"</span><span class="token punctuation">;</span> <span class="token comment">// Chernohello</span>
</code></pre>
<p>或者</p>
<pre class=" language-cpp"><code class="prism language-cpp">std<span class="token operator">::</span>string name <span class="token operator">=</span> std<span class="token operator">::</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token string">"Cherno"</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"hello!"</span><span class="token punctuation">;</span>
</code></pre>
<h2 id="字符串传给其他函数">3. 字符串传给其他函数</h2>
<pre class=" language-cpp"><code class="prism language-cpp"><span class="token keyword">void</span> <span class="token function">PrintString</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token operator">::</span>string<span class="token operator">&</span> string<span class="token punctuation">)</span> <span class="token comment">//引用,而不会拷贝,并保证不修改</span>
</code></pre>
</div>
</div>