扬声器1:让我们一起来看看 在CS50库, 特别是其调用getInt功能。 在这里,我们有实际的源 对于调用getInt代码。 并请注意,这不是时间太长, 其中大部分是构成一个while循环 - 无限循环在那 - 只有 返回一个值,一旦我们实际上已经 得到我们所期待的。 让我们通过它。 请注意,在这里第一, while循环开始。 注意接下来我们有一个行代码 这实际上是调用GetString的, 和存储在返回值 变量,叫做string类型的线,。 然后,我们做的有点完整性检查。 如果行== null,那么我们好奇地 返回INT_MAX。 现在,事实证明,INT_MAX是一个 特殊常量声明别处 指定的最大可能 INT,你可以在一个代表 程序是这样的。 现在我们已经擅自决定返回 INT_MAX作为一个哨兵值 各种各样的,一个我们已经保留作为 这意味着一个错误已经发生。 因此,我们付出的代价,当然是 该调用getInt显然可以不 实际上返回一个数字一样大 INT_MAX,因为即使它想, 该返回值应该真的 由调用者解释 - 谁是使用调用getInt - 作为某种错误。 接下来,请注意,我已经声明 一个int n和一个char角 在这个代码下一行,我所说的 函数调用sscanf的,在传递 四个参数。 线,这是字符串的用户的 类型中,“%I%c”的,这是一个格式 字符串,我期待的用户可能 类型,随后的地址 n和C的地址。 在现在的生活的sscanf的目的确实是 扫描一个串寻找的 特定的格式,程序员 已指定为第二个参数。 在这种情况下,%i是 还有,因为是%C。 所以,如果遇到的sscanf在一个int 用户的输入,该整数将被存储 称为n变量,里面因为 我们已提供作为第三 参数的sscanf n的地址。 这意味着sscanf的,的确可以去 在那里,并在其中更新值。 现在,如果用户键入 在更多的东西 比一个或多个数字 - 换句话说,某种类型的字符 - 那第二个变量c,其地址 我们传入的sscanf作为其第四 参数也将被填充。 现在检查的的上攻 从用户额外的字符是 如果他或她不配合, 并在不止一个int类型, 我们就可以检测到它在这 方式,因为在这种情况下,sscanf的 将要返回2,表示 无论是占位符填充 与值。 但我们希望sscanf的,而不是 返回1,这只能意味着用户 提供一个int。 我们该怎么办,如果sscanf的 的确返回1? 好了,我们立即释放行 用户键入的,然后我们 立即返回N,有 得到一个int。 否则,如果sscanf的不返回1,并 用户因此不配合, 我们仍然可以自由线,但我们 现在提示重试用户。 而且因为我们仍然是内 否则无限循环,该过程 将重新开始,也许又和 或许再次,用户实际上直到 为我们提供了一个int。