Skip to content

Commit 585aaf0

Browse files
committed
Updated to Chapter 6, Section 5
1 parent 949ee1d commit 585aaf0

File tree

15 files changed

+467
-249
lines changed

15 files changed

+467
-249
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
55
### 此项目已经开始!
66

7-
当前进度:泛讲篇第五章完成。参见[Preview](https://github.com/cppHusky/cppHusky-cpp-Tutorial/releases/tag/preview)
7+
当前进度:泛讲篇第六章完成。参见[Preview](https://github.com/cppHusky/cppHusky-cpp-Tutorial/releases/tag/preview)
88

99
我为此规划了一个大致的编章结构,参见[Structure.md](https://github.com/cppHusky/cppHusky-cpp-Tutorial/blob/main/Structure.md)
1010

generalized_parts/05_composite_types_and_their_use/01_pointer.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
\section{指针}
22
{\large``我认为赋值语句和指针变量可以说是计算机科学最具价值的宝藏。''\footnote{原文:I do consider assignment statements and pointer variables to be among computer science's ``most valuable treasures.''}}
3-
\begin{flushright}——高德纳\footnote{高德纳(Donald Ervin Knuth),美国计算机科学家和数学家,1974年图灵奖得主。高德纳成就颇丰,其中最负盛名的是它的著作《计算机程序设计艺术》(\textit{The Art of Computer Programming})。}\end{flushright}
3+
\begin{flushright}——高德纳\footnote{高德纳(Donald Ervin Knuth),美国计算机科学家和数学家,1974年图灵奖得主。高德纳成就颇丰,其中最负盛名的是它的著作《计算机程序设计艺术》(\textit{The Art of Computer Programming})。}\end{flushright}\par
44
\subsection*{内存与地址}
55
在一个C/C++程序运行时,内存中会存储着有关这个程序的信息。我们可以把这些内存空间分为五个区段(如图5.1所示):
66
\begin{itemize}

generalized_parts/05_composite_types_and_their_use/05_string_with_arrays.tex

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ \subsection*{字符串是如何构成的?}
6161
在C/C++中,所有的字符串都应当以 \lstinline@'\0'@,也就是ASCII码值为 \lstinline@0@ 的字符结尾。这是我们判断一个字符串有效信息长度的最佳标准。为什么这么说呢?\par
6262
当我们定义字符串时,因为我们也不确定它的有效信息有多长,所以我们可能要给它比较大的容量。
6363
\begin{lstlisting}
64-
char name[32]; //难免会有名字很长的人,所以容量要大一点
64+
char name[33]; //难免会有名字很长的人,所以容量要大一点
6565
\end{lstlisting}
6666
但是这里就会存在一个问题:绝大部分情况下,这个字符串真实存储的信息长度肯定很少,比如说``Amy Smith'',这个名字只有9个字符,那么我们就还需要一个类似于 \lstinline@size@ 的变量,来说明 \lstinline@name@ 的有效信息长度。问题在于,这个方法比较浪费空间,我们还需要另外定义变量来存储它的长度;而且也很不方便使用,我们每次传参都要额外加一个变量。\par
6767
C/C++有更好的解决方法,那就是用 \lstinline@name@ 数组内的信息来表示有效长度!具体的方法是,我们在有效信息的末尾,把下一个字符设置成 \lstinline@'\0'@。这样,无论哪个函数拿到了这个字符串,它只需要从 \lstinline@name[0]@ 开始数一数,看数到哪里 \lstinline@name[i]=='\0'@,那么自然就知道了这个字符串的长度,而不需要用另外的参数来记录了。\par
68-
举个例子,现在我记录一个名字 \lstinline@"Alexander Alexandrovich Stepanov"@。这个名字碰巧有31个字符(含空格),加上末尾的结束符共有32个。现在我们把它存入 \lstinline@name@ 中。
68+
举个例子,现在我记录一个名字 \lstinline@"Alexander Alexandrovich Stepanov"@。这个名字碰巧有32个字符(含空格),加上末尾的结束符共有33个。现在我们把它存入 \lstinline@name@ 中。
6969
\begin{lstlisting}
70-
char name[32] {"Alexander Alexandrovich Stepanov"};
70+
char name[33] {"Alexander Alexandrovich Stepanov"};
7171
\end{lstlisting}
72-
这时它的32个字节全部都是有效信息,如图5.13第一行所示。\par
72+
这时它的33个字节全部都是有效信息,如图5.13第一行所示。\par
7373
\begin{figure}[htbp]
7474
\centering
7575
\includegraphics[width=\textwidth]{../images/generalized_parts/05_Information_in_the_string_300.png}
@@ -134,12 +134,12 @@ \subsection*{字符串的输入}
134134
现在我们再来讲讲字符串是如何输入的。\par
135135
最简单的输入方式莫过于用 \lstinline@cin<<@ 来进行输入。
136136
\begin{lstlisting}
137-
char str[32];
137+
char str[33];
138138
cin >> str; //直接用cin向字符串中输入
139139
\end{lstlisting}
140140
但是这样就可能会遇到问题。如果我们要向字符串中输入两个英文名,比如 \lstinline@Bjarne Stroustrup@ 和 \lstinline@Alan Mathison Turing@,我们可能就会遭遇这样的困难:
141141
\begin{lstlisting}
142-
char name1[32], name2[32]; //定义两个字符串用于输入人名
142+
char name1[33], name2[33]; //定义两个字符串用于输入人名
143143
cin >> name1 >> name2; //连续输入两个人名
144144
cout << name1 << endl << name2; //输出第一个人名,再换行,再输出第二个人名
145145
\end{lstlisting}
@@ -160,7 +160,7 @@ \subsubsection*{\lstinline@getline@ 成员函数}
160160
其中的 \lstinline@s@ 是待输入的字符串,而 \lstinline@count@ 表明这个字符串的容量(不同于 \lstinline@strcpy@,这里必须提供容量参数)。对于第一个重载来说,它的含义就是:读取一整行输入,直到遇到回车符\footnote{回车符会被提取,但不会存入 \lstinline@s@ 字符串中。},才停止输入;或者是 \lstinline@count@ 长度的字符串容纳不了用户输入的内容量,这时输入也会停止,同时 \lstinline@cin@ 会进入``fail''状态(我们需要用 \lstinline@input_clear@ 来恢复 \lstinline@cin@,并清理输入流)。\par
161161
接下来我们可以用 \lstinline@getline@ 来输入一些有空格的名字了。程序不会在空格字符处断句,只会在回车字符处断句。\par
162162
\begin{lstlisting}
163-
constexpr unsigned NameLen{ 32 }; //把名称字符串容量设为32,便于统一
163+
constexpr unsigned NameLen {33}; //把名称字符串容量设为33,便于统一
164164
char name1[NameLen], name2[NameLen]; //定义两个字符串用于输入人名
165165
cin.getline(name1, NameLen).getline(name2, NameLen); //getline可以连续使用
166166
cout << name1 << endl << name2; //输出第一个人名,再换行,再输出第二个人名

generalized_parts/06_custom_types_and_their_use/02_struct.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ \subsection*{结构体成员的类型}
122122
\begin{lstlisting}
123123
enum Sex : bool{male, female}; //枚举基为bool
124124
struct PersonalInfo { //一个结构体,表示个人信息
125-
char name[32]; //字符串,表示名字
125+
char name[33]; //字符串,表示名字
126126
const Sex sex; //性别一般是不会改变的,所以设置成const
127127
double height;
128128
double weight;

0 commit comments

Comments
 (0)