>> [音乐]
>> DAVID J. MALAN：好的。
这是CS50这 2周的开始。
你会记得，在 在过去的几个星期，
我们已经引进电脑 科学和，反过来，编程。
>> 我们依路开始的故事 从无到有，即图形语言
来自麻省理工学院媒体实验室。
然后最近一段时间， 上周，我们什么
引入higher--一 较低级别的语言已知
如C，一些纯粹的文字。
而且，事实上，我们最后一次 该范围内探讨
一些概念。
>> 这一点，回忆，是非常 第一个节目，我们看着。
而这个程序很简单， 打印出来，“你好，世界”。
但有这么多 似乎魔术回事。
有此#include 这些尖括号。
有int类型。
有（无效）。
有括号，大括号， 分号，和这么多。
>> 所以，记得 我们推出划痕
这样我们就可以，理想情况下，看过去 该语法，那真的不是东西
所有的理智 有趣的，但早
是的，绝对的，有点棘手 来包装你的头脑周围。
而且，事实上，最常见的一种 事情早在编程类，
特别是对于那些不太 舒适，是让被挫败
并绊倒了某些语法 错误，更不用说逻辑错误。
所以我们的目标之一 今天，居然会
与某些装备你 解决问题的技巧如何
更好地解决自己的问题 在调试的形式。
你会记得，这才明白， 我们引入了环境
最后一次被称为CS50 IDE。
这是基于网络的软件是 让你在云中进行编程，
可以这么说，同时保持你的所有 文件一起，为我们再次将在今天。
而记得，我们 在这里重温这些话题，
其中的功能，以及环路，并 变量和布尔表达式，
和条件。
而实际上多了一些，我们 从头开始的世界翻译
到C的世界
>> 但根本建设 块，可以这么说，
真的还是上周相同。
实际上，我们真的只是有一个 不同的拼图，如果你愿意。
而不是紫色的 保存块，而不是我们
已经printf的，这是 这个功能在C，它
允许您打印的东西 并格式化在屏幕上。
我们推出了CS50 图书馆，在那里你
现在在您的处置GET_CHAR， 和get_int和get_string，
和其他一些功能 好了，通过它你可以输入
从用户自己的键盘。
我们也看了看东西 像these-布尔和char，
和双，浮法， INT，long_long字符串。
还有的在C.甚至其他数据类型
>> 换句话说，当你声明 一个变量来存储一定的价值，
或者当你实现一个功能 返回一定的价值，
您可以指定哪些 类型的值即是。
它是一个字符串，如 字符序列？
它是一个数字，如一个整数？
它是一个浮点 值，等等？
因此，在C，不像划伤，我们实际上 开始指定什么样的数据
我们正在返回或使用。
>> 但是，当然，我们也遇到了 计算的一些基本限制。
并且特别地， 这种语言C，召回
我们看一看在 整数溢出，现实
如果你只有一个 内存数量有限
或者，具体而言，有限数量的 位的，你只能算这么高。
因此，我们看这个例子在这里 因此在飞机上的计数器，
实际上，如果运行时间足够长会 溢出，并导致一个软件
一个实际的物理潜在错误。
>> 我们也看了浮动 点不精确，现实
仅与有限数量的 位，无论是32还是64，
你只能指定如此多的号码 后一个小数点，之后你
开始变得不精确。
因此，例如，三分之一的 世界在这里，在我们人类世界，
我们知道仅仅是一个无限多 小数点后3秒。
但一台电脑可不一定 表示数字无限数量
如果只允许它的一些 有限数量的信息。
>> 所以，我们不仅装备你 在条款更大的权力
你会如何​​表达自己的 键盘编程方面，
我们还限制什么 你实际上可以做。
事实上，错误和错误会 从这些类型的问题的出现。
事实上，在主题中今天 要像调试主题
实际上看引擎盖下 在上周的事情是如何介绍
实际上实施 让你更好
了解两者的能力和 如C语言的限制
>> 而事实上，我们将剥开层层 最简单的数据结构，
一种叫做阵列，它 划痕发生所谓的“清单”。
这是一个有点 在这方面有所不同。
然后，我们还将介绍之一 首先我们特定领域的问题
在CS50，世界 加密，加扰的艺术
或加密信息，以便 您可以发送秘密信息
和解码秘密信息 两个人，A和B之间
>> 所以，我们之前的过渡 那个新的世界，
让我们尝试一些装备你 技术，使用它可以消除
或减少至少一些 坎坷的
你可能已经遇到过 仅在过去的一周。
事实上，在你前面的such--一些 在C和赔率你的第一个问题是，
如果你像我一样，在第一时间 您尝试键入一个方案，
即使你认为逻辑 该方案是非常简单的，
你很可能会碰了壁，并 编译器是不会合作。
制作或锵不会 真正做您的出价。
>> 而为什么会这样呢？
好吧，让我们来看看， 也许，一个简单的程序。
我要继续前进，它保存在 故意叫buggy0.c文件，
因为我知道它要 提前缺陷。
不过，我可能没有意识到，如果这 是在第一或第二或第三程序
这实际上，我让自己。
所以我要继续前进， 打出来，主要INT（无效）。
然后我里面的花括号， 一个非常熟悉的（“你好，天下 -
反斜线，正“） - 和一个分号。
>> 我保存的文件。
现在，我要下去 我的终端窗口
并输入make buggy0，因为，同样， 该文件的今天的名称是buggy0.c。
所以我键入make buggy0，回车。
>> 而且，哦，天哪，从最后一次召回 没有错误消息是一件好事。
因此，没有输出是一件好事。
但在这里我必须清楚地 一些数字错误。
>> 所以输出的第一行 输入make buggy0后，召回，
是锵的相当详细的输出。
在底层， CS50 IDE配置
使用一大堆 与此编译器选项
让您不必 想想他们。
而这所有的第一线 装置与锵开始。
>> 但在此之后，该问题 开始让自己的外表。
Buggy0.c上线3条，性格 5，有一个大的，红色的错误。
那是什么？
隐式声明的库函数 int型的（为const char *的printf，
...）[-Werror。
我的意思是，它非常快 变得很神秘。
当然，在第一次 一目了然，我们不会
希望你能理解 该消息的全部内容。
和教训，所以一 今天是怎么回事
要尝试，以通知 图案，或类似的事情，
错误你可能有 在过去所遇到。
因此，让我们只能梳理出 这些话是很熟悉。
大，红色的错误显然是 象征性的东西是错误的。
>> 隐式声明 库函数printf。
所以，即使我不太明白什么 隐式声明的库函数
手段，肯定是问题 涉及到莫名其妙的printf。
这问题的根源 有宣称它做。
>> 声明一个函数 提到它的第一次。
而我们所使用的术语上周 声明一个函数的原型，
无论是与在顶部的一行您的 自己的文件或在一个所谓的头文件。
在什么文件做我们说 上周printf的是报价，
引文结束，宣告？
在哪些文件是它的原型？
>> 所以，如果你还记得，第一件事我 类型化，几乎每个节目最后时间 -
一不小心刚才开始 打字myself--是这一个这里 -
hash--的#include <stio--为 输入/ output--点H和事实上，
如果我现在保存这个文件，我要去 先走，并清除我的屏幕，
您可以通过键入做 清除，或者你可以按住控制L，
只是清除终端窗口 只是为了消除一些混乱。
>> 我要继续前进， 再输入make buggy0，回车。
瞧，我仍然看到 从铛长的命令，
但没有错误消息这一次。
事实上，如果我这样做./buggy0， 和上次一样，
其中，点指本 目录，斜线只是手段，
这里谈到的程序的名称和 该方案的这个名字是buggy0，
输入“你好，世界”。
>> 现在，你怎么可能有 收集这一解决方案
而不必 认识到尽可能多的话
像我一样，当然，有 这样做了这么多年？
那么，实现每一个问题 集，我们为您介绍一个命令
这CS50自己的工作人员 编写了一个名为help50。
事实上，C不规范 问题设置至于如何使用它。
>> 但help50本质 一个程序，CS50的工作人员
写道，允许您运行 一个命令或运行程序，
如果你不明白它的 输出，将其输出传递到help50，
在该点处的软件 该课程的员工写
会看你的程序的输出 一行行的，每个字符。
如果我们的工作人员，承认 您所遇到的错误消息，
我们将尝试一些惹你 反问，有一些建议，
就像一个TF或CA还是我自己 将在办公时间做的人。
>> 所以看help50如果你不 一定承认的问题。
但不要依赖它 太多的拐杖。
当然，试着去了解它的 输出，然后从中吸取教训
使得仅一次或两次你 以往运行help50特定错误
信息。
在这之后，你应该 更好的装备自己
要弄清楚它实际上是什么。
>> 让我们做另外一个在这里。
让我先走了，而在另一个 文件我们会打电话给这个buggy1.c。
而在这个文件中，我 要deliberately--
但假装我不 明白我做了什么样的错误。
>> 我要继续前进，做this-- 的#include，因为我已经
吸取了教训，从刚才的。
诠释主要（无效），如前。
然后在这里我会 做字符串s - get_string。
而从上一次回顾 这意味着，哎，电脑，
给我一个变量，称之为s和 使该变量字符串的类型
所以我可以存储一个或多个字在里面。
>> 然后在右边 等号的一面
被get_string，这是一个 在CS50库中的函数
这正是这么做的。
它得到一个函数，然后 双手从从右到左。
所以这个等号并不意味着 “等于”象我们想象的数学。
这意味着由右至左的分配。
因此，这意味着，采取从字符串 在用户和其存储的S内部。
>> 现在，让我们使用它。
现在让我和继续作为第二 行，让我继续前进，说“你好” -
不是“世界”，而是“你好，％S-- 这是我们的占位符，逗号S，
这是我们的变量， 然后分号。
所以，如果我没有搞砸太多 在这里，这看起来像正确的代码。
>> 而我的直觉现在进行编译。
该文件称为buggy1.c。
所以我打算做使buggy1，回车。
和织补-它，如果没有 甚至更多的错误比以前。
我的意思是，还有更多 错误消息它会
似乎比这个计划的实际行。
>> 但外卖这里， 即使你不堪重负
有两个或三个或 四个错误信息，
始终专注于非常 首先这些消息。
看最顶部的之一， 滚动备份如需要的话。
所以在这里我输入化妆buggy1。
下面是按预期锵输出。
>> 而这里的第一个红色错误。
未声明的标识符使用 字符串，没有我的意思是标准？
因此，标准是 其实别的东西。
它指的是用户的 键盘，本质上。
>> 但是，这不是我的意思。
我的意思是字符串，我的意思是get_string。
那么它是什么，我 忘了这样做的时候？
什么是缺少这个时间呢？
我有我的#include， 所以我有机会对printf。
>> 但我没有 访问只是还没有？
那么，同上次一样， 我需要告诉编译器
铛一下这些功能。
Get_string不来 与C并且特别地，它
不来的 头文件。
相反，它进来 一些工作人员写的，
这是一个不同的文件 名字，但恰当地命名。
>> 所以，简单地通过添加一行 从最后一次代码 - 召回
这铛运行时，它会 来看看我的代码从上到下，
左到右。
这将注意到， 哦，你想要的。
让我去发现， 无论它是在服务器上，
复制和粘贴，从本质上讲， 进入自己的文件的顶部
以便在该故事这一点上， 线1中，程序的其余部分
可事实上，使用任何功能 在其中，其中get_string。
所以我要忽视 这些错误的其余部分，
因为我确实怀疑，只有 第一个真正重要的。
而且我要继续前进并重新运行， 救了我的文件后作出buggy1。
瞧，它的工作。
而且，如果我做./buggy1和类型，为 例如，Zamyla，我现在会打招呼，
Zamyla，而不是你好，世界。
>> 好吧。
因此，这里的外卖店则是， 之一，尽量收集尽可能多的，你可以
单从错误信息，寻找 在一些可识别的话。
除了上述，使用每个help50 问题设置规范。
但除此之外，也总是期待 在最严重的错误只，至少
首先，看什么信息 它实际上可能屈服。
但事实证明，那里的 甚至更多的功能内置
进入CS50库帮助 您在学期初上
而早在节目 找出什么地方出了错。
所以，让我们做一个例子在这里。
我打算把这个buggy2，其中， 再次，将被有缺陷的出
门口，由设计。
>> 而且我要继续前进 做的#include。
然后我要做的主要INT（无效）。
然后我会为循环做。
对于（INT I _ 0。
i小于或等于10。
我++，然后在大括号，我要去 在这里打印出来只是一种标签符号
和一个新行字符。
>> 所以，我的意图与此 程序是很简单
迭代10次 并在每个迭代
每一次循环 通过循环，
打印出井号标签， ＃标签，＃标签。
每行一个，因为我 有新的行那里。
并回顾，对 循环，每最后week--
你会得到更多的 熟悉的语法
通过使用它与实践 long--前，这给了我
一个变量叫我并将其设置为0。
>> 这增加我对 每次迭代1。
所以我变为1到2到3。
然后该条件在 分号之间的中间
被检查的每一次迭代，使 确保我们仍然在范围内。
所以我想重复10次，所以我 有那种非常直观地只是
把10作为我的上限那里。
>> 然而，之后当我运行这一点， 用make编译它buggy2--
它并编译确定。
所以，我没有 语法错误这一次。
现在让我继续前进 并运行buggy2，回车。
现在向上滚动。
让我增加 窗口的大小。
>> 我似乎有1，2，3， 4，5，6，7，8，9，10，11。
因此，有11＃标签，即使 我明确提出10这个循环中。
现在，有些人可能会立即看到 什么错误是因为，实际上，这
是不是一个很严重的错误，使。
但它是非常普遍 在做很早。
>> 我想指出的是，虽然， 是的，我怎么可能算出这个？
那么，事实证明， 在CS50库来
不仅get_string和get_int 和get_float等功能。
它还配备了一个特殊功能 所谓EPRINTF，或者错误的printf。
它只是存在，使 它为您轻松一点点
调试代码，只是当 在屏幕上显示一条错误消息
并知道它是从哪里来的。
>> 因此，举例来说，有一件事我可能 在这里做的这个功能是this--
EPRINTF，然后我要继续前进 并说现在我是％I，反斜线，正。
而且我要在我的价值堵塞。
而向上顶，因为这 是CS50库中，
我要继续前进 并包括
所以我有机会获得这一功能。
但是，让我们考虑一下线 9应该做的事情。
我将最终删除。
这无关 我的首要目标。
但是EPRINTF，错误的printf，只是意思 给我一些诊断信息。
当我运行我的程序，我想 看到这个屏幕上暂时
也仅仅理解 这是怎么回事。
>> 而且，事实上，在每个 这里的迭代9号线
我想看看，什么是我的价值？
什么是我的价值？
并希望，我应该只 看到该消息，另外，10次。
>> 因此，让我继续前进， 重新编译我的程序，
因为我做任何时间 我做出改变。 ./buggy2。
和now--确定。
还有很多更多的事情。
因此，让我在向上滚动 一个更大的窗口。
>> 你会看到，每个 该主题标签仍然打印。
但是，在与他们每个人是现在这个 诊断输出格式如下。
在这里我的程序的名称是buggy2。
该文件的名称是buggy2.c。
行号从其中 此印为9号线。
然后那右边的是 我很期待的错误消息。
>> 什么是很好的关于这就是 现在我不必一定算
在我的脑袋就是我的程序在做什么。
我可以看到，在 第一次迭代i是0，
然后1，然后2，然后3，然后是4，那么 5，然后6，则如图7所示，然后如图8所示，然后如图9所示，然后
10。
所以等一下。
这里发生了什么？
我似乎仍然计数 如预期可达10。
>> 但是，在没有开始呢？
0，1，2，3，4，5，6，7，8，9 10。
因此0，1，2，3，4，5，6，7， 8，9，10--第11手指
指示的问题。
我似乎已经算 错误在我的循环。
而不是去10次迭代， 我从0开始，
我在，并通过10结束。
但因为，像计算机， 我从0开始计数，
我应该计数 到，但不通过，10。
>> 这样一来，修复，最终我 在这里实现的，是两件事情之一。
我很可能简单地说 数到小于10。
因此0，1，2，3，4，5，6，7，8， 9，这的确是正确的，
尽管这听起来有点不对劲。
或者，我可以做到小于或等于 9，只要我从0开始。
或者，如果你真的不喜欢，你 可以计数到10，但是从1开始。
但同样，这恰恰是并不常见。
在programming--尽管 与其说是在Scratch--
但在编程 C和其他语言，
如JavaScript和 Python和其他人，这是
只是很常见的 我们的二元讨论
刚开始点票 最低的数字就可以了，这是0。
好吧。
所以这是EPRINTF。
再次，现在我已经想通了我 的问题，我要回去0
经过不到10，我要去 去和删除EPRINTF。
>> 它不应该，当我在那里 我的船代码或提交我的代码
或展示给其他人。
它实际上只是意味着 要暂时使用。
但现在我已经解决了这个问题 特别的问题也是如此。
>> 好吧，让我们做一个例子在这里 我要去掀起如下。
我要继续前进， 的#include。 $ 50个
而且我要继续前进 和的#i​​nclude。
>> 而且我要救 此文件buggy3.c。
而且我要继续前进 并宣布INT主要（无效）。
然后里面有 我该怎么办INT I _ -
我想要实现一个程序 用get_negative_int。
这是不存在又一个函数。
因此，我们要实现 它在短短的时刻。
但是，我们要明白为什么 它在第一轮马车。
一旦我已经得到 来自用户的INT，
我只是要打印％我是一个负 整数，反斜线，正，逗号，我。
换言之，所有我 希望这个程序做
是从一个负INT 用户，然后打印出
某某是负中间体
>> 现在我需要实现这个功能。
所以在我的文件后，我要去 提前并声明调用的函数
get_negative_int（无效） - 我们将 回过头来什么该行又指
在moment-- INT N;渡渡鸟 在fo​​llowing-- printf的n是：。
然后我要做的N - get_int， 和为此而n是大于0。
然后返回否;.
>> 因此，有很多事情 这一点，但没有一个我们没有
看看上周，至少简要介绍。
于是就在这里10行，我宣布 函数调用get_negative_int，
我已经把（无效），在 括号，原因是这
不采取一个输入。
我不传递任何 此功能。
我刚开始从东西回来。
>> 而我很希望 回来是整数。
有在任何数据类型 Ç称为negative_int。
这只是诠释，所以这是怎么回事 要对我们确保
这实际上就是价值 返回的不仅是一个int
但也为负。
>> 第12行，我声明一个变量 所谓n和使其int类型的。
然后在第13行至18，我 做一些事情，而事情是真实的。
我会继续和印刷 N是，结肠，然后一个空间，
像对用户的提示。
>> 然后我打电话get_int和 存储其所谓的返回值
在变量n。
但我会继续做 此而n是大于0。
换句话说，如果用户给我一个 int和该数量是大于0，
ERGO的，积极的，我要去 只是不停的再次提示用户，
守时再次提示，以迫使他们到 合作，并给我一个负int值。
>> 而一旦n是实际negative-- 假设用户终于类型-50，
那么这个while循环不再是真实的 因为-50不大于0。
所以我们摆脱了 循环逻辑和返回否。
>> 但是有一个其他 事情我必须做的。
我可以简单地这样做 通过复制和粘贴
在该文件的顶部的一行代码。
我需要教铛， 或承诺铛，
明确地说我会的， 的确，去实现
此功能get_negative_int。
它可能只是文件中的低。
再次，记得锵 读取事情从上到下，
左到右，所以你不能 如果调用锵功能
不知道它会存在。
>> 现在，不幸的是，这个程序， 因为有些人可能已经注意到了，
已经是马车。
让我继续前进，使buggy3。
它编译，所以我现在的问题是不 语法错误，如文字错误，
它实际上将是一个逻辑 错误，我已经刻意
制成为契机 步是怎么回事。
>> 我要继续前进 现在运行buggy3。
我要去 未来，而不是合作。
我要去给它1号。
它不喜欢它，所以 它再次提示我。
>> 2点怎么样？
3？
50？
这些都不是工作。
如何-50？
和节目似乎工作。
>> 让我尝试一次。
让我试试-1，似乎工作。
让我尝试-2，似乎工作。
让我试试0。
呵呵，这是不正确。
现在，我们是一个小迂腐在这里。
但它确实的情况下满足0 既不积极也不消极。
这样一来，事实证明我的计划是 说0是负整数，
这不是技术上是正确的。
>> 现在，它为什么这样做呢？
嗯，这可能是显而易见的。
而且，事实上，程序 意味着是相当简单的
所以我们有一些探索。
>> 但是，让我们引进第三调试 技术这里叫做debug50。
因此，这是一个程序 我们刚刚创建
今年被称为debug50 这将允许您
使用什么叫做内置 图形化调试器在CS50 IDE。
和调试器只是一个程序， 通常，您可以运行程序
但一步一步一个脚印，行 由一行行，暂停，戳
四周，看着变量，这样 程序不只是吹过去，你
和快速打印的东西 或不打印的东西。
它给你一个机会，在 人类的速度，与它进行交互。
>> 而要做到这一点，你 只需做到以下几点。
编译代码后， 我已经做了，buggy3，
你继续运行debug50 ./buggy。
那么像help50有运行 help50然后命令，
debug50有运行debug50和 然后命令的名称。
>> 现在看我的屏幕上会发生什么， 上，特别是右侧。
当我打运行，所有的 这突如其来的右侧面板
在屏幕上打开。
而且还有很多要去 在乍看之下。
但是，也不是太 什么可担心的呢。
>> 这正显示出我的一切 这是怎么回事我的计划内
现在和通过这些 按钮向上顶然后
让我步我的代码 最终一步一步一步。
但不是现在。
注意会发生什么。
在我的终端窗口 我被提示n个。
而且我要继续前进， 这种合作的时间和类型-1。
虽然和一点点隐晦，-1 是一个负整数，符合市场预期。
>> 然后孩子退出， 状态0 GDBSERVER退出。
GDB，GNU调试器，是名 底层软件的
实现这个调试器。
但是这一切的真正含义，调试器 临走的时候，因为我的程序退出
和一切都很好。
如果我想真正的调试我的程序， 我要告诉先发制人debug50，
在哪里我要开始 通过我的代码加强？
>> 也许最简单的方法 要做到这一点是如下。
如果我将鼠标悬停在 我的编辑的排水沟在这里，
所以真的只是这里的侧边栏， 到行号的左侧，
请注意，如果我只是点击 有一次，我把一个小红点。
这小红点， 就像停止的迹象，这意味着，哎，
debug50，我的代码暂停执行 在那里，当我运行这个程序。
>> 因此，让我们做到这一点。
让我继续前进，运行我的程序 再次debug50 ./buggy3，回车。
而现在，通知，东西 不同的事情发生了。
我没有被提示 但在我的终端窗口
任何东西，因为我还没有 在我的计划变得那里。
请注意，在第8行 这是现在突出，
并有一个小箭头 左说，你是在这里暂停。
这行代码，行 8，尚未执行。
>> 这有什么奇怪的，如果我期待 在这里的右手边，
请注意，我是一个局部 可变的，在这个意义上本地
这是当前函数内。
和它的价值，显然是在默认情况下， 和排序的便利，为0。
但我没有输入0。
这恰好是它的 此刻默认值。
>> 因此，让我继续前进，现在做到这一点。
让我继续前进，在 右上方这里，我
要继续前进， 点击这个第一个图标其中
指步过这意味着不要跳过 ，但跨过这行代码，
执行它沿途。
>> 现在，请注意，我 提示刚刚更改。
这是为什么？
我告诉debug50， 运行此行代码。
这是什么行代码呢？
提示我要一个int。
好。
让我合作。
现在让我继续前进，并键入-1，回车。
而现在发现了什么变化。
在右手侧， 我的本地变量i
被指示为-1现在。
而且它是int类型仍然。
>> 和通知，也我所谓的 调用堆栈，在哪里我停下？
我们将详细讨论 这在未来。
但调用堆栈只是指的是什么 功能是当前在运动。
现在，它只是主力。
而现在唯一的地方 变量为i为1的值。
>> 而当我终于跨过这条线 在这里，与右上角的图标相同，
-1是一个负整数。
现在，它在暂停的花括号。
让我们让它做它的事。
我跨过这道线，瞧。
>> 所以，不是所有的可怕 启发然而，
但它确实让我暂停 并认为通过逻辑
这是什么程序在做什么。
但是，这不是错误的情况。
让我们再次做到这一点如下。
>> 我要离开这个断点 上与红色点线8。
我要重新运行debug50。
它会自动暂停在这里。
但这一次，而不是 跨过这条线，
让我真正去里面 get_negative_int并找出，
为什么它接受0作为一个有效的答案？
>> 因此，而不是点击步过。
我要继续前进 单击单步执行。
并注意8号线这 现在现在突然突出
变成17行。
>> 现在，它不是调试器 已经跳过管线14和15和16。
它只是没有什么 给你看那里。
那些只是声明变量， 再有就是这个词做
然后一个开放的花括号。
唯一的功能线这 多汁真的是这样一个在这里，17。
而这也正是我们所 自动暂停。
>> 所以输出（“n.is：”）;,这样 这还没有发生。
因此，让我们继续前进，并单击步过。
现在我的提示，的确， 变更为（「n为：“）。
现在get_int，我不会去 打扰踏入，
因为该功能是 对图书馆在CS50的。
这大概是正确的。
>> 所以我要继续前进， 那种通过给予合作
int，但不是消极的int值。
因此，让我继续前进，命中0。
现在，这里是什么情况 当我得到了第21行？
我不会再重复。
我似乎并没有停留在这个循环。
换句话说，这种黄色 酒吧没有保住绕来绕去，
又一圈，又一圈。
>> 现在，这是为什么？
好了，正，什么是现在N'
我可以看看当地 在调试器变量。
n为0。
好吧，什么是我的条件？
>> 20--线20，好了， 0是大于0。
这是不正确的。
0不大于0。
所以，我打破了这一点。
>> 所以这就是为什么上线 21，如果我真的继续下去，
我将返回0，即使 虽然我应该拒绝0
因为实际上没有被否定。
所以，现在，我真的不连 关心的调试器。
得到它，我不需要 了解更多的是怎么回事。
>> 所以我要继续前进， 只需点击播放按钮，
而让这完成了。
现在，我已经意识到我 错误显然是在第20行。
这是我的逻辑错误。
>> 所以我想要什么 做改变呢？
如果问题是，我不 醒目0，它只是一个逻辑上的错误。
我可以说，当n为 大于或等于0，
保持一再提示用户。
>> 所以，再次，简单的错误，也许 当你看到我，即使明显
写只需几分钟前。
但这里的外卖 是，与调试50，
与调试 软件更一般地，
你有这个新发现的力量 通过你自己的代码走走，看看
通过该右侧面板是什么 您的变量值。
所以，你不一定 要使用的东西
像你EPRINTF打印这些值。
实际上，你可以看到他们 肉眼在屏幕上。
>> 现在，除此之外，值得注意的 这还有另一种技术，它是
其实超级常见。
你可能想知道为什么这个小 这里的家伙一直坐在台上。
因此，有这样的技术，一般 被称为橡皮鸭调试，
这真的只是一个 证明的事实
经常当程序员 正在编写代码，
他们不一定 与他人合作，
或在共享的环境中工作。
>> 他们在家里是那种。
也许这是在深夜。
他们试图图 出在他们的代码的一些bug。
而他们只是没有看到它。
>> 而且也没有室友。
没有的TF。
周围没有CA。
所有他们有他们的货架上 就是这个小橡皮鸭。
>> 所以橡皮鸭调试 只是这个邀请
想愚蠢的东西 因为这是一个真正的生物，
实际上走过你的代码 口头本无生命的物体。
因此，例如，如果 这是我的例子这里 -
而回顾过去， 问题是此，
如果我删除这个代码的第一行， 我继续前进并再次马车0，
记得我有这些 这里的错误消息。
这样的想法在这里，可笑虽然我 感觉此刻公开这样做，
就是错误。
>> 好了，所以我的问题是，我已经 隐式声明的库函数。
而该库函数的printf。
Declare-- OK，声明 提醒原型的我。
>> 这意味着我需要真正 告诉编译器事先什么
该函数的模样。
等一下。
我没有标准io.h.
非常感谢你。
>> 因此，只要这个过程of--你 不需要居然有一只鸭子。
但是这种想法走 自己通过自己的代码
这样你甚至可以听到 你自己，让你
实现你自己的疏忽 言论，一般的想法。
>> 而且，也许更合理，没有那么 多与人，但更多地参与
例如，我们刚刚在车3.C那样， 你可能会走自己通过它
如下。
这样也好，橡胶 鸭子，DDB，如果你愿意。
在这里，我们在我的主要功能， 我打电话让负int值。
>> 而我得到的返回值。
我将其存储在左手侧 在一个变线8叫我。
OK，而是等待，如何做 该得到的价值？
让我看一下功能线12。
>> 在第12行，我们已接到负int类型。
不带任何投入， 并返回一个int，OK。
我宣布第14行变量n。
它要存储的整数。
这就是我想要的。
>> 所以，做以下，而ñis--让 我撤销了什么我修复已经作出。
所以，当n大于 0，打印出n，则确定。
然后调用INT得到存储在n个。
然后检查是否n为0， n是不是 - 它就在那里。
所以，再一次，你不 需要实际的鸭子。
但只是走自己通过 你的代码作为一种智力活动
往往会帮你 意识到发生了什么事情，
而不是仅仅做一些 这样，盯着屏幕，
而不是说自己通过 它，这是实话不
近作为有效的技术。
所以你有它，一 不同的技术数
其实对于调试代码 和找茬，所有这一切
应该在你的工具箱的工具 让你不熬夜，
尤其是，你在用餐 厅，或者在办公时间内，
撞你的头靠在 墙，试图解决一些问题。
意识到有软件工具。
有橡皮鸭子的工具。
而且还有的全体员工 支持等着伸出援助之手。
>> 所以，现在的问题的词 套，和以什么我们希望您
摆脱他们，怎么样 我们去评估。
每个课程的教学大纲， CS50的问题集
在四个主坐标轴进行评估，因此， 到speak--范围，正确性，设计，
和风格。
和范围只是指的是多少 这块你咬掉？
如何太大的问题，你试过吗？
努力什么级别 你表现？
>> 正确性，确实该程序作为工作 它应该每CS50规格
当你提供一定的投入 或某些输出回来了吗？
设计是最主观的人。
而且它是一个将 时间最长学习
最长任教，在 只要它归结为，
如何写得好是你的代码？
>> 这是一件事，只是打印正确 输出或返回正确的价值观。
但是你在做它作为 最有效的方式？
你这样做除法 与征服，或二进制
搜索，因为我们很快就会看到，我们没有 两个星期前用手机书？
有没有更好的办法来解决 问题比你现在有吗？
这对于更好的设计的机会。
>> 然后style--如何 漂亮是你的代码？
你会发现，我敢 讲究缩进我的代码，
并确保我的变量 合理地命名。 N，
而总之，就是一个好名字 电话号码，我为计数整数，
S代表字符串。
我们可以有更长 变量名风格。
风格是多么好 没有你的代码看？
而且是怎么读？
>> 随着时间的推移，你的助教 和转录因子会在使用过程中做
是为您提供与 一种定性反馈
让您获得更好的 在这些不同的方面。
而在我们如何计 评价每个这些轴，
它通常非常少 水桶，让你，一般来说，
了解你正在做的有多好感。
而且，事实上，如果你收到的分数 其中任何axes--正确性，设计
和风格especially--这个数字 通常为1和5之间。
而且，从字面上看，如果你得到 3公司在学期的开始，
这是一个非常好的事情。
这意味着仍然有 改进的余地，
你会希望在 服用类首次。
有希望的天花板一些位 到你渴望深远。
并因此让3对 最早的作品，
如果不是一些2的和4的， 的确是一件好事。
这是很有效范围内， 在良好的预期。
>> 如果你的心是赛车，等待 一分钟，五分之三。
这的确是一个6出10。
这是60％。
我的上帝，这是一个F.
>> 不是。
这不，其实这一点。
相反，它是改善的机会 在这学期的课程。
如果你得到一些 标准普尔，这些都是一个机会
采取办公时间的优势， 当然部分和其他资源。
>> 最好的是一个机会，真的， 是的你刚刚多远骄傲
过来学期的课程。
所以一定要明白，如果没有 否则，三是良好的。
它允许增长空间随着时间的推移。
>> 至于这些轴如何 加权，实事求是你
会花大部分的时间越来越 事情要工作，更谈不上正常。
因此正确性往往 进行加权的多数，与
三这个乘法因素。
设计也很重要，但 你不一定什么
花费所有这些小时 试图让事情刚参加工作。
>> 所以，它的权重 多了几分淡然。
然后风格加权最少。
尽管这是毫不逊色 重要的根本，
它只是，也许， 最简单的事情做对，
模仿的例子，我们 做讲座和部分，
事情很好 缩进和评论，
等是最简单的中 要做的事情和得到的权利。
从而这样，实现 这些都是分
是比较容易掌握。
>> 而现在一个字上 this--学术诚信。
所以每场的 教学大纲，你会看到
该课程具有相当 解决此语位。
而且课程需要的问​​题 学术诚信颇为重视。
>> 我们有区别， 是好还是坏，
具有发送的每一年 学生纪律处分
比大多数其他任何 当然，我所知道的。
这不一定 指示该事实
即CS的学生，或学生CS50，是 任何低于你的同学诚实的。
但现实的情况，在这 世界，电子，我们只是
有技术 意味着检测这一点。
>> 重要的是要我们 跨类公平
我们做这个检测，提高 这个问题时，我们看到的东西。
而刚刚画一幅画，真 帮助这样的事情在下沉，
这些都是数字 学生在过去的10年
已经参与了一些 学术诚信等问题，
与一些32名学生 从2015年秋天，这
是说我们需要做 此事非常重视。
而最终，这些数字组成， 最近，约3％，4％左右
之类的。
>> 因此，对于超级广大学生 看来，线条清晰。
但千万记住这 介意，尤其是晚
晚上用时挣扎 一些解决问题的方法集，
有机制 为让自己更好
支持可能比你 想，即使在那个时刻。
要知道，当我们收到 学生提交的作业，我们跨越
今年比较各提交 较去年每提交，
对从2007年的每提交， 既然，看着，还有，
代码库在线， 论坛，招聘网站。
我们提到这一点， 真的，所有着想
充分披露，如果 别人可以在网上找到它，
当然，我们也能做到的过程。
但是，真的，精神 的过程归结
在教学大纲这一条款。
这真的是正义的，是合理的。
>> 如果我们要详细说说 只有一个多一点的语言，
意识到所有的实质 您提交给本课程的工作
必须是你自己。
但是内的，也肯定有 机会和鼓励，
在转向和教学价值 others--自己的课题组，中科院，
助教，和其他类， 支持，更不用说朋友
和室友谁研究 CS和编程之前。
等有该津贴。
和拇指的一般规则 是this--寻求帮助的时候，
你可能会显示你的代码给别人， 但你可能无法查看他们的。
所以，即使你在办公时间内， 或者在D厅，或其他地方
一些件套的工作， 旁边一个朋友，其工作
是完全正常，在 一天的工作结束
最终应属于每个 你分别与不
有一些协同努力， 除了最后的项目中，
它允许和鼓励。
>> 要知道，如果你是 东西挣扎
和你的朋友恰好 是在这个更好的，你，
或者在这个问题比你强， 或者稍远一点比你提前，
这是完全合理的转 你的朋友说，哎，
你不介意看我的代码在这里， 帮我找出我的问题是什么？
并希望在 教学价值的兴趣
那位朋友不只是 说，哦，这样做，而是
什么是你缺少行 6，或者类似的东西？
但是该解决方案是不 为朋友在你身边
说，哦，这里，让我拉 这件事，并展示我的解决方案给你。
所以这是该行。
你看你的代码 其他人，但你可能不
查看他们的，受其他 在使用过程中的教学大纲约束。
>> 所以，千万记住这 所谓遗憾子句
在使用过程中的教学大纲为好， 如果你犯了一些行为的
是不是合理的，但它带来 课程的负责人的注意
在72小时内，该过程 可处以当地制裁措施
可以包括不令人满意的或 不及格提交的工作。
但当然不会指的 此事作进一步的纪律处分，
除了在行为屡禁不止的情况。
换句话说，如果你做一些 愚蠢的，特别是深夜，决策
该第二天早上，两天 以后，你醒来时会发现，
我在想什么？
你做CS50有一个出口 固定的问题
和拥有了它，让我们 会中途遇见你和处理
与它在一个问题，既 教育和为贵有价值的，
但在某些方面仍然惩罚。
而现在，采取边关闭，这一点。
>> [视频回放]
>> [音乐]
>> [结束播放]
DAVID J. MALAN：好吧，我们又回来了。
现在我们来看看之一 首先我们的现实世界中域
在CS50，艺术加密的， 发送和接收的技术
秘密信息，加密 如果你愿意的消息，
如果你只能被破译 发件人有一些关键因素
为好。
因此，要鼓励这一点，我们将采取 一看这东西在这里，
这是一个示例 秘密的解码器环的
可为了搞清楚使用 什么是秘密信息实际上是。
其实，早在 当天在小学，
如果你发送的秘密消息 一些朋友或在课堂上的一些好感，
你可能认为 你被聪明
在您的纸条变化的， 像，A到B和B到C和C至D，
等等。
但你实际上是加密 您的信息，甚至
如果这是一个有点琐碎，不 硬的教师来实现，
好吧，如果你只是改变 B到A和C到B，
你居然找出 什么消息了，
但你在加密信息。
>> 你只是做 简单地说，就像拉尔夫在这里
在一个著名的电影，播放 相当多广告nauseum每年冬天。
[视频回放]
-be它众所周知， 拉尔夫·帕克特此
任命小的一员 孤儿安妮秘密圈
并有权所有荣誉 并与之发生利益。
>> -Signed，小孤儿安妮， 会签皮埃尔·安德烈，在墨水。
荣誉和利益， 在已经九岁的时候。
>> [他们咆哮]
-来吧。
让我们开始吧。
我并不需要所有的爵士乐 关于走私和海盗。
>> - 听明天晚上 结论冒险
黑色的海盗船。
现在，它的时间为 安妮的秘密信息
为你秘社的成员。
请记住，孩子，只有成员 安妮的秘密圈
可以解码安妮的秘密信息。
>> 请记住，安妮取决于你。
设置你的引脚B2。
这里是该消息。
12，11--
>> -I我在，我的第一次秘密会晤。
>> -14，11，18，16。
>> -Pierre在今晚的声音很大。
我可以告诉大家，今晚的 信息是非常重要的。
>> -3，25日，这是一个消息 从安妮自己。
记住，不要告诉任何人。
>> -90秒后，我的唯一 房间在房子里一个男孩九
可以坐在隐私和解码。
啊哈，B！
我去了下，E.
>> 第一个字是可以。
S，它现在更容易到来，U，25--
>> 哦，来吧，拉尔夫，我得走了！
>> -I'll被降权，马！
啧啧飕飕！
>> -T，O，可以肯定的中场休息，一定要什么呢？
什么是小孤儿 安妮想说什么？
一定要什么呢？
>> -Ralphie，安迪已经得​​到了 走，请你出来？
>> -All权，马！
我马上就出来！
>> -I接近现在是越来越。
张力是可怕的。
它以前如何？
这个星球的命运 在资产负债可能会挂起。
>> -Ralphie！
安迪的得走了！
>> -I'll是正确的，对于哭出声来！
>> -Almost在那里，我的手指飞去，我的脑海里 是钢陷阱，每一个毛孔振动。
这几乎是明确的，是的，是的，是的。
>> -be一定要喝你的阿华田。
阿华田？
一个最低级的商业？
王八蛋。
[结束播放]
DAVID J. MALAN：OK，所以 这是一个很长的路
引入密码学， 也阿华田。
事实上，从这个古老的广告 在这里，为什么阿华田这么好？
这是成熟的一种浓缩提取 大麦芽，纯奶油牛奶，
并特地准备了可可，一起 天然磷脂和维生素。
它是与进一步强化 额外的维生素B和D，百胜。
你仍然可以得到它，很显然， 在亚马逊，因为我们在这里做。
>> 但是，这里的动机是为了 密码学介绍，具体
已知类型的加密的 作为密钥加密。
和顾名思义，整个 密钥加密系统的安全性，
如果你愿意，一种方法 只是扰
两个人之间的信息是， 只有发件人和只有收件人
知道一个秘密key--一定的价值，一些 秘密短语，一些秘密号码，即
让他们来加密 和解密信息。
和密码，说真的， 只是这个0的一周。
>> 这是一个问题，那里的投入， 像英语的实际消息
或任何语言，你 要发送给别人上课，
或在互联网上。
有一些输出，这是会 要被扰频的信息，即你
希望收件人接收。
而且，即使有人在 中间接收它太，
你不希望它们 一定能够解密，
因为这里面 黑盒子，或算法，
是某种机制，有的一步一步 指令，采取该输入
并将其转换成 输出，在希望以安全的方式。
>> 并且，实际上，有一些 词汇在这个世界上，如下所示。
纯文本是一个字 计算机科学家会
用它来描述输入 消息，喜欢英语
或任何语言，你实际上 要发送到其他人。
然后密文是加扰 给加密，或加密，
其版本。
>> 但是这里有一种其它成分。
还有另一个输入 秘密密钥加密。
这就是密钥本身， 这是，通常，
正如我们所看到的，一数，或 字母或字，无论
该算法它实际上是期待。
>> 你如何解密信息？
你怎么解读呢？
嗯，你只是扭转 输出和输入。
>> 换句话说，一旦有人 收到加密邮件，
他或她只是有 要知道，相​​同的密钥。
他们已经收到的密文。
并通过封堵这两个 输入到加密系统，
算法，这种黑匣子，出 应该原始明文。
所以这是非常高的水平 鉴于什么密码实际上是
所有关于。
>> 因此，让我们到达那里。
现在让我们看看下面 东西引擎盖
我们一直理所当然的 过去的一周，而本次会议
这里 - 字符串。
在一天结束的字符串 仅仅是一个字符序列。
>> 这可能是世界您好，或 你好Zamyla，或什么的。
但是，这是什么意思 是字符序列？
事实上，CS50库给出 我们称为串的数据类型。
>> 但实际上，没有 这样的事情在C.字符串
这真的只是一个序列 人品，人品，性格，
性格，背，背， 回来，回来，内页
您的计算机的内存或RAM。
我们会更深入，在 当我们看内存本身的未来，
与利用，并且 所涉及的威胁。
>> 但是，让我们考虑用字符串Zamyla。
如此只是名字 这里的人，Zamyla，
即序列 字符，Z-A-M-Y-L-A。
现在让我们假设Zamyla的名字 正被存储在计算机内的
程序。
>> 好了，按理说我们应该 可以看看那些字符
个别。
所以我只是要画一个小 在这里Zamyla的名称框中。
而且它是在C的情况下，当你 有一个字符串，如Zamyla--也许
该字符串已经从回来 比如找到字符串的函数，
实际上你可以操纵 通过它的性格特征。
>> 现在，这是有密切关系的 谈话在另一方面，由于
在密码学，如果你想改变 A到B和B到C和C到D，
等，则需要能够 看单个字符
在一个字符串。
你需要能够改变 在Z别的东西时，A
别的东西，并购来 别的东西，等等。
因此，我们需要一种方法， 编程，所以
可以说，在C能够改变 并期待在单个字母。
我们可以做到这一点如下。
>> 让我去头回CS50 IDE。
让我先走 并创建一个新的文件
我会打电话给这次string0， 作为第一个这样的例子，C点。
而且我要继续前进 鞭打它，如下所示。
>> 所以包括CS50.h和 然后包括标准io.h，
其中，我几乎总是会 是使用在我的节目中，至少
原来。
诠释主要作废，然后在这里我 要做得到的字符串得到的字符串。
然后我要去 继续前进，做到这一点。
我要先走 并且，作为一个全面的检查，
只是说，你好，百分之S， 分号，使串0。
嗯哦，我做了什么吗？
哦，我没有插上。
所以，经验教训，即 不是故意的。
>> 因此错误，百分之更多 转换不是数据参数。
这是哪里， 线7-- OK，所以我有，
报价引文结束，这是 我的字符串的printf。
我有一个百分号。
但我错过了第二个参数。
>> 我错过了逗号s，这 我没有在前面的例子。
因此，一个很好的机会来解决 多了一个错误，不慎。
现在让我跑 string0，键入Zamyla。
OK，你好Zamyla。
>> 因此，我们运行该种方案 现在几个不同的时间。
但是，让我们做一个东西 有点不同这一次。
而不是仅仅打印Zamyla的 整个名称用了printf的，
让我们做吧逐个字符。
>> 我将使用一个for循环。
我要去给自己 计数变量，叫我。
而且我要保持迭代，所以 只要i小于s的长度。
>> 事实证明，我们没 这样做最后一次，
将c自带 函数调用斯特林。
早在一天，并在一般 仍然实现功能的时候，
人们往往会选择很 简洁的名称那种声音
就像你想要什么，即使它是 缺少了几个元音字母或字母。
所以，斯特林是 一个函数的名称，用以
需要之间的争论 括号这应该是一个字符串。
它只是返回一个整数， 该字符串的长度。
>> 因此，这对7号线环是怎么回事 开始计算在i等于0。
这将增加 我在每次迭代
1，因为我们已经做了几次。
但它会只做 此直到点
当我是长度 的字符串本身。
>> 因此，这是一种方式，最终 遍历字符
在字符串中原样如下。
我要打印出不 整个字符串，但％的C，
单个字符 其次是一个新行。
然后我要去 继续前进，我需要
说我要打印 的S i个字符。
>> 因此，如果i是指示可变 串，其中的索引
你在这，我需要能够 说，给我S的第i个字符。
和c具有这样的一种方式 这跟方括号。
您只需说出名字了 串，在此情况下为s。
然后你用方括号，这是 通常略高于您的返回键或回车
键在键盘上。
然后你放的索引 要打印的字符。
因此指数将是一个 number-- 0，或1，或2，或3，或点，
点，点，其他一些数字。
>> 而且我们要确保它会 是正确的号码，因为我
从0开始计数。
而默认情况下，第一个字符 在一个字符串是按照惯例0。
而第二个字符是支架1。
和第三个字符是托架2。
而且你不想去过多 到目前为止，但我们不会因为我们
要增加只有我，直到 等于字符串的长度。
并在该点， 这个循环将停止。
>> 因此，让我继续前进，保存此 程序运行make串0。
但我搞砸了。
隐式声明的库函数 与类型，斯特灵和现在such--，
这听起来很熟悉。
但它不是printf的。
而且它不能得到的字符串。
>> 我没有搞砸的 以同样的方式这一次。
但是请注意，到这里一点点下降 此外，包含头文件string.h，
明确规定了 声明斯特林。
所以实际上是有一个线索。
>> 的确事实证明 还有另外一个头文件
我们已经不习惯 在课堂上还没有，但它是
在这些可用 给你，叫string.h中。
而在该文件中，文件string.h 是斯特林声明。
因此，让我继续前进， 保存此，使串
0--不错，没有错误消息这一次。
>> ./string0 Zamyla和 我正要敲回车，
在这一点上的GetString是怎么回事 返回字符串，把它放在秒。
然后，对于循环会遍历 以上的s的人物之一的时间，
并打印，每行一个，因为 我在结束反斜杠ñ。
所以，我可以省略反斜线 N，然后只打印Zamyla所有
在同一条线上， 有效地重新实现
printf的，这是不是所有的有用。
但在这种情况下，我没有做到这一点。
其实我已经打印在 字符的时间，每行一个，
让我们实际看到的效果。
>> 但是，我在这里要注意的一件事。
我们会回来的 这在未来的一周。
事实证明，这 代码可能是马车。
>> 原来，GET字符串 和生活中的一些其他功能
不一定总是 回到你期待什么。
我们从去年一流知道 时间这一点，得到
串应该返回字符串。
但是，如果用户键入了这样的 一个长字或段落或文章
有只是没有足够的 内存在计算机中，以适应它。
>> 就像，如果出了什么 不对引擎盖底下？
它可能不会经常发生， 但它可能发生一次
在一段时间，非常罕见。
所以事实证明，GET字符串 喜欢它的功能并不一定
总是返回字符串。
他们可能会返回一些错误值， 一些哨兵值这么说，
指示 出了问题。
而你只知道这个来自 在课堂上已经学会了，现在，
还是看了一些文档。
原来，GET字符串 可以返回一个称为空值。
null是一个特殊值，我们将 回来在未来的一周。
但现在，只知道如果我想 要在前进的真正合适
使用GET字符串，我 不应该只是调用它，
而盲目使用它的返回值， 相信这是一个字符串。
>> 我先说， 哎，等一下，只
继续如果s不等于 空，空在那里，再次
只是一些特殊的价值。
而且它是唯一的特别价值，你 需要担心的GET字符串。
获取字符串要么会 返回一个字符串或空。
>> 而这个感叹号等号 你可能知道，也许从数学课
你可能划上等号与 通过它的线，以指示不相等。
这不是一般的人物 你可以输入你的键盘上。
因此在大多数编程语言， 当你想说不相等，
您使用感叹号， 否则称为爆炸。
所以你说一声等于，这 表示不等于，逻辑上。
这就像有没有一个更大的 大于或等于，或小于
等于你的键在键盘上 ，做这一切在一个符号。
所以这就是为什么，在过去的例子， 你做了一个开放的支架，然后
一个等号，为了做 大于或者说，不到。
>> 那么，这里的外卖？
这仅仅是现在的一种方式 引入这种语法，此功能，
遍历各个 字符串中的字符。
而且就像那些方 支架让你得到他们，
考虑这些方括号内 那种暗示在这个底层
设计，即每 字符串内字符
是种盒装某处下方 罩在计算机的内存中。
>> 但是，让我们的这个变体。
事实证明，这 程序是正确的。
所以，每CS50的轴评估 代码，这现在是正确的。
尤其是现在，我检查 空，这个程序应该永不死机。
而我只知道，从经验。
但是没有什么别的了 我们真的可以去错在这里。
但它不是非常精心设计的， 因为让我们回到基础。
>> 首先，principles-- 请问一个for循环吗？
一个for循环做了三件事。
它初始化一些 值，如果你是问。
它检查的条件。
再经过各 迭代中，每个循环后，
它增加了一些 值，或值，在这里。
>> 那么，是什么意思呢？
我们初始化我为0。
我们检查并确保i小于 s的长度，这是Z-A-M-Y-L-A，
所以其小于6。
而且，事实上，0小于6。
>> 我们从Zamyla的名字打印出来态。
然后我们增加我从0到1。
然后，我们检查，是减少1 比S的长度是多少？
s的长度为6。
是的。
>> 因此，我们在Zamyla的名字，ZA打印。
我们增加i从0到1，2。
然后，我们检查，是小于2 Zamyla的名称的长度。
6-所以2小于6。
是的，让我们打印出来，现在M在 Zamyla的姓名，第三个字符。
>> 这里的关键是，在每个 故事的重复，我检查，
为i小于Zamyla的长度？
但美中不足的是， 斯特林不是属性。
那些你们谁编程 之前在Java或其他语言
可能知道长度的字符串 一个属性，只是一些只读值。
>> 在这种情况下，C中，如果这是 一个函数，从字面上
计数的数目 在Zamyla每次字符
我们调用该函数。
每次你让计算机使用 斯特林，它采取一看Zamyla，
并说Z-A-M-Y-L-A，6。
和它返回6。
你叫下一次 它里面的for循环，
它要去看看Zamyla 再次，说Z-A-M-Y-L-A，6。
而且它会返回6。
那么什么是愚蠢的这个设计？
>> 为什么我的代码不出来的5 5 设计现在，可以这么说？
好吧，我问了 问题不必要的。
我做更多的工作比我需要。
>> 因此，即使 答案是正确的，我
问计算机，什么是 Zamyla的长度再次
又一次，又一次，又一次？
那答案是 永远不会改变。
它总是将是6。
>> 因此，比这更好的解决办法 会是这样一个版本。
让我继续前进，把它放在一个 所谓string1.c单独的文件，
只是为了保持它分开。
而事实证明，在为 循环，你实际上可以
同时声明多个变量。
>> 所以我要保持我并将其设置为0。
但我也要去 添加一个逗号，并说，
给我一个叫做变量n，其 值等于S的字符串长度。
现在，请让我的状态 我只要小​​于n。
>> 因此，在这种方式中，逻辑是 相同在一天结束。
但我想起了 值6，在这种情况下。
什么是Zamyla的名字的长度？
而我把它以n。
>> 我还在检查 每次的条件。
0小于6？
1小于6？
是小于6 2，等等？
>> 但我不要求计算机 又一次，又一次，什么是
Zamyla的名字的长度？
什么是Zamyla的名字的长度？
这是什么Zamyla姓名的长度是多少？
我从字面上记住的是，第一， 只有回答第二个变量n。
所以这现在会是不仅 正确，而且精心设计的。
>> 那么，如何风格？
我命名我的变量 不错，我会说。
他们现在是超级简洁。
这是完全的罚款。
>> 如果你只有一个 串中的程序，
你还不如叫它S代表字符串。
如果你只有一个变量 为程序中的计算，
你还不如把它叫做我。
如果你有一个长度，N 超级普遍。
但我还没有评论我的任何代码。
>> 我没有通知rea​​der-- 不管是我的TF，或TA，
或者只是colleague--什么是应该 在这个程序中继续。
因此获得良好的作风， 我愿意这样做
是this--东西 输入像询问用户。
而且我可以重写 此任何数量的方式。
>> 确保S--确保GET 字符串返回的字符串。
然后在这里 - 这或许 最重要的comment--迭代
过在一个时间s中一个字符。
我可以用任何 英语语言的选择
这里描述每个 的这些代码块。
>> 请注意，我没有把 在每一行代码注释，
真的只是在有趣 偏多，那些
有一定的意义，我可能 想使超清晰的人
阅读我的代码。
而你为什么调用get 字符串询问用户输入？
甚至，一个是不一定 所有的描述。
但它有助于讲一个故事，因为 在故事的第二行，确保
得到的字符串返回的字符串。
>> 而在故事中的第三行是， 遍历s中一个人物
在一个时间。
而现在只是良好的措施， 我要继续前进，并添加
多一条评论，只是 在S打印第i个字符表示。
现在，我做了什么 在这一天结束了吗？
>> 我增加了一些英语 词语的注释形式。
斜线斜线符号意味着，哎， 计算机，这是对人类，
不是你的，计算机。
所以他们在逻辑上被忽略。
他们只是在那里。
>> 而且，事实上，CS50 IDE显示他们作为 灰色，作为是有用的，但不是关键
到该程序。
请注意，你现在可以做的。
无论你懂C 编程或没有，你
只需退后在这个 程序和脱脂的意见。
询问用户输入，确保 得到的字符串返回一个字符串，
遍历s中的字符 一次一个，打印字符
第i个字符S--你不 甚至有看代码
要理解这个程序做什么。
而且，更好的是，如果你自己看 这个节目在一两个星期，
或一个月，或者一年， 你也不必
在代码盯着， 试图记住，
那我想这个代码呢？
>> 你告诉自己。
你所描述它自己， 或者一些同事或助教，或TF。
所以这现在会是 正确的，良好的设计，
最终良好的作风为好。
所以，做记住这一点。
>> 因此，有一个其他 的事情，我要在这里做
现在可以透露究竟是什么 正在进行的发动机罩的下方。
因此，有此功能 在C和其他语言，
所谓的类型转换 要么含蓄
或明确允许你转换 从一种数据类型到另一种。
我们一直这样处理 据今天的字符串。
>> 并且字符串的字符。
但是从本周召回 0，是什么字？
人物只是一个抽象 上numbers--十进制数的顶部，
和小数真的只是一个 关于二进制数的顶部抽象，
因为我们定义它。
>> 因此，字符是数字。
和数字字符， 只是取决于上下文。
而事实证明，这里面 的计算机程序的，
您可以指定你想怎么看 在该节目内的位？
>> 从0本周我们不得不召回 ASCII，这仅仅是该代码
映射字母数字。
和我们说，资本A是65。
资本B是66，等等。
>> 和通知，我们基本上是有字符上 这里的最上面一行，为C会打电话给他们，
字符，然后 在第二排整数。
而事实证明，你可以转换 无缝两个，通常之间。
如果我们想要做的 这种刻意，我们
可能要处理 这样的事情。
>> 我们可能要转换 上壳体，以降低
的情况下，或小写字母为大写。
而事实证明那里的 这里实际上是一个模式
我们可以在短短的时刻拥抱。
但是让我们先来看一个 例如明确地这样做的。
>> 我要重新回到CS50 IDE。
我要去创造一个 文件调用的Ascii 0.C.
而且我要继续前进，加我 标准io.h顶部，INT主要无效
在我的函数的顶部。
然后，我只是做 following-- for循环从i等于，
让我们说，65。
>> 然后我将是小于 在字母表65，加上26个字母。
因此，我将让电脑 做数学题对我来说。
然后该环内， 我该怎么打印？
>> ％c是％I反斜线ñ。
现在，我想在两个值堵塞。
我暂时把问题 标志着有邀请的问题。
>> 我想从65迭代起 对于26个英文字母，
打印出在每个迭代该 人物的积分相同。
换句话说，我想 遍历26号打印
ASCII字符是什么，信， 和相应的数字is--什么
真的只是重建 从幻灯片图表。
那么，应该将这些问号是什么？
>> 那么，事实证明，第二 应该仅仅是变量i。
我希望看到，作为一个数字。
而中间的说法 在这里，我可以告诉电脑
对待该整数 i设定为一个字符，从而
在这里用它替换％的C.
>> 换句话说，如果我的 人类的程序员，知道
这些都只是数字 在一天结束。
我知道，65应 映射到一些字符。
有了这个明确的转换， 有一个括号，
要数据类型的名称 转换，和一个封闭的括号，
你可以告诉 计算机，嘿嘿，计算机，
这个整数转换为char。
>> 所以，当我运行这个 程序编译后，
让我们看看我get--使ASCII 0。
该死，我做了什么错在这里？
使用未声明的标识符， 没事的，不是故意的，
但让我们看看如果我们不能 原因通过此。
>> 因此，行five--所以我没有得到 很远的事情搞砸了。
没关系。
因此，对于我行5等于65--我明白了。
所以请记住，在C，不像有些 如果你有事先编程语言
经验，你有 告诉计算机，
不像划痕，是什么 变量的类型是。
>> 而我在这里忘了关键短语。
在五号线，我用我开始。
但是，我还没有告诉Ç 什么样的数据类型是。
所以我要在这里进去 说啊，让一个整数。
>> 现在我要继续前进，并重新编译。
这固定的。
./ascii0输入，这很酷。
它不仅是超级快 让计算机这个问题，
而不是看它在幻灯片上， 它打印出每行一个，A为65，
B是66，一路down--因为我 这样做26 times--到字母Z，
这是90。
而且，事实上，稍 更智能的会
一直对我不依赖 在计算机上，以添加26。
我刚做 90为好，这样长时间
因为我不犯同样的错误两次。
我想通过上去 Z，不仅仅是高达到y。
>> 所以这是一个明确的转换。
事实证明，这 甚至没有必要。
让我继续前进，重新运行此 编译器，然后重新运行ASCII 0。
事实证明，C是非常聪明。
>> 和printf，特别 是相当聪明。
如果你只是传递一个我两次 两个占位符的printf
会意识到，哦，我知道你 给了我一个integer--一些数字，
像65或90，或什么的。
但是，我知道你要我 像格式化字符该号码。
所以printf的可隐式转换 在诠释为你一个char为好。
所以，这不是一个问题都没有。
>> 但是请注意，因为这等同， 我们实际上可以做到这一点。
让我继续前进，做一个 this-- 1.C.的Ascii其他版本
取而代之的迭代 整数，才能真正打击你的心
通过遍历字符。
如果一个charç获得资本A，I 想先走，并做到这一点，
只要C小于或等于 资本Z.并在每个迭代
我想增加C，我可以 现在在我行的printf这里
比如说，百分比C是 我百分之再次，逗号C.
>> 而现在，我可以去另一个方向， 铸人品明确
为整数。
因此，再次，你为什么会这么做？
这是一个有点怪异排序的 计数的字符条款。
>> 但是，如果你明白什么是 怎么回事引擎盖下，
真的没有魔法。
你这么说，哎，给电脑 我一个叫char类型的C变量。
它初始化为大写的A和 注意单引号问题。
>> 在C字，从召回 上周，您可以使用单引号。
对于字符串，单词， 词组，使用双引号。
OK，电脑，继续做这个，所以 只要字符小于
或等于z。
而我从ASCII表知道，所有的 这些ASCII码是连续的。
>> 有没有差距。
所以，这只是A到Z， 通过每一个号码分开。
然后，我可以递增 一个char，如果我真正想要的。
在一天结束时， 它只是一个数字。
我知道这个。
所以，我只能推测到1添加到它。
>> 然后这个时候，我打印C， 然后积分当量。
我甚至不需要明确的转换。
我可以让printf和的 计算机理出头绪，
所以，现在，如果我跑 使Ascii1./ascii1，
我得到同样的事情为好。
>> 无用的程序，though--没有人 是要实际编写软件
为了搞清楚，究竟是什么 映射到一个数字，或B，或Z？
你只是去Google一下，或 网上查一查，或者看它
幻灯片上，或类似物。
那么，这实际上得到有用吗？
>> 好了，说那 滑，注意有
一个实际的模式在这里大写之间 和小写，这是不是偶然的。
请注意，资本A是65。
小写a是97。
并有多远较低情况下？
>> 所以65是97多少步走呢？
所以97减65为32。
所以资本为65。
如果添加32到， 你会得到一个小写。
而且，等效如果你减去32， 你回到资本A--同为B
以小B，大C到小℃。
>> 所有这些差距是32分开。
现在，这似乎让我们 做类似微软的Word，
或谷歌文档功能，您 可以选择一切，然后说，
改变这一切为小写，或 全部改为大写，
或仅改变第一个字 一个句子为大写字母。
事实上，我们可以做一些事情 这样的自己。
>> 让我继续前进，保存文件 这里所说的利用0.C.
让我们继续前进，掀起程序 这正是这么做的，如下所示。
因此，包括CS50库。
而包括标准I / O。
>> 我知道这是即将到来。
所以，我打算把它放在 已经存在，string.h中，
所以我有机会获得 之类的东西斯特林，
再诠释主空，一如往常。
然后我要继续前进 做琴弦得到得到的字符串，
只是为了获得来自用户的字符串。
然后我要去 做我的完整性检查。
如果字符串不等于空， 那么它的安全进行。
什么做我想做的事？
我要遍历从i等于0， 和n高达S的字符串长度。
>> 而且我要做到这一点，只要 i小于n，并且我加再加。
到目前为止，我真的只是 从之前借款的想法。
现在我要介绍一个分支。
>> 所以，回想着划痕，其中 我们在路上的叉，
上周在C.我要去 这么一说，s中的第i个字符
大于或 等于降低情况下，
而且 - 在抓你会从字面上 说和，但在C你说符号，
ampersand--和s中​​的第i个字符 小于或等于小写Z，
让我们做一些有趣的事情。
让我们来实际打印出来 性格没有换行符
即在字符串中的字符， 第i个字符的字符串中。
>> 但是，让我们继续前进， 减去它32。
否则，如果在字符 字符串，我们正在寻找
是不是稍微之间 和小Z，继续前进
和刚刚打印出来不变。
因此，我们已经介绍了 此括号表示法
我们的关系，想在 第i个字符的字符串中。
>> 我已经添加了一些条件逻辑，如 刮在上周的一周一物，何处
我只是用我的根本 一个什么样的了解
正在进行的发动机罩的下方。
为s的第i个字符 大于或等于一个？
像，它是97或98， 或99，等等？
>> 但是它也小于或等于 为小写字母z的价值？
如果是这样，这是什么意思行？
14，这是排序的 整个想法的胚芽，
大写字母 简单地减去它32，
在这种情况下，因为我知道，这每 图中，我的数字是如何表示。
因此，让我们继续前进，并运行此， 编译利用0.c后，
和运行资本0。
>> 让我们键入类似 Zamyla在全部小写输入。
现在我们有Zamyla全部大写。
让我们在所有小写输入罗布。
让我们尝试杰森全部小写。
我们不断收到 强制资本。
有一个小错误，我 那种没有预料到的。
请注意我的新提示结束了 在同一行作为他们的名字，
这感觉有点凌乱。
>> 所以我要在这里走， 其实在这个程序结束
打印出一个换行符。
就这样。
但使用printf，你并不需要 传递变量或格式代码。
你可以从字面上只是打印 像一个换行符。
>> 因此，让我们继续前进，使 再利用0，重新运行，Zamyla。
而现在这是一个有点漂亮。
现在，我的提示是对自己的新线。
所以这是一切优秀和良好。
所以这是一个很好的例子。
不过，我也不一定 需要硬编码的32。
你知道吗？
我可以say--我从来没有 记住不同的是什么。
>> 但我知道，如果我 有一个小写字母，
我基本上是想减去关闭 任何的距离是小之间
一，大A，因为如果我假设 所有的其它字母的是相同的，
应该把工作做好。
但是，而不是这样做，你知道吗？
还有另一种方式。
>> 如果这是利用1.c--如果我是 以它放入一个单独的文件。
让我们做资本2.C如下。
我要真打扫一下这里。
而不是甚至无需 知道也不关心那些低水平
实施细则，我代替 只是要打印的字符，
报价引文结束，百分比C和 然后调用另一个函数，
存在需要一个参数， 这是一个字符，像这样。
>> 原来，在C，有 另一个函数调用
到上，这正如其名 建议需要的性格
它使得其上壳 等效，然后返回它
这样的printf可以在那里插上。
所以这样做，虽然，我 需要引入另一个文件。
原来还有另一个文件 你只能从类知道，
或教材，或在线 引用，名为C type.h.
>> 所以，如果我补充一点，我的头之间 文件，现在重新编译这个程序，
capitalize2，./capitalize2 Enter键。
让我们在所有类型Zamyla 小写，还是工作原理相同。
但是，你知道吗？
事实证明，到上 有一些其它功能。
>> 让我介绍这个 命令这里，有点笨拙
命名，但男人使用说明书。
事实证明，大多数Linux计算机， 因为我们使用的是这里 - Linux的操作系统
系统 - 有一个命令 所谓的人，它说，
哎，电脑，给我 电脑的使用手册。
你想做什么 查找该手册中？
>> 我想查找功能 叫上，回车。
这是一个有点神秘 有时阅读。
但是请注意，我们是在 Linux的程序员手册。
和它的所有文本。
并注意还有的 函数的名称在这里。
事实证明，它有一个表妹叫 降低，这则正好相反。
并根据大纲的通知，要使用这个 函数的手册页，可以这么说，
告诉我，我 需要包括C type.h.
而且我知道，从实践中。
>> 在这里，它显示了我两 对于函数原型，
所以，如果我曾经想用这个 我知道他们采取什么样的作为输入，
和他们返回作为输出。
然后如果我读 说明，我看
更详细的功能做了什么。
但是如果更重要的是， 我期待下返回值，
它说，返回的值是 转换后的信，
或C，原来的输入，如果 转换是不可能的。
>> 换句话说，到上部会尝试 到了一封信转换为大写。
如果是的话，它会返回。
但是，如果它不能为某些reason-- 也许它已经大写，
也许这是一个惊叹号 或一些其它punctuation--
它只是要 返回原来的C，
这意味着我可以让我的代码 更好的设计如下。
>> 我并不需要所有的 这些代码织补行。
我的一切的线路 只是强调能
被折叠成只是一个简单的 线，这是this-- printf的百分之
C到上小号支架我。
并且这将是一个 例如更好的设计。
>> 为什么在7或8条线路实施 代码，不管是什么我只是
删除，当你可以代替崩溃 所有的逻辑和决策
成一个单一的线，13现在，这 依赖于一个库function--
随C中的函数，但 究竟你想要它做的事。
而且，坦率地说，即使 它没有附带C，
你可以自己实现它， 我们已经看到，与获得负INT
并获得上周积极INT为好。
>> 此代码是现在更具可读性。
而且，事实上，如果我们向上滚动， 怎么看怎么更加紧凑
这个版本我的程序是。
这是一个有点头重脚轻了， 所有这些包含。
不过没关系，因为现在我站在 程序员的肩膀上
在我面前。
而谁是谁 实施上真正
帮了我一个忙，就像谁 实施斯特林真
帮了我一个忙前一段时间。
所以现在我们有一个 更好的设计方案
实现精确相同的逻辑。
>> 斯特林说起，让 我继续前进，做到这一点。
让我继续前进，保存 此文件stirling.c。
而事实证明，我们可以剥开 另一层倒也干脆，现在。
我要继续前进，鞭 起来主要另一个程序
在这里，只需重新器具 字符串长度如下。
因此，这里的代码行 让我从用户的字符串。
我们继续一次又一次地用这个。
让我给自己一个叫做变量 存储一些类型为int n个。
>> 让我继续前进， 请执行下列操作逻辑。
而s中的第n个字符不 不等于0反斜杠，继​​续前进
和幅度值。
然后打印出来的printf％的I N。
我要求，这个方案在这里， 没有调用字符串长度，
计算出的字符串的长度。
>> 而神奇的是完全 包封在管线8
这里看起来像新的语法， 这反斜线0单引号。
但是，这是为什么？
那么，考虑一下一直 事情这么长的时间。
>> 而作为一个抛开我忘记之前，实现 那就是，除了手册页
附带一个典型 Linux系统一样CS50 IDE，
认识到我们的 当然的工作人员，也有
做了一个网站改版 这个所谓的想法一样
reference.cs50.net，其具有 所有这些同一个人网页，
所有相同 文档，以及
在允许顶部的小盒子 你把所有的相当
晦涩难懂的语言变成不舒服 模式，在我们的教学人员，
走过了，并试图简化 一些让一切语言
集中在思想，而不是 一些技术性的。
所以记住，reference.cs50.net 作为另一资源为好。
>> 但是，为什么在字符串长度工作 我提出刚才的方法是什么？
下面是再次Zamyla的名字。
而这里的Zamyla的名字 盒装的，因为我一直做，
画它是一个图片， 真的，只是一个字符序列。
但Zamyla不存在 在程序中的隔离。
>> 当你编写和运行程序， 你用你的Mac或PC机
存储器，或RAM可以这么说。
你能想到的 您的计算机具有
大量内存千兆字节的这些日子。
而演出意味着数十亿美元， 所以十亿字节。
>> 但是，让我们在时间上后退。
并假设我们使用 一个很老的计算机
只有32字节的内存。
我可以，我的电脑屏幕上， 简单地得出这样如下。
>> 我可以简单地说，我的 计算机有这一切的内存。
这就好比记忆棒，如果 你还记得我们上次的图片。
如果我只是划分 这足够的时间，
我主张，我有32个字节 的屏幕上存储器。
>> 现在，在现实中，我只能 到目前为止，得出这样的画面在这里。
所以我要继续前进， ，只是按照惯例，
吸取我的电脑的内存作为 格，而不是仅仅为一个直线。
具体来说，我现在声称 此网格，这8个4格，
刚刚代表所有32个字节 在我的Mac可用内存，
或在我的电脑使用。
他们正在包装 上两行，只是
因为它适合更多的屏幕上。
但是，这是第一个字节。
这是第二个字节。
这是第三个字节。
>> 这是第32个字节。
或者，如果我们认为像电脑 科学家，这是字节0，1，2，3，31。
所以，你必须为0〜31，如果 你从0开始计数。
>> 因此，如果我们使用某个程序 该调用get字符串，
而我们从人类的字符串 像我一样叫Zamyla，Z-A-M-Y-L-A，
如何在世界上做的 计算机跟踪哪些字节，
其中的内存块， 属于哪个字符串？
换言之，如果我们继续 键入另一个名字输入电脑，
像这样的岸堤，调用 获得字符串的第二时间，
A-N-D-我已经在结束了 计算机的存储器。
但如何？
>> 那么，事实证明，下面的 油烟机，什么C字符串存储什么时候
该人的类型，或该 来自其他来源，它是
描绘它们的与端 一个特殊的character--反斜杠
0，这仅仅是一种特殊的方式 的说法一排80位。
>> 所以A--这是97号召回。
因此，一些8位模式 代表十进制数97。
这反斜杠0字面上数 0，又名NUL，N-U-L，不像早期，
的N- U-L-L，这是我们津津乐道。
但现在，只知道这 反斜线0是一排只有80位。
>> 而这只是该线路 沙子，说什么向左
属于一个字符串或一个数据类型。
和任何向右 属于别的东西。
岸堤的名称，同时， 刚刚视觉
发生缠绕到其他线路， 但是这只是一个审美细节，
同样是NUL终止。
>> 这是一个A-N-D-I字符的字符串， 加上第五秘密性质，
所有0位，只是标定 安迪的名字的结尾为好。
如果我们调用get字符串第三次 在电脑中得到这样一个字符串
玛丽亚，M-A-R-I-A，同样是玛丽亚的 名NUL终止反斜杠0。
>> 这是根本不同的 如何从一台计算机通常会
存储的整数，或一个浮动，或其他 数据类型仍，因为回忆，
的整数，通常是32位，或 4个字节，或者甚至64位，
或八个字节。
但是，在计算机的许多基元 在一种编程语言
具有固定数目的 在hood--下字节
也许1，也许2，也许4，也许8。
>> 但字符串，在设计上，有一个 动态字符数。
你不知道在前进，直到 人的类型Z-A-M-Y-L-A，
或M-A-R-I-A或A-N-D-I。你不知道 多少次，用户将要击中
键盘。
因此，您不知道如何 提前多少字符
你将需要。
>> 而所以C只是一种叶子像 引擎盖下的秘密痕迹
在字符串的末尾。
存储Z-A-M-Y-L-A在内存中后， 它也只是把等价
经过一段时间。
在一个句子的末尾， 它把80位，从而
要记得在哪里 Zamyla开始和结束。
>> 那么，什么是连接， 那么，这个计划？
这里这个程序，斯特林， 仅仅是一个机制
获取一个字符串 从用户线6。
7号线，我声明一个变量 所谓的N和其设置为0。
>> 然后在第8行，我只是问 问题，而第n个字符不
不等于所有0 bits-- 换句话说，不
等于这个特殊 字符，反斜杠0，这
只是特别NUL character-- 继续前进，只是幅度值。
>> 并继续做下去，并保持 这样做，并继续做下去。
因此，即使在 我们使用我过去，
这是完全正常的 语义使用N，
如果你只是想 故意算上这一次，
只想为n调用它。
因此，这只是不断问这个问题， 是第全0第n个字符？
如果没有，看看下看看， 期待下，期待下，
期待下。
>> 但只要你看到反斜杠0， 这loop-- line 9至11--停止。
您将跳出while循环， 离开该变量n的内部
所有的的总数 你看到的字符串中的字符，
因此打印出来。
因此，让我们试试这个。
>> 让我继续前进，而不 使用斯特林功能，
只是用我自己的版本自产自销 这里所说的斯特林，让我先走
和运行斯特林，类型的东西 像Zamyla，这是我事先知道
是六个字符。
让我们来看看它是否工作。
事实上，这是六人。
让我们尝试与Rob，三字， 三个大字，以及等等。
所以，这一切是怎么回事 上罩下方。
并注意连接， 然后，在第一周
一流的，在这里我们谈到 像抽象，
这仅仅是这个分层的想法，或者 复杂性，对基本原则之上。
在这里，我们的排序看 斯特林发动机罩下方，
可以这么说，要弄清楚， 将如何实施？
>> 我们可以重新实现它自己。
但我们再也没有去 重新实现斯特林。
我们只是要 使用斯特林为了
真正得到一些字符串的长度。
>> 但有没有神奇 引擎盖下。
如果你知道下面 引擎盖，一个字符串
仅仅是一个字符序列。
和人物该序列 一切都可以解决数字
带支架0，支架 1，支架2，和你
知道，在一个字符串的末尾是一个 特殊字符，你可以计算出
如何做到在任何东西 程序，因为所有它归结为
在读取和写入内存。
即，在改变和寻找 在内存或搬东西
在内存，打印的东西 屏幕等上。
>> 现在让我们用这个新发现 究竟是什么弦乐器的理解
在引擎盖下，和 剥开另一层
至今为止，我们已经 被完全忽略。
特别是，任何时间 我们已经实施了一项计划，
我们已经有这行代码 靠近顶部声明为主。
我们已经指定int主要无效。
>> 而括号内是无效 一直说这一切的时候了主
本身不带任何参数。
任何输入的主要是 打算从用户得到
有来自其他一些 机制，以获得更多INT，
或获得浮动，或得到的字符串， 或一些其它功能。
但事实证明， 当你写一个程序，
实际上你可以指定 这个计划应该
采取输入从人 在命令行本身。
>> 换言之，尽管我们迄今为止 一直只是运行./hello打招呼
或类似的程序，所有的 我们已经使用过其他方案，
我们自己没有写， 一直在服用，看来，
命令行arguments-- 之类的东西作。
你这样说时许， 然后第二个字。
或铿锵，你说铛，然后 第二字，一个文件的名称。
>> 甚至RM或CP，你可能 见过或已经使用
删除或复制文件。
所有那些采取所谓的 命令行arguments--
在终端提示其他单词。
但是到现在为止，我们 自己还没有
这家豪华的同时从输入 用户在他或她实际运行
在命令行程序本身。
>> 但是，我们可以做到这一点通过重新申报 主要的前进，而不是有
无效括号中， 但是这两种说法
instead--第一的整数， 和第二事
新的东西，我们要打电话 一个数组，在精神上类似的东西
什么，我们在看到划痕作为一个列表，但 字符串数组，因为我们很快就会看到。
但是让我们通过看到这个 举例来说，以前我们
正是分辨是什么意思。
>> 所以，如果我进入CS50 IDE 在这里，我已经先行一步
而在一个名为文件中声明 argv0.c以下模板。
并注意唯一 这是不同的，到目前为止
是，我已经改变了空为int ARGC ARGV串开支架，接近
托架。
并注意现在，有 没有这些括号内。
>> 有没有数。
而且没有我，或 n或任何其他字母。
我只是用 方括号现在，
对于原因，我们会来 回到一会儿就好了。
>> 而现在正是我要做的就是这一点。
如果ARGC等于等于2-- 和召回等于等号
是平等的运营商比较 左和右的平等。
这不是分配 操作者，这是
单等号，这意味着副本 从右侧向左侧的一些值。
>> 如果ARGC等于等于2，我想 比如说，printf的，你好，百分数，新的生产线，
然后再插上in--和这里的新 trick-- argv的支架1，其原因
我们再回过头来在一个时刻。
如果ARGC没有别的 等于2，你知道吗？
就让我们继续前进，像往常一样，打印 出打招呼，没有替代的世界。
>> 所以它似乎如果ARGC，这 代表论点数，等于2，
我要打印出来 你好或其他东西。
否则，默认情况下，我 要打印的hello world。
所以，这是什么意思？
>> 好吧，让我继续前进，保存 该文件，然后执行使argv0，
然后./argv0，回车。
它的世界问好。
现在，这是为什么？
>> 那么，事实证明，任何时候你 在命令行中运行一个程序，
你都尽显我们会 通常调用的参数向量。
换句话说，自动 计算机，操作系统，
是要交给你的程序 本身所有的单词列表
该人的类型在 提示，如果你
程序员想要做的 一些与该信息。
并且在这种情况下，唯一字 我在提示符下键入是./argv0。
>> 等参数的数目是 被传递到我的计划是只有一个。
换言之，参数 算，也称为ARGC
这里为整数，只是其中的一个。
一，当然不相等的两个。
所以这就是打印，世界你好。
>> 但让我借这个地方。
让我说，argv0。
然后怎么样玛丽亚？
然后按Enter键。
>> 并注意什么神奇地发生在这里。
现在，而不是世界你好，我有 改变了这个程序的行为
由GET取输入不 串或一些其它功能，
但很显然，我的命令 本身，我在原来录入。
我可以再次玩这个游戏 它改变到斯泰利奥斯，例如。
>> 现在我看到另一名仍在。
而在这里，我可以说安迪。
我可能会说Zamyla。
我们可以整天玩这个游戏， 只是不同的价值观堵漏，
只要我正好提供 两个词在提示符下，
这样ARGC，我的说法算，为2。
>> 我看到这个名字插入 printf的，每个在这里这种情况？
所以，我们现在似乎有 的表现力
采取从其他机构中的输入， 从所谓的命令行
而不必等待 直到用户运行该程序，
然后提示他或她的 使用类似的GET字符串。
>> 所以，这是什么？
的argc，再次，仅仅是一个整数， words-- arguments--数
，在所提供的用户 提示时，在终端窗口，
包括程序的名字。
因此，我们./argv0是有效的， 该程序的名字，
或如何我运行程序。
>> 这算作一个字。
所以ARGC是1。
但是，当我写斯泰利奥斯，或 岸堤，或Zamyla或玛丽亚，
这意味着参数计数为两个。
所以现在有两个词传入。
>> 和通知，我们可以继续这样的逻辑。
如果我居然说 像陈Zamyla，
全名，从而把 三个参数共，
现在它再次表示默认， 因为，当然，3不等于2。
>> 所以这样，我必须 通过argv的这个新说法访问
我们可以在技术上 叫我们想要的东西。
但按照惯例，这是 的argv和ARGC，分别为。
ARGV，参数向量，是种 用于编程的代名词
用C功能称为数组。
>> 阵列是类似的值的列表 背，背，背，背到。
换句话说，如果一个是这里在 RAM，下一个是它旁边，
和它旁边。
他们不是所有的地方。
而这后一种情况下，这里的东西 遍布在内存中的位置，
实际上可以是一个强大的功能。
但我们会回来的，我们当 说说票友的数据结构。
现在，数组只是一个 连续内存块，
每个其元素 背，背，背，背，
和大致相同的类型。
>> 所以，如果你仔细想想，从 刚才，什么是字符串？
那么，一个字符串，如Zamyla， Z-A-M-Y-L-A，是，技术上，
只是阵列。
它是一个字符数组。
>> 所以，如果我们真的得出这样的，因为我 先前做的，作为一个内存块，
事实证明，每一种 字符占用一个字节。
然后还有那个特别的 标记字符，反斜线0，
或全部八个0位，即 划定该字符串的结尾。
因此，一个字符串，它变成 出，报价引文结束的字符串，
只是chara--的阵列 烧焦作为一个实际的数据类型。
>> 而现在的argv，meanwhile-- 让我们回到节目。
ARGV，尽管我们看到这个词 这里的字符串，是不是字符串本身。
ARGV，参数向量， 是一个字符串数组。
>> 因此，正如你可以有数组 字符，你可以有较高的水平，
的strings--阵列如此，例如， 当我输入刚才./argv0
argv0，空间Z-A-M-Y-L-A，我声称， ARGV曾在它 - ./argv0两个字符串，
和Z-A-M-Y-L-A。在 换句话说，的argc为2。
这是为什么？
>> 那么，有效的，这是怎么回事 上是每个这些字符串的
是，当然，字符数组 和以前一样，它的每个字符
占用一个字节。
不要混淆实际0 在节目的标有0名，
这意味着所有80位。
和Zamyla，同时，仍 也字符数组。
>> 这样在一天结束时，它确实 看起来是这样的引擎盖下面。
但是ARGV，由大自然如何主力 作品，让我来包装这一切
成，如果你愿意，一个更大的阵列 ，如果我们稍稍高出简化
什么画面看起来喜欢和不 相当绘制规模那里，
这个阵列只有大小为2，第一次 元件，它的包含字符串，
的第二元件 其中包含的字符串。
并且，反过来，如果 一种放大每个
这些字符串的你 看到引擎盖下
是，每串是仅仅 字符数组。
>> 现在，就如同用字符串， 我们能够获得访问
在一个字符串的第i个字符 使用方括号。
同样，阵列 一般来说，我们可以
用方括号来获得 在阵列中的任何数量的字符串？
例如，让我 继续前进，做到这一点。
>> 让我继续前进，创造argv1.c， 这是一个有点不同，这一次。
相反，检查argc2的， 我要代替做到这一点。
对于int我得到0，我是少 比ARGC，我加再加，
然后这里面打印出来， ％的S，新的生产线，然后
argv的支架我。
>> 因此，换句话说，我不处理 此刻单个字符。
ARGV，所暗示这些空方 括号的名称的argv的权利，
指的argv是一个字符串数组。
和ARGC只是一个int。
>> 在这里这条线，6是 说一套i等于0。
计算所有达路， 但不包括的argc。
然后在每次迭代中， 打印出字符串。
什么字符串？
>> 第i个字符串argv中。
所以，从前我是前 用方括号
方式就可以得到第i 字符的字符串，现在
我用方括号 获得在一个数组的第i个字符串。
因此，它是一种一层 以上概念。
>> 还等什么是整齐这个 现在的程序，如果我编译argv1，
然后做./argv1，然后键入 在类似富酒吧巴兹，
这是三个默认的话，一个 计算机科学家到达任何时间
他或她需要一些占位的话， 并按下回车键，每一个的这些话，
包括程序的名称， 是argv中在第一位置，
最终被印刷一次一个。
如果我改变这一点，我说 像argv1 Zamyla陈，
我们得到了所有这三个的 也就是说，这是argv0，
argv1，argv2，因为在这种 ARGC的情况下，计数，为3。
>> 但是，什么是整齐的是，如果你明白 那argv的只是一个字符串数组，
你明白一个字符串 是一个字符数组，
我们实际上可以种使用该 方括号多次
选择一个字符串，然后选择 字符串中的字符，
潜水更深如下。
在这个例子中，让我去 前进，称之为argv2.c。
而在这个例子中，让我先走 并做following--对于int我得到0，
i小于的argc，我加 再加上，就像以前一样。
因此，在其他words--现在这个 越来越复杂的足够了。
然后我会说 遍历argv中的字符串，
作为对自己的注释。
然后我将有一个 嵌套的循环，你可能
这样做，或认为 这样做，在划痕，其中
我要说int--我 不会再使用我，
因为我不想影子，或 排序覆盖现有的我。
>> 我打算，相反，J个，因为 这是我去到的变量后，我，
当我只是想 算简单的数字。
对于j得到0--并且还，正，将要 得到的argv支架我的船尾长，
只要j是小于M， Ĵ加再加，做到以下几点。
而这里的有趣的部分。
>> 打印出一个字符和一个新的生产线， 堵漏argv中我支架，支​​架学家
好了，让我在这里补充一些意见。
遍历字符 在当前字符串，
在第i个字符串打印j个字符。
所以，现在，让我们考虑 这是什么意思的意见。
>> 遍历字符串 在argv--多少
字符串的argv，它是一个数组？
ARGC很多，所以我遍历 从i等于0到ARGC。
同时，多少个字符 是argv中的第i个字符串中？
>> 好了，得到的答案， 我只需要调用字符串长度
在当前字符串我照顾 对，这是argv的支架我。
我要去临时存储 值N，只是为了缓存目的，
记住它的效率。
然后，我会初始化J即可0， 继续下去，只要j是小于n，
并在每次迭代增量学家
>> 然后在这里，每 我的第12行评论，
打印出一个字符， 其次是一个新行，
具体的argv支架 我给我的第i个串
在argv--所以第一句话， 第二个字，第三字，等等。
和则J潜水更深，并获得 我该单词的第j个字符。
因此，实际上，你可以把 的argv作为多维的，
作为一个二维的，阵列 其中的每一个字那种长相
像这样在你的心中的 眼，每一个人物
是种组成，在 一列，是否有帮助。
>> 在现实中，当我们逗 这除了在未来数周，
这将是一个小 比这更复杂。
但是，你可真 想不到的是，就目前而言，
因为眼前这个二维 它阵列，其中一个水平
是所有的字符串。
然后，如果你在更深，你潜水 可以得到在各个字符
这里所使用这个符号在其中。
>> 那么，什么是实际效果？
让我继续前进， 使argv2--织补它。
我在这里犯了一个错误。
隐含声明 库函数斯特林。
所以，这一切的时候，它的 也许是适当的
我们正在排序整理 正是我们开始的地方。
>> 我搞砸了，隐式声明 库函数斯特林。
OK，等一下。
我记得，尤其是 因为它是在这里。
我需要包括string.h中的 这个版本的程序。
>> 让我继续前进，包括 string.h中，保存，勇往直前
并重新编译argv2。
而现在，我们开始吧，让argv2，回车。
虽然这是一个有点 神秘的第一眼，
公告称，的确， 印刷是点argv2。
>> 但是，如果我输入后有些字 提示，像argv2 Zamyla陈，
回车，也有点 神秘的第一眼。
但是，如果我们滚动回涨， ./argv2 Z-A-M-Y-L-A C-H-A-N。
因此，我们遍历每一个字。
而反过来，我们遍历 一个字中的每一个字符。
>> 现在，经过这一切， 意识到有
另外一个细节，我们已经种 中忽略这一整个时间。
我们只是挑开什么 主要的投入可以吗？
怎么样主要的输出？
>> 所有这一切的时候，我们一直 只是复制和粘贴
在主阵地字INT， 虽然你可能在网上看到，
有时在旧版本不正确 C和编译器的，他们说无效，
还是什么都没有。
但是，实际上，对于版本 的C我们使用，
C 11，或2011年，实现 它应该是i​​nt。
它应该要么是 无效或argc和argv在这里。
>> 但是，为什么INT主？
它是什么实际上返回？
那么，事实证明这一切的时候， 任何时候你已经写了一个程序的主
总是返回的东西。
但它一直这样做秘密。
>> 这东西是 INT，如第5行显示。
但是什么诠释？
嗯，有这个 约定编程，
因此，如果没有了 出了问题，一切都很好，
程序和一般功能 return--有些counterintuitively--
0。
0通常意味着一切都很好。
因此，即使你觉得 它在很多情况下是假的，
它实际上通常意味着一件好事
>> 同时，如果一个程序返回1， 或负1，或5，或负42
或任何非0的值， 这通常意味着
那出了问题。
事实上，在你自己的Mac或PC， 你可能已经看到实际
的错误消息，由此 说了什么或其他错误
代码负42，或错误代码 23，或者类似的东西。
这个数字通常是只是一个提示 给程序员，或公司
该取得的软件， 什么地方出了错，为什么，
使他们可以通过看 他们的文档或代码，
并找出什么 错误实际上意味着。
它一般不 对我们有用的最终用户。
>> 但是，当主返回0，一切都很好。
如果你不指定 什么主要应返回，
它只是会自动 你返回0。
但返回的东西 否则实际上是有用的。
>> 在这最后的节目，让我 继续前进，把这个exit.c中，
并介绍了去年今天的 主题，已知的作为错误代码。
让我继续前进，包括我们 熟悉的文件往上顶，这样做主要INT。
而这个时候，让我们做INT ARGC， 字符串的argv，并与我的支架
暗示它的数组中为止。
然后让我只是做一个全面的检查。
这个时候，如果ARGC不 等于2，那么你知道吗？
算了吧。
我会说，嘿，用户， 你缺少命令行参数
反斜杠ñ。
>> 然后就是这样。
我想退出。
我要先发制人， 过早真的，回报
东西比1号等。
转到价值第一 错误可能发生1。
如果你有一些其他错误 可能出现的情况，
你可能会说回报2或3回，或 甚至负1或负2。
>> 这些只是退出代码 是，一般地，
唯一有用给程序员，或 公司认为航运该软件。
但事实上，它是 不为0是非常重要的。
所以，如果在这个方案，我想 保证这个程序只
工作，如果用户提供了我 有两个参数计数，
程序的名字，以及其他一些 总之，我可以执行如下之多，
骂与printf的话说用户， 缺少命令行参数，
返回1。
这只会立即 退出程序。
>> 只有当ARGC等于2，我们将踏踏实实 在这里，在这一点上，我会说，
你好％的S，反斜线N，argv1。
换句话说，我 argv的0后不会去，
这是节目的只是名称。
我想打印出来打招呼，逗号， 第二个字，人键入。
在这种情况下上 13号线，一切都很好。
>> 我知道的argc为2 逻辑上这个节目。
我要继续前进，返回0。
顺便说一句，请记住， 这是划痕也是如此。
>> 从逻辑上讲，我可以这样做 和封装这些行
在这里这个else子句的代码。
但是，这样的 不必要的缩进我的代码。
我想使超 显然，不管是什么，
默认情况下，你好 事情会得到印，
只要用户合作。
>> 所以这是很常见的使用 一个条件，只是一个如果，
捕捉一些错误 情况，然后退出。
然后，只要一切 好了，没有一个东西，
只是有码 外，如果，因为它是
相当于在这 特殊情况下，逻辑上。
所以我返回0，只是 明确表示一切都很好。
>> 如果我省略了返回0时，它会 自动假设我。
但现在，我要回 之一的至少这种情况下，
我要去，好措施和 清楚起见，在这种情况下返回0。
所以，现在让我继续前进，使退出， 这是一个完美的SEGUE见好就收。
>> 但要退出，让我去 继续做./exit，回车。
该程序大喊我， 缺少命令行参数。
OK，让我配合。
>> 让我来代替做./exit，大卫，回车。
而现在它说，你好大卫。
你通常不会看到这一点。
>> 但事实证明，有一个 在Linux中特殊的方式来实际看看
什么退出代码的程序退出。
有时在图形 世界像的Mac OS或Windows，
你只看到这些数字时 错误消息在屏幕上弹出
和编程 显示了该号码。
但是，如果我们想看到什么错误 消息是，我们可以做到这一点这里 -
所以./exit，输入，打印 缺少命令行参数。
>> 如果我现在做的回声$？这是 可笑的神秘期待。
但是$？
是神奇的咒语 ，说，哎，电脑，
告诉我以前的 程序的退出代码了。
我敲回车。
我看到1，因为这是我 告诉我的主要功能返回。
>> 同时，如果我这样做./exit大卫 并按下回车键，我明白了，你好大卫。
如果我现在做的回声$？我看你好0。
所以这实际上 是有价值的信息
在调试器的情况下，不那么 多，你的人，会照顾。
但是，调试器和其他 程序，我们将利用这个学期
会经常看这个数字， 尽管这有点藏起来
除非你去找吧， 确定是否一个程序的
执行是正确或不正确的。
>> 所以说给我们带来 此，在一天结束。
今天，我们开始通过查看 调试，并依次在课程
本身，然后更有趣的是， 技术上下方的引擎盖
在什么字符串，它持续 本周我们只是想当然，
当然把他们 理所当然的划痕。
>> 然后，我们看我们如何可以访问 在一个字符串的各个字符，
然后又拿起一个较高的水平 看待事物，寻求如何well--
如果我们想获得个别 在这样的结构列表中的元素，
我们不能做到这一点与多个字符串？
我们可以用命令行参数。
但是，这幅画在这里只是盒 是示范这种总体思路
的阵列，或列表，或者一个矢量。
并根据 的背景下，所有的这些话
意思是略有不同的事情。
因此，在C，我们只打算 谈论一个数组。
而一个数组是一大块 内存，每个人的
元件是连续的，背部， 背，背，背到。
>> 与这些元素是，一般地， 相同的数据类型，字符，
人品，人品，性格，或 字符串，字符串，字符串，字符串或者int
INT，INT，不管它是什么 我们试图商店。
但在一天结束时，这是 它看起来像什么概念。
你把你的 计算机的存储器或RAM中。
而你刻出来成 相同尺寸的盒，所有这些都
回来了，要背， 背，背这个样子。
>> 什么是关于好的 这个想法和事实
我们能够表达这样的值 与第一我们的数据结构的
在课堂上，意味着我们可以开始 解决与代码的问题
即0的一周里那么直观。
你还记得手机 书实施例，其中
我们使用了分而治之， 或二进制搜索算法，
通过一个整体进行筛选 一堆的名称和号码。
但是，我们认为，召回，这是 电话本已经被排序，
别人已经 想通out--给出的名单
和numbers--如何按字母顺序排列它们。
而现在，在C我们， 也有能力
打好东西出来，不 物理在电话簿
但几乎在一台电脑的 记忆，我们将能够在下周
到this--第一次推出 在一个array--我们的数据结构的
但更重要的是，实际的计算机 科学的算法实现
在代码，与我们可以存储 在这样的结构数据，
然后开始操纵它， 真正解决问题呢，
并建立最重要的是， 最终，在C程序中，
在Python，JavaScript中， 查询SQL数据库？
>> 我们将看到所有这些 不同的想法互锁。
但现在，记得 我们今天介绍域
是这个东西在这里，和 世界加密的。
而接下来的问题，你自己之间 将解决是密码学的艺术，
加扰和解扰 信息，和加密
和破译的文字， 并假定最终
你现在知道什么 是引擎盖下
所以，当你看到或收到 这样的消息，你
你自己可以破译它。
所有这一切，以及更多下一次。
>> [视频回放]
>> -Mover刚到。
我要去拜访 他的大学教授。
是的。
你好。
是你。
等待！
大卫。
我只是想图 出了什么事给你。
请，什么事情都可能帮助。
你是他的大学 室友，不是吗？
你跟他的时候在那里 他完成了CS50的项目？
>> [音乐]
>> - 那是CS50。
>> 我喜欢这个地方。
>> -Eat起来。
我们走出去的企业。
>> [结束播放]