2 00:00:00,000 --> 00:00:01,860 >> 扬声器1:让我们一起来看看 在CS50库, 3 00:00:01,860 --> 00:00:05,190 特别是其调用getInt功能。 4 00:00:05,190 --> 00:00:07,820 在这里,我们有实际的源 对于调用getInt代码。 5 00:00:07,820 --> 00:00:12,050 并请注意,这不是时间太长, 其中大部分是构成一个while循环 - 6 00:00:12,050 --> 00:00:15,620 无限循环在那 - 只有 返回一个值,一旦我们实际上已经 7 00:00:15,620 --> 00:00:17,400 得到我们所期待的。 8 00:00:17,400 --> 00:00:18,700 让我们通过它。 9 00:00:18,700 --> 00:00:21,650 >> 请注意,在这里第一, while循环开始。 10 00:00:21,650 --> 00:00:25,390 注意接下来我们有一个行代码 这实际上是调用GetString的, 11 00:00:25,390 --> 00:00:29,620 和存储在返回值 变量,叫做string类型的线,。 12 00:00:29,620 --> 00:00:31,210 然后,我们做的有点完整性检查。 13 00:00:31,210 --> 00:00:35,770 如果行== null,那么我们好奇地 返回INT_MAX。 14 00:00:35,770 --> 00:00:40,140 >> 现在,事实证明,INT_MAX是一个 特殊常量声明别处 15 00:00:40,140 --> 00:00:44,030 指定的最大可能 INT,你可以在一个代表 16 00:00:44,030 --> 00:00:45,160 程序是这样的。 17 00:00:45,160 --> 00:00:49,430 现在我们已经擅自决定返回 INT_MAX作为一个哨兵值 18 00:00:49,430 --> 00:00:53,120 各种各样的,一个我们已经保留作为 这意味着一个错误已经发生。 19 00:00:53,120 --> 00:00:56,230 因此,我们付出的代价,当然是 该调用getInt显然可以不 20 00:00:56,230 --> 00:01:01,440 实际上返回一个数字一样大 INT_MAX,因为即使它想, 21 00:01:01,440 --> 00:01:04,730 该返回值应该真的 由调用者解释 - 22 00:01:04,730 --> 00:01:06,260 谁是使用调用getInt - 23 00:01:06,260 --> 00:01:09,340 作为某种错误。 24 00:01:09,340 --> 00:01:13,840 >> 接下来,请注意,我已经声明 一个int n和一个char角 25 00:01:13,840 --> 00:01:18,030 在这个代码下一行,我所说的 函数调用sscanf的,在传递 26 00:01:18,030 --> 00:01:18,970 四个参数。 27 00:01:18,970 --> 00:01:25,110 线,这是字符串的用户的 类型中,“%I%c”的,这是一个格式 28 00:01:25,110 --> 00:01:28,850 字符串,我期待的用户可能 类型,随后的地址 29 00:01:28,850 --> 00:01:30,920 n和C的地址。 30 00:01:30,920 --> 00:01:34,860 在现在的生活的sscanf的目的确实是 扫描一个串寻找的 31 00:01:34,860 --> 00:01:38,700 特定的格式,程序员 已指定为第二个参数。 32 00:01:38,700 --> 00:01:42,020 在这种情况下,%i是 还有,因为是%C。 33 00:01:42,020 --> 00:01:46,700 所以,如果遇到的sscanf在一个int 用户的输入,该整数将被存储 34 00:01:46,700 --> 00:01:50,270 称为n变量,里面因为 我们已提供作为第三 35 00:01:50,270 --> 00:01:52,810 参数的sscanf n的地址。 36 00:01:52,810 --> 00:01:56,870 这意味着sscanf的,的确可以去 在那里,并在其中更新值。 37 00:01:56,870 --> 00:01:59,990 >> 现在,如果用户键入 在更多的东西 38 00:01:59,990 --> 00:02:01,220 比一个或多个数字 - 39 00:02:01,220 --> 00:02:03,570 换句话说,某种类型的字符 - 40 00:02:03,570 --> 00:02:07,940 那第二个变量c,其地址 我们传入的sscanf作为其第四 41 00:02:07,940 --> 00:02:10,560 参数也将被填充。 42 00:02:10,560 --> 00:02:14,220 现在检查的的上攻 从用户额外的字符是 43 00:02:14,220 --> 00:02:17,360 如果他或她不配合, 并在不止一个int类型, 44 00:02:17,360 --> 00:02:20,530 我们就可以检测到它在这 方式,因为在这种情况下,sscanf的 45 00:02:20,530 --> 00:02:24,860 将要返回2,表示 无论是占位符填充 46 00:02:24,860 --> 00:02:25,600 与值。 47 00:02:25,600 --> 00:02:30,360 但我们希望sscanf的,而不是 返回1,这只能意味着用户 48 00:02:30,360 --> 00:02:31,630 提供一个int。 49 00:02:31,630 --> 00:02:34,480 >> 我们该怎么办,如果sscanf的 的确返回1? 50 00:02:34,480 --> 00:02:39,150 好了,我们立即释放行 用户键入的,然后我们 51 00:02:39,150 --> 00:02:42,670 立即返回N,有 得到一个int。 52 00:02:42,670 --> 00:02:47,180 否则,如果sscanf的不返回1,并 用户因此不配合, 53 00:02:47,180 --> 00:02:51,470 我们仍然可以自由线,但我们 现在提示重试用户。 54 00:02:51,470 --> 00:02:55,390 而且因为我们仍然是内 否则无限循环,该过程 55 00:02:55,390 --> 00:03:00,190 将重新开始,也许又和 或许再次,用户实际上直到 56 00:03:00,190 --> 00:03:01,500 为我们提供了一个int。 57 00:03:01,500 --> 00:03:21,490