[Powered by Google Translate] 第习题集2:黑客版 罗布·波顿,美国哈佛大学 这是CS50。 CS50.TV 所以,我抢。我是一个高级的柯克兰。这是我第三年TFing CS50。 这是第一次,我们正在从传统的讲座式的部分, 我们只是在课堂上发生了什么事,然后你们问的问题,这种审查 现在到了很多问题为基础的,在这里我们使用空间,以及 - 哦,这样的想法是链接,我送你去,那么你就在我的空间。 任何人都拥有一台笔记本电脑呢?好吧。 因此,我们将使用这个,我们将做的问题,住在节 和讨论,搞清楚什么是错的 ,我可能会拉你的代码,和我讨论您的想法。 所以,有没有人有困难吗? 您可以就在旁边聊天,我不知道我们是否还能有原因的。 现在,像以前supersection,如果你在这个类,你知道这是什么。 在所有的P组有将这些部分。 因此,P-集合,规格,我想你已经看到了1组P-。 但我们可以看看我们今天要为2组P-。 你会看到一条条的问题。 因此,这将是在所有的P-集合,将是一个部分的问题。 到目前为止,我们已经表示,“考虑到这是一个练习的机会。” 你不会被要求提交这一计划。 我们的想法是,这些都是应该种帮助您开始使用的问题集。 我想对黑客版,很多人都应该是新的,有趣的东西需要学习。 他们可能不是直接适用问题集。 而现在,我们没有您提交的,但在理论上, 后面的习题集,您可以提交他们,这样的话你可以第 或观看一节得到的答案,或者你可以让他们在自己的 如果你感觉不一样,享受着我的存在。 所以 - 我想这是第一个。 哦。此外,根据这些条文的问题,我们也有提问的短裤。 所以我想,从理论上讲,你应该看这些,才第, 但它的罚款,如果你不这样做,反正我们就去了他们。 因此,我们可以开始与这些“如何做一个while循环do-whil​​e循环从不同吗? 如果是后者尤其有用吗?“ 因此,任何人有任何 - ? [学生]:do-whil​​e循环将永远都至少执行一次。 是。所以这是其中的差别。 while循环 - 我会在这里只是做 - while循环中,我们具备的条件 就在这里,而一个做一段时间,你不会有一个条件,直到我们得到了这里。 所以,当你的程序执行,并得到while循环, 立即检查,如果条件为真。 如果这个条件是不正确的,它会跳过整个循环。 -whil​​e循环中,程序执行时,它得到的“。” 在这一点上没有任何反应,只是继续执行。 然后,当它击中“的同时,”如果条件为真时,它会循环备份并再次这样做 和一次又一次,直到条件是不正确的,然后正好落在通过。 因此,所不同的是,这从一开始就可以跳过。 这必然执行一次,然后可以执行更多的时间,如果条件仍然是正确的。 因此while循环只会做一次,或者 - 在while循环 - 我们可能不会在所有需要做的是, 因为一旦我们得到它,如果条件为假,我们就跳过它。 而做while循环中,我们将执行一次,一定。 然后,当我们的条件,我们检查它是否是真还是假。 如果这是真的,我们会再次做它,如果它是假的,我们就继续。 因此,当后者尤其有用吗? 所以,我可以说,在整个的4年,3年,无论 我一直在编程,我使用了这一点,如,根据10倍。 也可能5年,他们在CS50当我们要介绍的do-whil​​e循环。 因此,当你使用do-whil​​e循环? 当是 - 是吗? [学生]:当你试图获取用户输入的,或者是你要检查 - 是啊。因此,do-whil​​e循环,用户输入的是大的。 这就是为什么习题集上的第一对夫妇,当你要问的用户,喜欢, “给我一个字符串,”你不能继续下去,直到你得到的字符串。 所以你一定要问的字符串至少一次。 但如果他们回答什么坏事,那么你需要循环回来再问。 但以外的其他用户输入,这是非常罕见的,我遇到的情况 在这里我要循环“至少一次”,但可能更多。 问题或 - ?有没有人用一个do-whil​​e循环在其他地方吗? 好吧。因此,下一个是,“这是什么未声明的标识符 通常输出铛?“ 那么,什么样的代码,我可以写'未声明的标识符?“ [学生]:X = 2? 因此,我们可以尝试在这里,X = 2。 我们将执行这个 - 哦,我没有点击它。所以,在这里我们得到 - 所有权利。 “使用未声明的标识符x”。 所以这是未声明的标识符,变量。 它会频繁调用的变量标识符。 因此,它可能不知道它实际上是一个变量,它不知道它是什么。 所以这是一个标识符。 那么,为什么它未申报的吗?是啊。 所以要明确的术语,声明一个变量 当你说“诠释x”或“串y,”不管。 该变量的初始化或赋值的变量, 无论何时说“X = 2”。 因此,我们可以在不同的步骤,X,X = 2,直到 - 在这里,我们可以有一大堆的东西 - 但直到这一行发生,X仍然是未初始化的,但它已被宣布。 因此,我们可以明显地做1号线,现在我们的声明和初始化。 有问题吗? 最后,“为什么是恺撒密码不是很安全吗?” 因此,首先,没有人想说的恺撒密码是什么? [学生]:恺撒密码是你映射,你改变每一个字母, 一定数量的字母走了过来,和移动过去,和它不是很安全,因为 只有26个可能的选项,你只需要尝试的人,直到你得到各1。 哦。所以,我要重复? 恺撒密码,it's - 我的意思是,你会与它打交道的问题,你 - 我想问题集,这不是对黑客版的标准版。 因此,在标准版的问题集,你得到这样的消息:“你好,世界” 你也有这样的数字6,你把该消息,和每个人的性格, 你转​​动它在字母表中的6个位置。 因此,'h'的在hello会成为H-I-j的-的k-升米 - 正。 因此,第一个字母为N。我们做同样的事情,以e。 如果我们有一个喜欢的,z或什么的,然后我们转回到左右至“A”。 但每个字符得到循环后6个字符的字母,这是不是很安全 因为有可能性有多少种方法,你可以换一个单一的字母只有26个。 所以,你可以尝试26,据推测,足够长的消息, 这些可能的26件事将是清晰的, 和清晰的将是原始邮件。 因此,它不是什么都加密的一个很好的方式。 那些短裤无关,“是什么功能?” 那么,什么是函数?是。 [学生]:这就像一个单独的一段代码,你可以打电话去,然后得到返回值的任何。 是啊。所以我会回答也回答下 - 或重复,也只是回答下一个。 您可以使用功能,而不是只是复制和粘贴代码,并且再次。 只要采取的代码,把它变成一个机能的,然后你就可以调用该函数 只要你已拷贝和粘贴。 因此,功能是有用的。 所以,现在我们要做的实际问题。 第一个。的第一个这样的想法是,你把它传递一个字符串,也不管 - 它说所有的小写?这并不是说所有的小写字母。 因此,该消息可以是任何东西, - 哦,不。它的作用。 “为了简单起见,你可以假设用户将只能输入小写字母和空格。” 所以我们把它传递消息只有小写字母,然后我们轮流 - 我们改变资本和小写之间的字符串大小写,交流。 所以,我们给你第二次,甚至潜入的问题, 我们需要做的第一件事是什么? 哦,我只要按一下呢?哦,我只是在这里点击一封电子邮件。 因此,我们需要做的第一件事情 - 我在错误的吗? 这是这其中的一部分吗? 不,这是仍然在那里,虽然。 好了,还在这里。 现在,我们可以不承担 - ?是。在这里,我们不能想当然地认为这只是小写字母和空格。 所以,现在,我们要处理的事实,字母可以是任何我们希望他们。 因此,我们想要做的第一件事情是刚刚得到的消息。 我们只需要得到一个字符串,字符串s = GetString的,没问题。 现在这个问题,有一对夫妇的方法做这件事。 但是,我们将要在这里使用按位运算符。 有没有人无论是在supersection, 什么的,不知道按位运算符是什么? 或者它们如何与ASCII以任何方式? [学生]:我是不在supersection,但我知道什么是位运算符。 好吧。于是我也没有去他们的基础知识,但我会解释 我们将要在这里使用。 所以'A':大写字母A的二进制表示,这个数字是65。 我只是去看看 - 41将是01000001。 所以,这应该是十进制的65,所以这是二进制表示的字符大写的A 现在,在二进制表示的字符小写'a'的 是怎么回事,几乎是同样的事情。 - 6,是的。这是正确的。 所以二进制大写的A,二进制小写的“。 所以注意到之间的差异和'A',这是单位。 而这恰好是32位,该位代表32号。 这是有道理的,因为A是65,“A”是97。 它们之间的差值是32。 所以,现在我们知道,我们可以转换,采取了从A到'A' 按位“或”, - ,看起来像一个1。 这是一个按位OR,和00100000,这会给我们的。“ 而且,我们可以从'a'到一个AND运算 11,0,11111在那个地方。 因此,这将给予我们什么'一',但取消了单独的位, 所以我们不得不01000001,我不知道我算。 但这种技术的按位“或”资本为小写, AND运算以小写的资本是不排斥为A。 所有的字母,K,Z与Ž,与k 所有的人都只是要本单位不同。 所以你可以用它来从任意小写字母的任何大写字母,反之亦然。 好吧。所以,一个简​​单的方法得到 - 而不必 写出任何1011111是 - 表示此数的一个简单的方法,这是不是一个 ,我去在supersection的,但符号(〜)是另一种按位运算符。 〜做的是,它看起来位表示。 让我们任意数量。 这仅仅是一些二进制数,和什么〜是翻转的所有位。 所以这是一个1,现在是0,这是一个0,现在为1,010100。 所以,这一切〜。所以32的要数 - 摆脱了这一点 - 所以32的要数00100000,等〜这将是 这个数字,在这里,我相与'一'。 是否每个人都看到了吗?这是很常见的,比如当你想弄清楚 后来的事,我们可能会看到,当我们想看看 - 我们想要的一切,每一个位组除1 〜你会做的,我们不想设置位。 因此,我们不希望32位集,所以我们〜32。 好吧。因此,我们可以使用所有这些在这里。 好,那么它的罚款,如果你不这样做,我们将慢慢地走一起, 或步行,所以 - 通过这个。穿过。 因此,我们有,我们希望我们的字符串,该字符串中的每个字符循环和做东西给它。 那么,我们如何循环一个字符串?我们应该用什么呢? 我不打算在这里做。是啊。 所以,我有我的迭代器,他说,但我怎么知道有多少个字符的字符串? STRLEN(S),然后我+ +。 所以我在这里所做的是不是最好的方式做事情。 有谁知道为什么吗? 因为你要检查的字符串每一次的语言。 因此,我们将要移动的strlen,我可以说,在这里,长度= strlen的(), ,然后我<长度,和的情况下,你没有看到它之前, 我还可以做INT I = 0,长度= strlen的()。 因此,这是比较可取的,因为现在我已经限制的范围 的可变长度只是这个'for'循环,而不是声明之前 ,它总是存在的情况下,你没赶上为什么这是很糟糕的, 为什么原来的是坏,it's的 - 在for循环的开始。 我检查了条件。 I > 1位。 它可以是1位以上,只要该位置以下的所有的比特是相同的。 因此,我们需要至少26个字符 - 或者,有26个字符。 因此,我们需要至少26个数字代表的不同 - A和'a'的是至少26,之间的差异 否则我们将不会代表所有的资本。 这意味着,如果我们从1开始,它要使用所有这些位, 所有的这些前5位,代表一切到Z 这就是为什么下位,或该位,下位的选择区分A'和'一个是一个。“ 这也是为什么,在ASCII表中,有5个大写字母,小写字母符号分离。 由于这些符号,额外带来32是它们之间的区别。 [学生]:因此,我们可以这样做,因为ASCII是这样设计的。 是。但是,ASCII - 差异也可能是这两位。 一样,如果A是10000001,和'a'11100001 - 我忘了,什么都好。 但是,如果它是,那么我们仍然可以使用'A' - A. 这是刚才和'a'是这2位之间的差异。 我认为这是写48。它是32 + 64?我认为它是什么? 它仍然是2位,每一个字符一样,Z和Z,K和k, 他们仍然有完全相同的位设置除了这2位。 因此,只要这是真实的,不管,如果我们使用的是ASCII或其他一些系统, 只要有唯一的一组不同的每个字符的比特数, 然后,工作正常。 这只是32成立,因为它是第一个,我们可能使用。 >>酷。 我倾向于选择,如果你还没有看到,如果块是只有一行, 你可以摆脱的花括号,所以我倾向于选择这样做。 另外,你知道我们可以做这样的事情则s [i] + = 1? 你也可以做的[I]位= 32。 和按位OR = 32。 此外,数模2 == 0。 因此请记住 - 我不会写 - 任何非零的值是真实的,0是错误的。 因此,“如果数模2 == 0”是一样说:“如果没有数模2。 我可能会正好相反的线条和说,“如果数模2, OR 1,还有什么“与”1“,所以,我没有需要”不。“ 但是,这一样好。 而且,我还能做什么呢? 你可以将它们组合,如果你想与三元,但后来那只是使事情变得混乱, 可能更难以阅读,因此,我们将无法做到这一点。 任何人有任何其他建议吗? 是要求所有的问题?哦,是的。 因此,摆脱这些空行,现在我们要打印F,%s的一个字符串, 我们将打印的F,S。 现在,让我们来运行它。我做了什么事? 这是一个\“,我想一个n。 好吧。现在我们来运行它。它可能会骂我。 STRLEN是在string.h。 因此,这是铛是美好的事情,它告诉你它在, 而不是GCC,只是说,“嘿,你忘了的东西,我不知道那是什么。” 但是,这会告诉我,“你的意思是包括string.h中。” 所以我也没有提示任何东西,所以它什么也不说。 不过,我们会做他们的榜样,“感谢4”添加“。 这看起来是对的。万岁。 所以回到你的主,我几乎从来没有做到这一点。 它是可选的。主要是它的唯一功能是可选的。 如果你不返回任何东西,从主,假设你的意思是返回0。 有问题吗? 好吧。所以,现在的第二个问题。 “回想一下从第2周的第二场演讲,交换2个变量的值传递 这2个变量的功能(即使称为交换)不完全相同的工作,至少在没有“指针”。“ 而忽略直到我们得到的指针。 我们要交换两个变量,我们不使用一个函数来做到这一点。 我们仍然要做到这一点,主像它说。 但是,使用这2个变量,我们不希望使用一个临时变量。 有2种方法来做到这一点。 使用传统的二元运算符,你可以这样做。 因此,没有人知道一个快速和肮脏的方式做到这一点? 实际上,这可能需要一分钟的思考。如果我有 - 我将设置问题,如他们的要求。所以,如果我有2个变量,A,这是仅仅是一个整数 他们给了我,和变量B,这是我的另一个整数。 所以,如果我有这2个变量,现在我要来交换他们。 传统的,使用常规的二元运算符,我的意思是,如+, - ,÷。 不按位运算符作用于二进制。 因此,使用 - ,+,÷,和所有那些。 我们可以做这样的事情交换A = A + B,和B = A - B,A = A - B。 因此,合理性检查,然后我们将看到为什么这样的作品。 比方说,= 7,b = 3的,则a + b时,将是10。 因此,我们现在设置= 10,然后我们做B = A - B。 因此,我们正在做的B = A - B,这将是7,和b = - B再次 或a = A - B。这是会是10 - 7,它为3。 正确,所以,现在,'a'的为7,b是3,现在b是7和'a'是3。 因此,那种是有道理的,'a'是2号的组合。 在这一点上,“A”的组合,然后我们减去原来的b, 然后我们减去了什么是原来的“一”。 但是,这并不适用于所有的数字。 要看到这一点,让我们考虑一个系统,所以我们通常认为的32位整数。 让我们携手的东西,只有4位。 我希望拿出一个很好的例子,现在。 所以,我知道,这将是容易的。 比方说,我们的2号为1111和1111,所以我们现在是在二进制。 在实际的小数,如果你要觉得这样的说法,A = 15,B = 15。 因此,我们预期,我们交换后,他们 - 他们甚至必须是相同的数字, 但我做了这样的看法。 让我们使它们不相同的数字。让我们做1111和0001。 因此,一个= 15和b = 1。 我们交换之后,我们希望'一',是1和B为15。 因此,我们的第一步是A = A + B。 我们的人数只有4位,所以“一”,这是1111 +,这是0001, 即将结束为10000,但我们只有4位。 所以,现在为a = 0。 现在,我们要设置B = A - B - 实际上,这仍然工作完美。 A = A - B - 让我们来看看,如果这个工程很完美。 因此,然后b = 0 - 1,这将仍然是15,并且然后= - B,这将是1。 也许这样做的工作。 我觉得有一个原因,它不使用常规的工作。 好了,这样的假设,这是行不通的,与普通的二进制运算, 我会看 - 我将谷歌,看看是否是真实的。 因此,我们要做到这一点使用按位运算符,和这里的线索是XOR。 因此,引入XOR(^),如果你没有看到它。 再次,这是位运算符,所以它的作用有点位,it's - 如果您有位0和位1,那么这将是1。 如果你有位1和0,这将是1,你的位0和0这将是0, ,如果你有1位和第1,这将是0。 因此,它是或。如果任一的位都为真时,它是1,但不像OR,它不能是两个位都为真。 或将是1,XOR将是0。 因此,我们会想使用XOR这里的。 一分钟想想吧,我去谷歌。 那么,你可以不读了,我目前的XOR交换算法。 希望这将解释为什么我不能做到的 - 这也正是我们只是做了该算法。 我还是不明白为什么 - 我一定只是选择了一个坏榜样, 但这种情况下,'a'的发生成为0后,得到5位,所以现在“a”为0, 这就是被称为“整数溢出”。 根据维基百科,“不同的是XOR交换,这种变化需要,它采用的一些方法 保证是x + y不会导致整数溢出。“ 因此,这确实有问题,这是整数溢出,但我做错了什么。 我不太肯定。我会尽量拿出另一个。 [学生]:那么,是不是整数溢出,当你试图把一些在​​那里 大于您已经分配的比特量? 是啊。我们有4位。 That's - 我们有4位,然后我们尝试把它加1,所以我们结束了5位。 但在第五位只是被切断,是的。 它实际上可能 - [学生]:那你扔一个错误,或者做什么才能 - 会抛出一个错误吗? 号,所以有没有错误。当你得到的装配水平,一个特殊的位 地方是说,有一个溢出,但在C你种不处理。 实际上,你可以不处理它,除非你使用特殊的汇编指令C. 让我们想想XOR交换。 我认为维基百科的文章可能也一直在说 - 因此,它也带来了模运算,所以我想我是,从理论上讲,这样做的模块化算术 当我说,0 - 1再次是15。 所以,实际上可能 - 定期的处理器,它0 - 1 = 15。 因为我们结束了,我们在0减1,所以它只是绕回大约为1111。 因此,该算法实际工作中,在A + B,A - B,B - A,这可能是罚款。 但还有一些处理器,不这样做,所以它不会在这些特定的罚款。 XOR交换将处理器的限制。好吧。 我们的想法是,它应该是一样的,虽然。 如果我们使用XOR以某种方式获得的信息都为1的变量, 然后拉出单个变量的信息。 因此,任何人有想法/答案吗? [学生回答,不知所云] 因此,这应该工作,而且,XOR是可交换的。 无论2号的顺序发生在这里, 这样的结果将是相同的。 因此,一个^ b是B ^一。 你可能也看到了这个写成^ = B,B ^ =,^ = B再次。 因此,这是正确的,为什么这个工程,认为位。 使用一个很小的数字,比方说,11001,01100。 因此,这是'a',这是B。 因此,一个^ = B。 我们要在'A'=的XOR这些东西的。 因此,1 ^ 0 1; 1 ^ 1是0; 0 ^ 1是1,0 ^ 0是0; 1 ^ 0是1。 所以,“一”,如果你看的十进制数,它会是 - 你不会看到之间的关系,原有的“a”和新的“一”, 但看着位,'A'是现在像一个网状的信息 原''和原来的b。 因此,如果我们采取B ^,我们看到,我们最终会在原有的“一”。 如果我们把原来的“一个”新的“,”我们看到,我们在原来的B。 所以(^)^ B =原来的“一”。 (^)^ =原来的b。 - 这是什么XOR本身的另一种方式是始终为0。 所以1101 ^ 1101,所有的位都将是相同的。 因此,永远不会是一个的情况下,其中1为0且另一方为1。 因此,这是0000。 与此相同的。 (^)^ b是一样^(B ^)。 (^ B)为0; ^ 0的只是将“一”,因为所有的位都为0。 因此,唯一的,都将是其中'A'原本是1 - 的。 同样的想法在这里,我敢肯定,这也是交换。 是啊。我是说在此之前,它是交换的。 ^','和它的关联,所以现在(B ^)^。 我们可以做B ^(^)。 因此,我们再次与原来的b。 因此,“a”为现在的'a'和b的组合在一起。 使用我们的新组合“”我们说B =组合'A'^原来的b,我们原来的'。“ =组合'A'^新的B,这是原来的 - 这是现在什么是'A'或B。 这种情况下,这是在这里。这是老B = B,。 所以,现在一切都恢复的交换顺序。 如果我们确实看着位,B = ^ B,XOR这些, 的答案是这样的,那么A = A ^ b是异或这2个的答案是这样的。 有问题吗?好吧。因此,最后一个是有点明显更加困难。 [学生]:我觉得他有一个关于它的问题。哦,对不起。 [学生]:实际上更快?如果您使用此XOR,或者是如果你声明一个新的变量? 那么,什么是实际上是更快,声明一个新的变量或使用XOR交换? 答案是,在所有的可能性,一个临时变量。 这是因为一旦它的编译 - 所以在装配水平, 有没有这样的东西作为局部变量或临时变量或任何东西。 他们只是想 - 有记忆,有寄存器。 寄存器里的东西都在积极发生。 您在内存中不添加两件事情,你添加在寄存器中的两件事情。 你带的东西从内存到寄存器中,然后将它们添加, 然后你可能把它们放回内存,但所有的动作都发生在寄存器中。 因此,当你使用临时变量的方法,通常会发生什么 这些数字已经在寄存器中。 然后,从这个角度上,在你交换他们, 它会刚开始使用其他寄存器。 任何地方,你一直在使用B,它会使用的寄存器,它已经存储的一个。“ 因此,它并不需要做任何事情,其实做掉。是吗? [学生]:但是,这也需要更多的内存,对不对? 如果需要存储,临时变量,它只会占用更多的内存。 就像如果你以后再次使用该临时变量的地方, - 或你指定的东西,临时变量。 因此,如果在任何点在时间','b在温度有不同的值或东西, 那么它会在内存中有不同的位置,但它是真实的, 还有很多地方将只存在于寄存器变量。 在这种情况下,它从来没有装入内存,所以你永远不会浪费内存。 好吧。最后一个问题是多一点。 所以在这里,在这CS50设备,是字典。 这样做的原因是因为[B66是一个拼写检查器,你会写? 使用哈希表或者尝试一些数据结构。 你要编写一个拼写检查器,你将要使用这本词典要做到这一点。 但对于这个问题,我们只是去看看看,如果一个字在字典中。 因此,一些数据结构中,而不是存储整个字典 在整个文件中,然后再寻找是否有任何的拼写错误, 我们只是想找到1个字。因此,我们可以扫描整个字典 如果我们永远也找不到这个词在整个字典,那么它是不是在那里。 如果我们扫描整个字典,就看见了这个词的话,我们是很好的,我们发现了它。 它说,在这里,我们要开始寻找C的文件处理功能, 因为我们想读的字典, 但我会给出提示,在这里,你就应该想到的功能。 我把它们写空间上。 因此,主要的,你想看看是F打开,然后,不可避免地,F封闭, 这会在你的程序的结束,和f扫描f。 你也可以使用F读,但你可能不希望 因为那 - 你不结束需要,。 F扫描f是什么,你要使用扫描整个字典。 所以,你需要编写的解决方案,只是尝试和喜欢伪代码的方式 一个解决方案,然后我们将讨论这个问题。 而实际上,因为我已经给你的这些,如果你去到任何终端或设备的外壳, 我想 - 我通常是 - 如果你还没有看到,我不知道,如果你没有在课堂上, 但是,在几乎所有功能的人,所以该名男子的网页,是非常有用的。 所以,我能做的,喜欢的,曼F,扫描f。 这是现在的的扫描F系列的功能的信息有关。 我也可以做男人F,打开,那将让我的细节。 因此,如果你知道你是什么功能,或者你正在阅读的代码 和你看到一些功能,你会说,“这是什么做的?” 正直的人,函数的名称。 奇怪的例子,你可能会说有一对夫妇 等等。男子2,函数名,或人为3,函数名, 但你只有做到这一点,人类如果函数名不会发生在工作的第一次。 [学生]:所以我阅读的手册页开放,但我仍然困惑于如何使用它的程序。 好吧。很多的手册页不到有帮助的。 如果你已经知道他们做了什么,他们更多的帮助 然后你只需要记住的参数或东西的顺序。 或者,他们可以给你的一般概述,但他们中的一些是非常热烈。 如F扫描f。它为您提供了所有这些功能的信息, 和1号线在这里发生说,“F扫描f读取的字符串或流。” 但是,F打开。那么,我们将如何使用f? 这个想法的一个程序,它需要做的文件I / O, 你首先需要打开该文件,你想要做的事情,不可避免的是, 从该文件中读的东西,他们做的东西。 F打开是我们用什么来打开该文件。 我们得到的东西回来,所以我们要打开的文件,它为我们提供了 - 在这里“/用户/共享/ dict / words中说。” 这是我们要打开的文件,我们想打开它 - 我们必须明确地指定我们是否要打开它来读取或如果我们想打开它来写。 有一对夫妇的组合之类的东西,但我们要打开阅读。 我们希望从文件中读取。 所以,这是什么回报呢?它返回一个文件星号(*), 我就显示所有的变量f,所以*, 再次,它是一个指针,但我们不希望处理指针。 你可以认为F,F是现在要使用你的变量来表示该文件。 所以,如果你想从文件中读取的,你看,从f。 如果你想关闭文件,关闭F。 因此,在程序结束时,我们不可避免地要关闭的文件,我们应该怎么办? 我们要关闭F。 所以,现在的最后一个文件,我们将要使用的功能是扫描F,F扫描f。 是什么做的是,它会扫描过的文件寻找一个模式来匹配。 在这里的手册页,我们看到的诠释f扫描f,忽略现在的返回值。 第一个参数是文件*流,因此,我们将要通过的第一个参数为f。 我们在F扫描。 第二个参数是一个格式字符串。 我会给你一个格式字符串现在。 我认为我们碰巧说,127S \ n这是不必要的,很多。 格式字符串是什么,这个想法是你能想到的扫描相反的打印f f。 所以,印刷F,印刷f的也可以使用这种类型的格式参数, 但在印刷f我们正在做的是 - 让我们来看看在同等。 所以打印楼,其实也有f打印f,其中第一个参数为f。 当您打印F,我们可以这样说,“打印127S \ n”,那么,如果我们把它传递了一些字符串, 这将打印字符串,然后一个新的生产线。 127个手段,我敢肯定,但我从来没有限制自己, 你甚至不需要说'127'在打印F, 但它的意思是打印前127个字符。 因此,我敢肯定是这样的话。你可以谷歌。 但我几乎可以肯定,这意味着在未来的一。 因此,这是前127个字符,打印一个新行。 F扫描F现在,而不是在看一个变量,并打印出来, 它会看一些字符串,并将其存储到变量的模式。 让实际使用扫描f在一个不同的实施例。 因此,让我们说我们有一些int x = 4时, 我们要创建一个字符串 - 要创建的字符串 这是喜欢,这会更晚, 的东西就像4.JPG。 所以这可能是一个程序,你将不得不和计数器, 总结对付我,你要保存的一组图像。 所以,你要保存i.jpg,我是你的循环迭代。 那么,如何才能使此字符串,JPEG? 如果你想打印4.JPG,我们可以说,印刷F,%D.JPG, 然后它会打印,JPEG。 但是,如果我们要保存的字符串4.JPG,我们使用扫描f。 所以字符串s - 其实我们不能做到 - 字符,char类型,让我们去100。 所以,我只是声明了一些阵列100个字符, 而这正是我们不可避免地将要存储的JPEG中。 因此,我们要使用扫描f,格式,我们怎么会说%D.JPG 为了打印4.JPG,这样的格式是怎么回事是%D.JPG。 因此,格式的是的%D.JPG,我们要替换%d是x, 现在我们需要将该字符串存储的地方。 我们要去的地方来存储这些字符串数组s。 所以在这行代码,S,如果我们打印F,%s的变量s, 它要打印4.JPG。 所以f的扫描扫描f,f是相同的,但现在它在这个文件 什么存储在s。 这将是最后一个参数。 我们要存储 - 根据格式,尝试下面的“扫描功能扫描的F系列。 如果有任何存储的位置点,您可能会返回 - “ 不,我们可能是件好事。让我想到的第二个。 所以扫描 - f不的功能做,到底是什么呢? 因此,扫描f是不会采取一个整数,做点jpg文件。 它是怎么回事为[曼波斯]。 保存字符串int int变量C. 这是什么变量,这是什么功能叫什么名字? 是。 That's - 是的。所以我定义你之前的印刷f, - 更有道理,所以我说,这是更像打印f。 扫描f是种像打印f,但f是的打印扫描到它 和替换变量并存储在一个字符串中。 而不是打印的,它存储在一个字符串。 所以,完全忽略。您仍然可以认为像印刷f格式说明符。 所以,现在,如果我们想要做的4.JPG的事情,我们会做的印刷f,x的这个。 所以扫描f是做什么 - 什么是你的问题又如何呢? [学生]:我们试图在这里做什么,我只是困惑 与JPEG。你能解释更多的时间吗? 因此,这是 - 这是减少到f扫描F现在希望,将比分扳成在某种方式的相应和。 但我最初打算显示的是 - 这其实是直接相关的这些[? F5] 你将要使用的印刷f,在那里,说我们有100个图像, 和你想读的图像1.JPG 2.JPG,3.JPG。 因此,为了做到这一点,你需要f开,然后你要传递的字符串,你要打开。 因此,我们想打开的1.JPG;为了创建的字符串是1.JPG 我们做的印刷f的%D.JPG,我们没有为int i = 0。 我40岁时,我+ +。 所以的印刷的F%D.JPG的我。 因此,此行后,变量或数组s要1.JPG。 或者,0.JPG,1.JPG 2.JPG。因此,我们可以打开,阅读,每幅图像。 所以这是的打印f做。你看什么的打印f是现在做的吗? [学生]:好了,所以它 - 它创建了一个字符串,something.jpg,然后将它保存下来。 是。它创造 - 这是另一种格式的字符串,就像扫描f和印刷f, 将所有的变量的第二个参数,可能是s,而不是我。 也许 - 我的意思是,那样的话。但是,无论是参数的顺序。 这将插入到的格式字符串中的所有变量 然后将其存储到我们的缓冲区,我们称之为是一个缓冲区,它就是我们要存储的字符串。 所以,我们将存储在s的正确格式的字符串,%d的有4个被替换。 [学生]:所以,如果我们这样做,是要被重新分配的变量f? 是。因此,在这样做之前,我们应该关闭原来的F。 但是 - 再还,如果有一个F打开这里,那么我们就需要说 - 是啊。但是,它会打开一个100个不同的文件。 [学生]:但是,我们将不能够访问或 - 好吧。 好吧。因此,扫描扫描楼F,F是一种同样的想法, 而是,而不是将其存储到一个字符串,它更像是你现在 超过刺痛,针对该字符串模式匹配的结果存储到变量。 您可以使用扫描的f来解析过类似4.JPG,和存储的整数总和诠释x 4成。 这就是我们可以使用扫描的f。 F扫描f是在命令行中要做到这一点。 实际上,我敢肯定,这是什么CS50库。 所以,当你说“诠释,”它的扫描F-OVER - 扫描f是您获取用户输入的方式。 F扫描f是打算做同样的事情,但使用扫描过的文件。 所以在这里,我们对这个文件进行扫描。 我们要匹配的模式是一些字符串的长度为127个字符 其次是一个新行 所以,我敢肯定,我们甚至可以说:“匹配小号”,因为在字典中 我们正好有没有字,我们保证的是,长期, 也F扫描f,我认为,在新的生产线停止,无论什么。 但在比赛中,我们将包括新的生产线,并 - [学生]:如果我们不包括新的生产线,将它找到一个词的部分吗? - 每个 - 在字典 - 因此,在字典中,这些都是我们的话。 每个人在新的一行。 扫描f是要拿起这个词。 如果我们不包括新的生产线,那么它有可能是在下一次扫描的f将只读取新的线。 但是,包括新的生产线,然后会忽略新的生产线。 但我们永远不会得到一个字的一部分,因为我们一直在阅读了一个新的行,不管是什么。 [学生]:但是,如果你搜索的单词“CISSA,”像CISSA。 它会发现,并说这是一场比赛吗? 所以,我们在这里 - 它会读出 - 这其实是一个很好的点。 我们从来没有使用电流 - 这个词,我们要寻找的是第一个命令行参数。 因此,单词的字符串,= ARGV 1。 因此,我们正在寻找的字符串是:ARGV 1。 我们是不是在找一个字都在我们的扫描f。 我们在做什么用扫描f在字典中的每一个字, 然后,一旦我们有这个词,我们要使用strcmp来比较他们。 我们要比较的话,我们刚刚读入 因此不可避免地,我们要结束了做了一堆扫描FS 直到它碰巧的是,扫描f将返回 - 它会返回一个,只要它匹配了一个新词, 将尽快返回别的东西,因为它并没有相匹配的单词。 我们正在阅读在整个字典中,一行一行的每一个字存储到变量s。 然后,我们比较单词与s,并且如果比较== 0, strcmp的发生,使0,如果一个匹配。 所以,如果是0,那么我们可以打印楼匹配, 或字的字典,或任何你想要打印f。 然后 - 我们不想,F关闭一遍又一遍。 这是我们想要做什么样的事情,我们不只是寻找在字典中的字。 因此,我们可以做到这一点,如果我们想看看他们的模式,CISSA,像你说的之前, 如果我们想看看该模式,然后它会失败的情况下 因为实际上,这不是一个字,但发生在字典中的一个的话,在。 因此,这将匹配这个词,但这个子集的字是不是这个词本身。 但是,这不是我们如何使用它,我们正在阅读的每个字 然后比较这个词,我们有这个词。 因此,我们总是比较完整的单词。 我可以给的最终解决方案。 这是一种接近正确的答案,我想。 [学生意见,不知所云] 哦,我摆脱了这一点吗?字符,我想我们说的127 - 我忘了什么最大的是。 我们就做128,现在s是足够长的时间。 我们并不需要打印出任何东西。 我们也将要关闭的文件,而且应该是正确的答案。 CS50.TV