>> [音乐播放]
戴维·J·马兰：好吧。
这是CS50，这 是第2周的端部。
所以，今天，我们要 继续我们的样子
我们是如何表现的东西 下面的hood--搬走
从喜欢整数的数字 和浮点值
并专注于字符串和 最终更有趣的节目。
但是，我们也将看看在 夫妇域专用problems--的
其中第一个将在 是涉及到密码学中，
艺术加扰的信息， 你上面的看这里
是无线电孤儿安妮的图片 秘密的解码器环从昔日。
>> 其实，这是很原始的形式 和cryptopgraphy儿童友好的形式
由此该环有两个disks-- 1内1外。
并通过旋转其中的一个，就可以 本质上线像一个字母
到Z与其他字母 像通过A.乙换句话说，
你可以从字面上旋转的字母， 从而想出的一个映射
信件，信件，这样，如果你 想送一个秘密消息
到有人喜欢安妮，你可以写 您的消息，然后旋转
字母，即，如果您的意思是 说“A”，而不是你说的“B”
你的意思是说“B” 你不是说“C” -
或一些更聪明 比that--然后，最终
只要安妮有此解码器 环，她可以解码该消息。
现在，你可能还记得，其实，这 在一个非常有名的电影，是使用
在播放广告nauseum 圣诞季节。
让我们来看看这里。
拉尔夫PARKER：“无论是 众所周知，在汇总
拉尔夫·帕克兹委任 小孤儿安妮秘密的一员
圆，有权全部 其发生的荣誉和利益。“
>> 拉尔夫·帕克（话外音）： 签名小孤儿安妮。
会签，皮埃尔·安德烈！
在油墨。
荣誉和利益， 已经在九岁的时候。
>> [音乐播放]
>> [无线电聊天]
拉尔夫PARKER：来吧。
让我们开始吧。
我不需要所有的爵士乐 关于走私者和海盗。
播音员：听明天 晚上的最后冒险
的黑色海盗船。
现在，是时候让安妮 秘密信息给你的成员
的秘密圈。
记住孩子，只有会员 安妮的秘密圈
可以解码安妮的秘密信息。
>> 请记住，安妮取决于你。
设置您的销到B-2。
这里是message-- 12，11，2--
拉尔夫·帕克（话外音）：我 我在我的第一次秘密会晤。
电台播音员：--25，14，11，18，16--
拉尔夫·帕克（话外音）：哦， 皮埃尔是伟大的声音在今晚。
我可以告诉大家，今晚的 信息是非常重要的。
>> 电台播音员：--3，25。
这是从伊能静自己的消息。
记住，不要告诉任何人。
>> [喘气]
拉尔夫·帕克（话外音）： 90秒后，我
在唯一的房间 房子里的9个孩子
可以坐在隐私和解码。
啊。
“B”。
>> [笑]
>> 拉尔夫·帕克（话外音）： 我去到下一个。
“E”。
第一个字是“是”。
是的！
现在来了更容易。
“U”。
>> [笑]
>> RANDY PARKER：噢，来吧，拉尔夫。
我得走了！
>> 拉尔夫PARKER：我马上下来，马。
啧啧飕飕。
“T” “O”。 “一定 以“。”一定要“是什么？
什么是小孤儿安妮 想说什么？ “一定要”是什么？
母亲：拉尔夫，兰迪得走了。
请你出来？
>> 拉尔夫PARKER：好吧，妈​​妈！
我马上就出来了！
拉尔夫·帕克（话外音）： 我越来越近了。
张力是可怕的。
那是什么？
地球的命运 可以挂在平衡。
>> 母亲：拉尔夫，兰迪的得走了！
>> 拉尔夫PARKER：我马上就 出来，哭出声来！
拉尔夫PARKER （话外音）：几乎没有！
我的手指飞了！
我的心是钢的陷阱。
每一个毛孔振动。
这几乎是清楚的！
是的！
>> 拉尔夫PARKER：“一定 喝你的阿华田。“
阿华田？
à照出的商业？
>> [音乐播放]
>> 拉尔夫PARKER：狗娘养的。
>> （笑）
>> 戴维·J·马兰：所以这则是 惊鸿一瞥的密码是什么
可以为this--à 喝从昔日。
所以简单公告。
如果你是自由的这 周五下午1:15，并会
想加入我们CS50 午餐前往该网址在这里。
先来先服务如常。
但随着时间的推移，我们将确保 大多数人谁愿意参加
可安排明智的。
>> 所以字符串。
我们有Zamyla--人 你现在见过最有可能
在习题集1--的 名字是这样拼写。
并假设你输入她的名字 成计算机程序，是
使用类似的getString。
为了检索 这些按键，怎么
做才好较 字符串，一句话，一个段落，
或多个字母这样的吗？
>> 我们谈最后一次约 整数和问题
出现整数溢出 和浮点值
和问题 出现在精度范围内。
随着弦，我们至少 有一点更灵活
因为strings--刚 在现实天下 -
可以是一个漂亮的任意长度。
很短的，长的漂亮。
但即便如此，我们要 发现电脑有时可以
运行内存不足，甚至没有 存储一个足够大的字符串。
>> 但现在，让我们开始显现 字符串的东西在这些箱子
这里。
所以六个这样的盒，其中每个 代表一个字符或“字符”。
所以记得“字符” - C-H-A-R--是 在C中的内置的数据类型中的一种
这有什么好看的，你可以用 之类的，作为一个构建块，
一块拼图，如果你愿意，形成 较大的数据类型，我们将继续
调用“弦”。
>> 现在，是关于思维有用 这样的事情在这样的字符串？
嗯，事实证明，我们可以 实际利用这种结构
实际访问单个字符 在一个非常简单的方法。
我要继续前进，创造 一个名为“stringzero.c”
但你可以把它叫做任何你愿意的话。
而在球场上的网站是 已经是这个例子中前进，
所以你不需要 输入所有的东西。
>> 而且我要继续前进 和第一次做INT主要作废。
而在几天之内， 我们将开始捉弄分开
虚空是什么在这里，为什么它的 整型旁边主，等等。
但现在，让我们继续 复制粘贴。
>> 我要宣布一个名为s字符串。
而我要的回报 GetString的在任何用户类型。
这将是一个简单的 程序，没有说明，
我只是盲目地 期望用户知道
怎样做才能保持它的简单。
>> 而现在，我将有一个for循环。
我的for循环里面，我 将有INT I变零。
我是，也只是一个惯例， 索引变量计数，
但我可以把这个我想做的事情。
我要做的i小于than--好 Zamyla的名字是6个字母。
所以我要努力 代码那里了。
>> 然后对我有用。
而现在这里面的卷发 括号我会做的printf，
我想打印一个 字符一次。
所以我打算用％下 也许是第一次。
然后，我要打印的每张 性格上自己的路线。
所以我要放 小反斜杠Ñ那里。
关闭股票​​。
>> 现在我想要做的东西在这里。
我想打印出来的 在字符串中的特定字母，
S，因为我遍历 从零上多达六个。
换句话说，我要 打印s的第i个字符。
现在我该怎么办呢？
>> 嗯很像箱子 这表示在这里，
种，想起了拳击的概念 在信中，您同样可以做到这一点
语法简单的通过指定在C中， 我想打印输出S的第i个字符。
使用方括号 您的计算机键盘上
在美式键盘上的 一般在你的返回键。
>> 因此，这是不完全正确 然而，正如你可能已经注意到了。
不过，我要种 一味地在这里开拓进取。
而我要做的事情做出字符串0。
但我没有这样做的，如果让我们看看 无法预料的一些常见的错误。
这是怎么回事编译？
不，我错过了一大堆东西。
图书馆听说。
>> 那么，哪头文件 我可能要在这里补充的吗？
是啊。
>> 听众：您需要 标准I / O [听不清]
>> 戴维·J·马兰：优秀。
所以，我需要标准I / O。为了什么 这样做的目的我想标准的I / O？
对于printf的。
所以，包含了stdio.h。
你也建议我加入 在CS50的图书馆是什么原因呢？
有字符串。
所以我们会看到什么 CS50的图书馆正在做
创建一个字符串的这个概念。
但现在，你可以认为 它作为一个实际的数据类型。
>> 因此，这似乎是一点点清理。
现在我要继续前进 确实做到让字符串0。
编译。
所以这是很好的。
所以./string0让我放大，使我们可以 看到更加紧密地发生了什么。
输入。
Z-à-M-Y-L-A输入。
我们已经印出来Zamyla的名字。
>> 所以这是相当不错的。
所以，现在让我们继续前进， 再次运行此程序，
并输入了Daven的全名。
惊喜，惊喜。
输入。
嗯。
我们没有印刷Daven的 全名字正确。
现在，这应该是显而易见的 回想起来的原因是什么，
样的，愚蠢的设计决定？
>> 是啊，我硬编码了 6里面我的for循环。
现在我这样做只是因为 我知道Zamyla的名字
将是六个字母。
但可以肯定这不是 一般的解决方案。
所以，事实证明，我们可以动态 找出一个字符串的长度
通过调用一个名为的strlen函数。
>> 同样，故意 简洁的命名只是
以使其更方便地输入。
但是，这等同于 得到一个字符串的长度。
我将返回到我的终端 窗口并重新编译运行。
但它吼我。
隐式声明的库函数 strlen的使用unsigned int型const--
我迷路了。
完全。
>> 因此，特别是作为 眼神开始呆滞
像这样的错误信息，重点 老老实实的前几个字。
我们知道问题出在 8号线，如下所示。
而且它是在字符串0.c。
隐式声明 库函数strlen的。
使一般要 是错误消息的格局。
隐式声明的东西。
>> 因此，在短期，你有什么我似乎 这样做就线8条，在这里。
什么可能的解决方案是偶数 如果你从来没有使用strlen的自己吗？
>> 听众：不同的库中的一部分？
戴维·J·马兰：第一部分 不同的库。
因此，特此声明，可以这么说。
它提到了一些文件 比stdio.h中和CS50.h.其他
现在它在哪儿定义的？
说实话，你要么只是 知道这一关你的头顶，
或者你google一下，看看。
或者知道这一点，我已经打开了，在CS50 设备上的终端程序，这
是只大，全屏版 什么是gedit中的窗口的底部。
>> 而事实证明，有一个 同样简洁的命令，称为
男子手册，在那里，如果你键入 一个函数的名称，然后按Enter键，
你会得到相当 神秘的文档。
这只是文字一般 看起来有点像这样。
这是一个有点势不可挡 乍看之下。
但是，坦率地说我要去 让我的目光呆滞
而只专注于部分 我关心的时刻。
>> 这是这样的。
它看起来像结构 东西我很熟悉。
事实上，手册页，所以 说话，会告诉你
在什么头文件中的函数 像strlen的定义。
所以我现在要回去gedit的。
而且我要继续前进， 加上这里的#include
并保存文件。
>> 我要清除屏幕 控制L如果你一直想知道。
而我要重新运行make string.0，编译这个时候。
./string.0 Zamyla。
这似乎工作让我走 进取，与达文波特重新运行它。
输入。
而这也似乎工作。
>> 因此，我们可以做得比这好一点， 不过，我们可以开始整理东西
最多只是一点点。
我要去实际 下面介绍一件事。
我要继续前进， 它保存在不同的文件。
我要去打电话 此文件string1.c刚
为与代码一致 你可以在网上找到。
>> 让我们集中在 完全相同的代码。
事实证明，我已经 是一种了结
理所当然的是，我的笔记本电脑， 并且反过来，CS50器具
有很多记忆，很多 内存，有很大的空间的字节
我在其中可以存储字符串。
>> 但现实的情况，如果我输入长 够了，够按键，
我可以在理论上类型 在多个字符
比我的电脑 实际拥有的内存。
这是有问题的。
就像一个int只能 算如此之高，从理论上讲，
你只能塞进这么多字 到您的计算机的RAM或随机
存取记忆体。
>> 所以我不得不更好地预测 这个问题，甚至
虽然它可能是一个罕见的 角落里的情况下，可以这么说。
不会发生的时候，可能会发生。
如果它发生，我不 预测和计划吧，
我的程序可以做谁知道。
冻结，死机重启，等等。
一些预期可能会发生。
>> 那么，我该怎么办 现在，今后真的，
之前我曾经盲目 使用一个变量，比如s的
已分配的返回值 其他一些功能如GetString的，
我要确保 它的值是有效的。
所以，我只知道，从已经阅读 CS50的文档的GetString，
最终，我们将会为你在， 该形式返回一个特殊的符号
称为NULL，N-U-L-L中的所有 帽子，一旦出了问题。
>> 所以通常情况下，它返回一个字符串。
但除此之外，如果它返回n-U-L-L-- 我们最终会看到什么是真正的
是指：这只是意味着 坏事发生。
现在，这意味着，就像在刮， 我可以在这里查询的条件在C中，
如果s不等于NULL。
所以，如果你还没有见过这个， 这也就意味着不等于。
>> 所以它的对立面 平等的平等，其中还记得，
从单一的不同 等于，这是分配。
所以如果s不等于 空，才做
我想执行的代码行。
因此，换句话说， 之前，我在潜水盲目
并开始迭代 在S和处理它
就好像它是一个序列 人物，我会先检查，
等一下，是绝对不是 等于这个特殊值，空值？
>> 因为如果是这样，坏的事情都可能发生。
而现在，假设坏事 发生意味着你的程序崩溃，
而且你不一定能恢复。
所以，坦率地说，它看起来丑陋。
种它现在混乱的看了一眼。
但是，这将变得更 不久熟悉。
>> 但我要提出 现在另外一个改进。
这是一个改善的正确性。
我的计划是现在比较正确的，因为 在罕见的情况下，没有足够的记忆体
存在，我会处理这件事， 而我就什么也不做。
至少我不会崩溃。
>> 但是，让我们做一个最终版本在这​​里。
和一个文件名为string2.c。
我要粘贴 相同的代码只是一瞬间，
而我要强调这 线，11日，在这里，一会儿就好了。
现在的实际情况是，聪明的编译器 像锵能够解决这一问题，我们
幕后 没有我们曾经知道。
但是让我们想想这 从根本上是有问题的设计。
>> 这行代码，当然， 他说，初始化一些变量i为0。
这是非常简单的。
什么又是这样的 声明中，在这里，我有用，在做什么？
我们已经看到过，但我们 没有真正谈论它。
>> 听众：递增岛
>> 戴维·J·马兰：递增岛
因此，在每次迭代中通过 这个循环中，每一个循环中，
你是递增i增加1。
所以它变大，大，和 做大，直到循环终止。
它是如何终止？
那么有这个中间 这是我们以前使用的条件。
你见过在 预排在P组。
>> 但是，这是什么意思吗？
请执行下列操作循环，使 只要i小于什么？
听众：字符串的长度。
戴维·J·马兰：本 长度的字串。
所以它转换很干净 英语在这个意义上。
现在的问题是，每一次我 通过此循环迭代理论上
我在问这个问题。
为i小于s的字符串的长度？
>> 现在也是我改变在每次迭代？
是的。
因为+ +的。
所以，每一次迭代i的越来越大。
但为s挺大的，或 较小，或改变在所有？
号
所以在设计方面，其中一个轴 同时，我们试图评估代码
在课堂上，这种感觉有点愚蠢。
>> 就像你从字面上看， 在每一次迭代
这个循环的要求 同样谴责的问题了，
又一次，又一次，和字面 这是永远不会改变的。
至少如果我没有碰s和 试图改变s的内容。
因此，我可以做得比这更好一点。
>> 而我什么都做不 声明只有一个变量i，
但第二个变量我会随意， 但传统上，正调用它。
分配N个相等的 第字符串的长度。
然后在这里，我要 做一个聪明的小优化，使
可以说，在一天结束时 不再是正确的或不正确的少
比以前。
但它是一个更好的设计。
在事实上，我使用 更少的时间，更少的CPU周期，因此
说话，回答同样的 的问题，但只有一次。
>> 上一般的任何问题 改进的原则，
说，程序的效率？
是吗？
听众：你为什么 使用[听不清]？
戴维·J·马兰：好问题。
那么，为什么我们把+ +上月底 í而不是I的开始？
在这种情况下，它具有 没有功能的影响。
而在一般情况下，我倾向于 使用后缀运算符
所以，这是一个更加清楚一点的 至当操作正在发生。
>> 对于那些不熟悉的，还有另一种 语句，让你可以做+ +我。
这些都是功能 在这种情况下，等同
因为没有什么别的 周围的增量。
但是，你能想出 宗和代码行
其中有差别。
所以一般情况下，我们不 甚至谈论这个。
因为坦率地说，它使你的 代码性感，和排序的雨衣，
和更少的字符。
但现实是它的很多困难， 我想，即使我来包装我的脑海
周围有时， 操作的顺序。
所以顺便说一句，如果你 真的不喜欢这样，
即使这是种性感 看，你也可以做I + = 1，
这是对的丑陋版 postfix的增量同样的想法。
>> 我这样说，你 应该取笑它，
但你会看到代码 一些之前长的漂亮。
>> [笑]
>> 戴维·J·马兰：是吗？
是啊。
问题在中间。
>> 听众：你需要说INT N'
戴维·J·马兰：你这样做 不用说INTñ。
所以，因为我们已经说过诠释， 你不必说了一遍。
美中不足的是，n具有以 具有相同的数据类型，因为我。
所以，这只是一个在这里方便。
是啊。
>> 听众：你可以去比 打印字符s支架我又？
戴维·J·马兰：当然可以。
所以％C，从去年召回 时间，只是一个占位符。
这意味着把一个char这里。
反斜杠N，当然，只是 手段把换行符这里。
所以，刚刚离开，现在， 这片新的语法。
这是从字面上说，抢 字符串称为S去得到它
第i个字符，可以这么说。
>> 我一直说的第i个字符 因为在这个循环的每次迭代
这是因为，虽然我们打印 出，头s支架0，
作为一个程序员可能会说。
那么S支架1，则S 支架2，然后是3，然后是4。
当然，它是一个变量， 所以我只是表达它与I。
>> 键，虽然是实现， 特别是如果你不
被驯化了这个世界 编程时，我们都
似乎从零来算，得 现在就开始从零计数。
因为字符串，第一个字符时， ž在Zamyla是好还是坏
要住在的位置数为零。
>> 好吧，让我带 我们回到这里Zamyla
看看到底发生了什么 在引擎盖下方。
因此，有型铸造这个概念。
你可能有实际 玩这个已经，
也许对黑客 的P版的设定之一。
但是，类型转换只是指 在C和能力的其他语言
到一种数据类型转换成另一种。
>> 现在怎么可能，我们看到这个 很直截了当？
所以这一点，召回，是开始 的英文字母。
和上下文，还记得，从 就像一个星期前是ASCII码。
美国标准守则 信息交换。
这只是一个很长的路要走 的说法，从字母的映射
为数字，从数字到字母。
>> 因此通过并购在这里，点点 点，线了，召回，
十进制数65就到了。
我们没有谈 这个明确的，
但肯定有相似 数字为小写字母。
事实上，有。
世界决定有些年头 以前，小A，小写，
将是97。
和小B是怎么回事 为98，依此类推。
>> 和任何其他关键 您的键盘，还有
会是位类似的模式。
或者等价地，一个十进制数。
因此，在手头上的问题， 那么，我们怎样才能
其实看到这个引擎盖底下？
所以，我打算去到gedit的一次。
而非类型 这一个从无到有，
我要继续前进， 刚刚开放的东西
从今天的代码称为ASCII码为零。
>> 和ASCII零看起来是这样的。
因此，让我们环绕这是我们的想法。
因此，首先，我已经评论 代码，这是很好的。
因为它的字面意思 告诉我会发生什么，
显示大写字母的映射。
现在，我不太知道我 那是什么意思，所以让我们推断。
>> 在英语中，也许 有些技术人员英语，
什么呢行18出现 在做我们呢？
就在第18行。
它是什么引起？
什么是它要在这里揭开序幕？
>> 听众：一个循环。
>> 戴维·J·马兰：一个循环。
又有多少次是 要去迭代？
听众：[插入VOICES] 六次。
戴维·J·马兰：不六倍。
听众：26次。
戴维·J·马兰：26次。
是啊，对不起。
26倍。
为什么呢？
嗯，这是一个有点怪异，但 我已经开始从65计数。
这是奇怪的，但不是错了。
这不是每个说不好。
而我做的，只有 因为，在这个例子中，
我有点期待 资本A为65。
现在这不是最优雅 的方式来做到这一点，来样硬编码
深奥的价值观，没有人 是意想不到的记忆。
>> 但是现在，请注意，我 这样做起来，通过65加26。
因为显然我什至不希望 做算术在我的脑海。
因此，我将让编译器做。
但是在每个循环中，每次迭代 循环的，我递增岛
>> 所以，现在这个看起来有点神秘。
但是，我们应该具备的基本建筑 与块明白这一点。
％C只是一个占位符字符。
％i是一个占位符，一个int。
而事实证明，通过使用该 新的语法，这个括号，所以
可以说，这样的数据类型 圆括号内，
我可以强制编译器把 我岂不是一个整数，但作为一个字符。
>> 从而表明了我的性格 相当于这个数字的。
现在到这里，这个代码 几乎是相同的。
我只是想让 超清晰的事实
那我开始在97， 这是小写。
在经过了26个字母。
而我doing--一遍， 铸我可以这么说。
或类型转换我可以这么说。
>> 从一个int为char。
这样最终的结果将是， 坦率地说，我们的信息已经知道了。
我要作 ASCII-0 dot--不是C点。
请注意，你可能做了 错误，因为我只是做了意外。
请ASCII-0。
现在我该怎么办./ascii-0。
我就放大了，可惜 它会在屏幕上滚过。
但是我们看到整个图上 Google地图97，B映射到98，
如果我们进一步向上滚动 A，当然，映射到65。
所以这只是说 我们一直在鼓吹，
有这个对等，是 事实上在实际的情况。
所以这是一个快速修改。
让我打开ASCII-1.C。
并请注意这个聪明，排序 的，澄清这一点。
这是ASCII-1.C，并 看到这个疯狂的事情。
>> 这真正得到的心脏 什么样的电脑在干什么。
虽然我们人类会 在letters--而言不算
我不开始思考， 没事A则B，
并使用它们来计算物体。
你当然可以说，我要 初始化一些变量称为C--
但我可以把这种现象称之为anything-- 所以C初始化为资本A.
>> 因为在一天结束时，计算机 不在乎你存储的东西，
只在乎你怎么想 呈现这些信息。
你怎么要电脑 解读比特的格局？
因此，这是不是我 一般会建议这样做。
这真的只是一个例子， 传达你绝对可以
初始化为char整数。
由于下方的 当然，一个char的引擎盖，
仅仅是一个数字，从0到255。
>> 所以，你当然可以 把它放在一个int内。
什么这也 表明的是，我们
可以从一个转换 键入到另一个，在这里，
最终打印同样的事情。
而事实上，这一点，我会解决online-- 是为了这么一说，再一次，在这里。
让我打扫一下网络，我们将 看到在网上漫游的需要，
目的是什么在那里。
>> 行。
所以最后一个例子，现在涉及 A和B的，然后我们会
拿东西了一个档次。
因此，与A和B的并 C'S的资本
和等价物，让我们 看看这个例子，在这里。
另一个代码示例。
我们会开一个的 已经作出，所以我们
不必键入它 全力以赴从零开始。
>> 并注意在期待 我们使用多个头
文件，其中之一是 我们的新朋友，string.h中。
现在这看起来，在第一 一眼望去，有点神秘。
但是，让我们看看，如果我们不能理性 通过什么是怎么回事。
首先，我从用户得到一个字符串， 我把该字符串中的变量
称为S。
复制粘贴，从之前。
在第22行，我显然 做什么
我做了一个刚才我遍历 在s中的字符。
>> 这里的新花样使用 字符串的长度，优化未成年人
存储该字符串的长度为n， 而不是调用一次strlen的，
又一次，又一次。
而只是检查我是小于n。
现在这里，事情就变得 有点有趣。
但它只是一个应用程序 这种相同的新思路。
什么英语呢 Š支架我代表？
>> 听众：每个计数 人物[听不清]。
>> 戴维·J·马兰：计算每个字符。
甚至更简洁， Š支架我代表的是什么？
你会说。
不要把你当场这里。
>> 听众：Well--
戴维·J·马兰：所以，如果这个词is--如果 该字符串是Zamyla，这starts--
听众：--you处理 人物separately--
戴维·J·马兰：好。
没错。
方括号表示法可以让你 单独访问每个字符，
所以š托架0将是对 字符串中的第一个字符。
š托架1将是 第二，等等。
所以这个问题我问， 这里，在这种条件下是什么？
是S更大的第i个字符 大于或等于小写？
而这是什么意思，在这里， 与双连字号？
听众（合）：和。
戴维·J·马兰：和。
这只是相当于此。
而不是在C语言的关键字，你必须 使用时，烦人，符号与符号。
而这一点，相反，却要求是 的s的第i个字符小于或等于
为小写ž？
再次，这里的地方 理解底层
实施了 电脑是有道理的。
请注意，即使我有 在点点点在那边，
貌似从a到z的小写字母 所有连续的值从97上了。
>> 而同样的大写开始65。
因此，外卖，然后， 的是，在英国，
你会如何​​形容 什么线24是干什么的？
是吗？
>> 听众：在24它的检查，看看 是否每一个字符是小写。
戴维·J·马兰：这是检查是否 每个字符是小写字母。
因此，更简洁，是 Š小写的第i个字符？
这就是我们 在这里表达逻辑，
隐晦一点，但 最终很直截了当。
是S的第i个字符小写？
>> 如果是这样，这里的东西在哪里 得到一点心灵弯曲
就一下，如果是的话，请 前进，打印出的字符。
所以这只是一个占位符， 但什么性格？
我为什么要做Š级别I 减去在这里体现在哪里？
>> 那么这里看到的格局。
实际数字并不重要，这么多。
但是请注意，97是 如何远离65？
>> 听众：32。
>> 戴维·J·马兰：32。
多远是98 66？
>> 听众：32。
>> 戴维·J·马兰：从大C小C 2
32。
因此，有来自32跳 一个字母到另一个。
所以，坦白说，我终于忍不住 简化这一点。
但后来我种硬编码 这种低级别的理解
没有读者是有史以来 要理解。
所以我要推广它作为我 知道小写字母越大。
我知道的大写字母 较小的值，具有讽刺意味的​​。
>> 但是这实际上等同于 话说减去32从s支架岛
因此在这些情况下 信，如果信
恰好是一个字母，小写字母 A，我减去32，
什么样的影响确实有， 在数学上，在小写？
听众：Capitalizes--
戴维·J·马兰：以大写字母了。
事实上，这就是为什么我们的 程序被称为利用零。
这个程序不是 大写字母，
检查它是否是后 的确是一个小写字母。
否则，在第30行，我该怎么办，如果 它不是一个小写字母，我很
看着在特定 迭代循环中。
刚刚打印出来。
>> 所以不改变的东西 这甚至不是小写。
限制自己 通过小Ž稍微。
现在，这是相当神秘的。
但在一天结束时，这 就是我们，曾几何时，
必须实现的事情。
如果我不是开放的资本 1，哦，感谢上帝。
有一个函数 叫上可
难道我们只是做了一切 在一个相当低的水平。
>> 我们上有趣的是， 因为它是在一个文件中声明，
你只知道这个 通过检查文档，
或者被告知，比方说，在课堂上，在那里 它的存在，在一个名为文件ctype.h。
因此，这是我们的一位新朋友。
并且上不正是 它的名字所暗示。
>> 您可以通过在，作为一个参数之间 这些括号，一些字符。
我要传递的第i个字符 第使用我们看中的新符号
包括方括号。
并采取了猜测，究竟是回归 对上价值显然会
要？
大写字母。
>> 所以，如果我通过在小写， 希望，通过对上定义，
它会返回一个 大写字母A。否则，
如果它不是一个小写字母 首先，我只是把它打印出来。
事实上，请注意 这里第二个朋友。
不只是上存在， 但是低，这
实际上回答了这个问题对我来说。
>> 现在，谁写了这些东西， 以前的10秒里，你知道吗？
实施上，是 降低使用这样的代码。
但同样，有一致的 这个想法抽象出来的​​，
之类的，较低水平 实施细则。
而站在人的肩膀上 谁来到了我们面前，使用功能
像到上部和下部是，这 奇妙的是够漂亮
命名该说什么，他们做的是 精彩的范例采用。
>> 现在，事实证明，如果我读 该手册页，说，要上，
我学别的东西。
所以，男人TOUPPER。
这是一个有点势不可挡。
但注意，这里的提 我应该使用头文件。
顺便说一句，因为这 是一种误导，功能
采用整数，而不是字符 错误检查的原因。
但是，我们也许会来 返回到在将来。
>> 但是请注意，在这里，要上转换 如果可能的字母C为大写。
所以这是非常简单的。
现在，让我们成为一个更具体一点。
让我们来看看的部分 根据返回值的手册页。
返回的值是 转换后的字母。
或c，如果转换 是不可能的，
其中c是原始输入。
我知道，从这里，从 该参数来上。
>> 那么什么是这个外卖？
返回的值是 转换的信，
或c，原信，如果 的转化率是不可能的。
有什么可以改进，所以我 让我的代码的设计吗？
是吗？
>> 听众：您可以删除的东西。
戴维·J·马兰：我可以 去掉else语句，
而不仅仅是else语句。
>> 听众：您可以删除[听不清]。
>> 戴维·J·马兰：我可以 移除整个叉
在路上，如果其他人干脆。
因此，我们确实让我打开 这样做的最终版本，
利用-2，注意只是怎么样，如果 你会，性感，代码现在越来越，
在我从一些减少 七，所以行短短四年，
我有意的功能 通过简单地调用到上层，
通过以s支架i和印刷 取出，用占位符％C，
特定的性格。
>> 现在可以说，有个bug， 或错误的，至少风险，
在这个程序中。
所以才回来 到一个较早的外卖，
我应该怎么可能还做的 这个程序，使其更加坚固，
因此，有没有办法它可以 崩溃，甚至在极少数情况下？
听众：请确保它是不是NULL。
戴维·J·马兰：确保它不为NULL。
所以真的，使这个超级 正确的，我应该这样做，
如果s不为NULL，则 请继续执行
这几行代码，其中 那么我可以缩进那样，
然后把我的右花括号。
因此，良好的搭售在一起的两个概念。
是吗？
听众：你能不能用 一个do while循环，而不是？
戴维·J·马兰：莫非 我做了do while循环？
听众：--you要确保 你实际上[听不清]。
戴维·J·马兰：莫非 您使用的是DO WHILE？
简短的回答，没有。
因为你即将 引入另一个角落的情况下。
如果该字符串的长度为零。
如果举例来说，我只是打 输入，而没有输入Zamyla。
我要交给你回一个实际 字符串，因为我们最终会看到，
具有零个字符。
它仍然是一个字符串， 它只是超短。
但是，如果你使用DO WHILE， 你要盲目
尝试做一些与 对于该字符串，
而什么也没有去那里。
>> 听众：嗯，如果你做了 做[听不清]，而S--
戴维·J·马兰：哦，我看看，让 获取来自用户的字符串。
所以，简单的答案，你 能，并保持纠缠
他们给你一个字符串，它是 短到足以装入内存。
当然可以。
我只是选择不。
如果他们不给我的字符串I 希望，我辞职，我放弃了。
但是，绝对，为此目的， 你可以完全做到这一点。
>> 因此，库的头文件 我们现在熟悉了这些，在这里。
标准I / O，CS50.h，string.h中， 文件ctype.h，并有确实，等。
你们当中有些人已经发现 在math.h.数学库
不过，让我介绍一下，现在，到 这个资源是CS50的工作人员，达文，
和Rob，以及加布特别 有放在一起。
这将很快链接 该课程的网站。
这就是所谓的CS50参考。
>> 这只是给你一个快速 它的味道，工作原理如下。
让我去reference.cs50.net。
在左手上，你会看到 方压倒性列表
功能附带℃。
但是，如果我不管，就目前而言， 关于类似的strlen，
我可以输入它。
它过滤下来的名单 只是我所关心的。
我会点击它。
而现在在左边， 你会看到什么，我们希望
是一个比较简单的，人 如何友好的解释
该功能的工作原理。
>> 返回字符串的长度。
这里有一个故事大纲，这里是你如何 用它在头文件而言，
以及在什么样的功能方面 看起来像它的参数条件。
然后在这里，退货 字符串的长度。
但是，对于那些你更舒适， 实际上你可以点击更多的舒适，
与此内容 页，现在，将改变
是什么样的默认值 你所使用的手册页。
>> 换句话说，CS50 引用是一个简化
手册页的工作人员，为学生。
特别是那些不太舒服 和在之间，这样就
不必尝试包裹 你的头脑身边，坦率地说，
一些相当神秘的语法 和文档的某个时候。
>> 所以，记住这一点 在未来的日子里。
所以在这里，再次，是Zamyla。
现在，让我们提出一个问题，那就是 多一点人访问。
由于长安，谁是被 印刷更多的大象
马不停蹄的这几天。
我们有一个机会，给 客场至少其中之一。
如果我们能够得到的只是一名志愿者 来在最多绘制在屏幕上。
怎么在这里？
>> 上来吧。
你叫什么名字？
亚历克斯：亚历克斯。
戴维·J·马兰：亚历克斯。
好吧。
亚历克斯，上来吧。
我们即将看到你 手写在屏幕上的位置。
好吧，很高兴认识你。
>> 亚历克斯：你很高兴见到你。
>> 戴维·J·马兰：好吧。
因此，超级简单的运动。
酒吧是不高 让大象今天。
你在玩的GetString的作用。
而且我会直接告诉你 你已经得到的字符串。
并假设你， GetString的，被称为。
和人，和我一样，有 键入Zamyla，Z-A-M-Y-L-A。
只是继续前进，就写Zamyla 屏幕虽然你得到它
并将其存储在某个地方存储。
>> 什么将是几个留有​​余地 其他words--没关系，坚持下去。
>> [笑]
>> 所以Zamyla，优秀。
所以，现在假设你， GetString的，被再次调用。
因此，我为您提供，在 键盘，使用其他名称，贝琳达。
好吧。
而现在，下一次的GetString是 叫我输入类似加布，
G-A-B-C。你真的走 到心脏的随机存取存储器。
这是借鉴一切 完全随机。
行。
>> [笑]
亚历克斯：对不起，我的笔迹是坏的。
戴维·J·马兰：不，没关系。
又有怎样的罗布，R-O-B。行。
好。
所以，我没想到你会 种打下的东西出来是这样的。
但是，我们可以使这项工作。
那你怎么去铺设 这些字符在内存中？
换句话说，如果我们想 这个长方形的黑色画面
作为代表 计算机的RAM或内存。
>> 并记得RAM是刚 一大堆的字节，
和字节是一大堆位。
而位在某种程度上 实施一般
用某种形式的 电力硬件。
所以这是排序的 分层，我们已经讨论过
现在可以理所当然的。
你怎么去 决定在哪里写
罗布对加布与 贝琳达与Zamyla？
>> 亚历克斯：我只是做了它在 命令你告诉我。
>> 戴维·J·马兰：这是事实。
但管辖，你把 贝琳达的名字和Gabe的名字吗？
>> 亚历克斯：什么都没有？
戴维·J·马兰：[笑] 那么这样的作品，这很好。
所以，电脑是小 比这更有序。
所以，当我们implement--呆在那里 在短短moment--当我们真正
实现类似 GetString的在一台电脑，
Zamyla可能会奠定了相当多 像你这样在屏幕上，在那里。
>> 什么是关键要注意 在这里，有什么亚历克斯做了，
有是怎样的一个分界 其中每一项的话，对不对？
你没写 Z-A-M-Y型L-A-B-C-L-I-N-D-A-G-A-B--
换句话说，有一些样 划界这似乎是，
之类的，随机的间距 这些不同的单词之间。
但是，这是很好的，因为 我们人类现在可以
可视化，这些都是 四个不同的字符串。
这不只是一个序列 地段字符。
所以一台电脑的话，同时， 可能需要一个字符串，如Zamyla，
把每一个这些信件 里面的内存字节。
不过，这个数字要大得多， 当然，大于6位。
>> 有一大堆的RAM。
所以，从今以后，这 箱格会
代表什么亚历克斯刚 在这里做在屏幕上。
而现在，亚历克斯，我们可以为您提供 蓝色或从长安橙色大象。
亚历克斯：我要一个蓝色的大象。
戴维·J·马兰：一个蓝色的大象。
因此，一个热烈的掌声， 如果我们可以，亚历克斯在这里。
>> [掌声]
>> 亚历克斯：谢谢。
戴维·J·马兰：谢谢。
这样的外卖的是，即使 种模式随时间变化的，在这里
在黑板上，有这 各串之间的分界
亚历克斯得到了我们。
现在的电脑，坦率地说， 可以做同样的事情。
种他们可以噗通 字符串的任何地方在RAM中。
在这里，在这里， 在这儿，在这儿。
>> 他们可以这样做。
但是，当然，这是 可能不是最好的规划。
对不对？
如果我一直在问亚历克斯 得到的名字，也许他会
多放些到这里，也许最多 在这里，看过来，看过来，最终
在这里。
但有更多的规划，当然， 我们可以打好的事情了更干净。
事实上，这就是一台电脑一样。
>> 但美中不足的是， 如果下一个字符串，我得到
后Zamyla是什么 像贝琳达，
建议我们会写 字母b相对于该网格？
你会去哪里？
为a的右侧， 下面的Z，下面有一把？
什么你的第一直觉是什么？
听众：下面的Z。
戴维·J·马兰：所以Z轴下方。
这就是美丽的 简单吧？
这是一种整齐，这是我们做什么 在键盘上，当我们按下回车键，
或电子邮件时作出 物联网项目符号列表。
但现实的情况是，电脑 尝试更有效率，
和补习班肯定之多 数据到RAM成为可能，
这样你就不会浪费任何字节。
这样你就不会浪费 任何屏幕房地产。
与该问题，虽然是 如果我们硬是​​把信
后B A，我们如何来 知道Zamyla的名称结尾
和贝琳达的名字开始？
所以，你们人类只是建议，好了， 按下回车键，基本上。
把它放在楼下。
甚至亚历克斯做了，刚开始写作 低于前一个下一个名称，
和下面的那一个，并 那么下面的那一个。
这是一个视觉提示。
>> 电脑有另一种视觉提示， 但它是一个小更简洁。
正是这种质朴的性格。
反斜线0，这也许是 让人想起反斜杠n个，
等等，现在。
特殊的转义序列。
反斜线0的方式 代表捌零位成一排。
0000 0000。
>> 你表达的方式是不 按键盘上的数字为零，
因为实际上这是一个ASCII字符。
它看起来像一个数字，但 实际上是一个十进制数
表示圆 字形，圆形字体。
同时，反斜线 零表示，从字面上
把捌零字节来到我身边。
>> 因此，这是有点武断。
我们本可以用任何图案 位的，但在世界
决定好几年 以前，该代表
字符串在内存中的端部， 只是把一大堆零。
因为我们可以检测到。
现在，意味着无信 字母可以表示零。
>> 不过没关系，我们已经看到了 我们使用的是65在97就到了。
我们没有取得任何进展 接近为零。
因此，贝琳达在计算机的内存 实际上要去这里。
我在黄色绘制它只是 要引起我们的注意。
并请注意，同样，这 完全是任意的。
我画它作为一个网格。
如，内存只是一些实物。
它不一定 行和列，本身。
它只是得到了一大堆的字节 在硬件某种程度上实现。
但是，如果贝琳达后我 键入Gabe的名字，
他将在这里结束在内存中， 如果我输入Daven的名字，
比如，他会在这里结束。
我可以继续 即使写的名字。
>> 不幸的是，如果我尝试 写一个超长的名字，
我可能最终会耗尽内存。
在这种情况下，GetString的是 将返回NULL，因为我们说。
不过，值得庆幸的是，至少在这个视觉 在这里，我们没有得到想象中的那么远。
>> 现在有什么好看的是，这 对待事物的总体思路
在盒子是为 c代表的功能
和很多语言， 已知为阵列。
一个阵列是另一种数据类型。
这是一个数据结构，如果你愿意。
在它的结构感真的， 种，看上去就像一个盒子，至少
在你的脑海里。
数组是一个连续的 相同数据类型的序列，
背靠背背靠背。
>> 所以一个字符串，在其他 也就是说，是字符数组。
字符数组。
但事实证明，你可以有 事情束阵列。
实际上，我们可以把连 在数组编号。
这样的形式，其中 我们将要开始
声明这个数据 已知为阵列结构
也将使用方括号。
但是这些方括号将要 有不同的含义在此上下文。
>> 让我们来看看它，如下所示。
假设我打开 在这里一个新的文件。
我保存这为ages.c.
我会在我的文件夹中保存这个位置。
现在我要继续前进 并开始键入的东西
像包括CS50.h，包括 stdio.h中，诠释主作废。
然后这里里面，我想 先有所谓的年龄为int。
>> 而且我会用它来获得 从他或她的年龄的用户诠释。
但此方案是指使用由 多的人，不管是什么背景。
我有一排人。
所有的人都必须输入自己的 年龄也许一些，我不知道，
竞争或事件 他们已经到达了。
所以旁边的人，我 需要另一个变量。
>> 因为如果我只是做 时代变调用getInt，这是
要揍，或覆盖 前面的人的年龄。
所以这是没有好处的。
所以，我的第一直觉 也许，哦，没事，
如果我想要得到多人的 ages--我们称之为age1，
INT age2得到诠释，诠释age3得到调用getInt。
现在我要使用 这里是一些伪代码。
>> 做一些与这些数字。
我们会离开的另一天是什么 我们正在做的吧，因为我们只
关爱的时刻 关于age1，age2，age3。
不幸的是，有一次我 编译这个程序
并把它在实际的用户面前， 什么是根本设计不良
我似乎决定了呢？
是吗？
听众：[听不清]
戴维·J·马兰：是啊， 我还没有尝试过
要弄清楚有多少年龄 我真正关心？
如果我有少于三个人在这里， 因此，少于三个年龄段，
我仍然盲目期待3。
上帝保佑4达人秀。
我的计划是不会甚至支持他们。
>> 所以这个，说来话长 总之，不是一个好习惯。
对不对？
我基本上是复制和 粘贴代码，只是调整
变量名。
而且，我的上帝，如果你有，不是三 年龄，但10或100，甚至6500
大学生，例如。
这不会是特别 优雅的代码，或可持续。
你将不得不 每一次重写程序
你对人的改变数量。
>> 所以，值得庆幸的是，在我们的实际 ages.c文件今天，
我们有更聪明的解决方案。
首先，我要借用 构建我们已经用过几次，
此做while循环中，为了得到 的人在房间的数目。
我只是去纠缠用户，再 又一次，直到他或她给我
n的值是一个正整数。
>> 我可以使用，最后 时间的获得正面的诠释。
但是，我们没有这方面的 实，让我继续
并重新实现了这个想法。
现在在这儿，这是新的把戏。
在第27行，作为评价 在第26行指出，
声明一个数组中 存储每个人的年龄。
>> 所以，如果你想要得到的，而不是一个整数，不 两个整数，但一大堆的整数。
特别是n个整数，为N可能 有三个，也许是100，也许是1000人。
语法很简单，就是 比方说，你想要什么类型的数据？
你想打电话 该内存块？
那你要拨打的网格 看起来像这样形象地？
>> 而在这里括号，你说 你要多大的数组是。
因此更早的时候，我说的 语法是有点不同的位置，
我们还是用方括号， 但是当我在声明数组，
内部的数 方括号方式
要在阵列是多大做的。
>> 与此相反，当我们使用S 支架刚才我，S，A弦，
的确是字符数组，但 当你没有声明一个变量，
与此关键字在这里， 你只是得到
具体的指标，具体的 元素的数组。
一旦我们知道了，剩下的 这很简单。
如果有新的我第一次去打印出来 什么是人编号i时代。
在这里我只想说人排名第一， 人排名第二，个人第三。
>> 而我只是在做算术， 让正常人一样，
我们从一本算 程序，而不是从零。
然后我打电话调用getInt，但我存储 在年龄答案级别I。
这是第i个年龄在数组中。
因此，而上一次我们在治疗 这些箱子的字符为Zamyla的名字，
及其他。
现在，这些方块代表 32位或4个字节
我们可以在其中存储 一个int，一个int，int类型。
所有这一切，再一次， 具有相同的数据类型。
>> 现在我做一些愚蠢的， 像时间的推移，只是
证明写这个程序。
然后到这里，我再次重复 在阵列说一年以后，
人的头号意志 是什么岁。
并弄清楚， math--我的意思是，这
不是很复杂算术： 我只是补充自己的年龄。
只是为了演示，再次，这一点。
>> 正如我可以索引到一个字符串，S， 这样我就可以索引到年龄的数组，
像有。
那么，这是怎么回事要带我们？
所以我们会看到，最终， 在天几件事情来。
一，这一切的时候， 编写自己的程序，
像马里奥，贪婪，信用。
你已经输入的名称 该程序并按下Enter键。
然后获取用户的输入。
>> 用的getString，调用getInt， getLongLong，或类似物。
但事实证明，C支持 一些所谓的命令行
争论，这是怎么回事，让我们 实际上得到的是你输入的话，
在闪烁提示， 之后，你的程序的名称。
>> 因此，在未来的日子里，你 可以键入类似撒，
或./caesar 13号，此后。
我们将看到如何工作的。
因为的确，在 问题设置两个，我们
要为您介绍 到了一点东西
让人想起拉尔夫年代 挑战早前制图。
艺术争先恐后的信息。
这其实是很 不禁让人想起拉尔夫一样。
>> 这是一个加密的例子 算法称为ROT13，R-O-T 13。
这只是意味着旋转 字母在字母表13个地方。
如果你这样做，你会看到现在 是什么，也许，一个熟悉的短语。
但在路上，我们要使用 这一点，最终是更普遍。
>> P中设置两种，标准版， 您将实现一对夫妇的密码，
一个叫凯撒，一个叫的V @ genere。
他们两人都是旋转 密码，在某种程度上你
把一个字母到另一个字母。
而凯撒是超级简单。
你加一个，你加13， 或者一些人数达26。
的V @ genere不上 每个字母的基础。
所以的V @ genere，你会看到 在规范中，是更安全的。
>> 但在这一天到底是什么 你将实现和P设置两个，
是您同时使用该密钥 用于加密和解密。
参照转弯的过程中 纯文本，一些原有的消息，
成暗号文字，这 什么是加密的。
然后再解密它。
>> 在黑客的版本， 同时，你会
负责类似的东西 在精神上，我们会给你
一个文件，从一个典型的Linux，或 Mac或Unix的计算机名为Etsy的
密码，其中包含一个全 一串用户名和密码。
而这些密码都 被加密或散列，
可以这么说，更恰当 您将在规范中看到的。
>> 而黑客版将挑战 你服用的输入这样的，
和破解密码。
也就是说，搞清楚什么 人的密码居然是。
因为，事实上，密码是 通常不存储在清晰，
和一般口令 应该不难猜到。
这不是常有的事。
>> 而我认为我们会做的是 总结了几分钟
一眼特别 口令选择不当
从电影，你可能还记得深情。
如果没有，你应该租房。
>> [视频回放]
>> -Helmet，你恶魔，这是怎么回事？
你在做什么，以我的女儿？
>> -Permit我介绍 才华横溢的年轻的整形外科医生，
医生菲利普Schlotkin。
最大的隆鼻的人在 整个宇宙和比佛利山庄。
>> - 您的殿下。
>> - 鼻腔的工作吗？
我不明白。
她已经有了一个隆鼻。
这是她甜美的16本。
>> 不，这不是你的想法。
这是非常非常糟糕。
如果你不给我 组合的气屏，
医生Schlotkin会给你 女儿回她的老鼻子。
- [喘气] Nooooooooooooo。
你从哪里得到的？
>> - 所有权利。
我要告诉，我会告诉。
>> 不，爸爸，没有。
您不得。
>> -You're权亲爱的。
我会想念你的新鼻子。
但我不会告诉他们的 组合不管。
>> - 非常好。
医生Schlotkin，做你最糟糕的。
>> - 我的快乐。
>> - 不！
等待，等待。
我会告诉。
>> - 我知道它是可行的。
好吧，把它给我。
>> -The组合之一。
>> - 酮。
- 两个。
- 三。
- 四个。
- 五。
-so的组合之一， 二，三，四，五。
这是最愚蠢的组合 我曾经听到了我的生活。
这就是那种东西的的 白痴不会对他的行李。
>> - 谢谢你，你的高度。
>> [遥控点击次数]
>> - 什么你做什么？
>> -I关掉了壁。
>> 不，你没有，你 关掉了整部影片。
>> - 我意有所指按错键。
>> - 嗯，把它放回去吧！
放电影回来！
>> - 是的，先生！
是的，先生。
- 让我们走，阿诺德。
来吧，格雷琴。
当然，你知道我会 必须向您这一点。
- 嗯？
没有工作？
哪来的王？
>> - 它的工作，先生，我们 有组合。
-Great。
现在，我们可以把每一个最后一口气 从地球Druidia新鲜空气。
有什么组合？
>> - 酮，二，三，四，五。
>> 酮，二，三，四，五？
- 是的。
- 这就是惊人的。
我有同样的 结合我的行李。
准备空间球1 立即离境。
>> - 是的，先生。
>> - 和改 结合我的行李。
[关门声音]
[CLINK门击中头盔]
-Ahh。
[完视频回放]
戴维·J·马兰：这就是它的 CS50，我们会看到你下周。
旁白：现在，深 思考，通过Daven法纳姆。
>> DAVEN FARNHAM：编码中的C是 比刮了这么多困难。
printf的，划痕是一个谎言。
>> [笑SOUNDBITE]