1 00:00:00,000 --> 00:00:00,340 2 00:00:00,340 --> 00:00:01,960 >> 扬声器1:现在,让我们解决 这最后一个程序。 3 00:00:01,960 --> 00:00:04,920 而这一次,让我们明确地分配 一些存储在其中 4 00:00:04,920 --> 00:00:06,550 用户的输入将被存储。 5 00:00:06,550 --> 00:00:09,600 要做到这一点,让我们磨练,首先 在哪里,我们宣布S码线 6 00:00:09,600 --> 00:00:11,590 以前是一个char明星。 7 00:00:11,590 --> 00:00:14,210 这一次,让我们重新申报 它如下 - 8 00:00:14,210 --> 00:00:19,380 char中支架16,例如, 接近支架。 9 00:00:19,380 --> 00:00:23,690 >> 换句话说,让我们来宣告s到无 再一个字符的地址, 10 00:00:23,690 --> 00:00:26,610 但16个字符,而数组。 11 00:00:26,610 --> 00:00:30,295 通过这种方式,用户可以输入最多15个 字符,仍然留有余地 12 00:00:30,295 --> 00:00:31,570 一个空终止。 13 00:00:31,570 --> 00:00:35,870 让我们继续保存,编译, 并运行此程序。 14 00:00:35,870 --> 00:00:40,770 让scanf2点斜线scanf2。 15 00:00:40,770 --> 00:00:45,100 现在,让我们输入一个字符串像招呼, 并且我们感谢为你好。 16 00:00:45,100 --> 00:00:46,440 >> 现在,仍然有问题。 17 00:00:46,440 --> 00:00:50,140 我只输入了招呼,这是唯一 五个大字,加1为空 18 00:00:50,140 --> 00:00:50,445 终结者。 19 00:00:50,445 --> 00:00:53,610 它留给我们的只有 需要6个字节。 20 00:00:53,610 --> 00:00:56,740 >> 但不幸的是,我们只 共分配16。 21 00:00:56,740 --> 00:01:01,305 因此,如果用户实际上类型16 字符,或17,或几百 22 00:01:01,305 --> 00:01:04,410 字符,我们仍然不会 有足够的空间在内存中 23 00:01:04,410 --> 00:01:05,400 用户的输入。 24 00:01:05,400 --> 00:01:07,750 而事实上,这是什么使 获取用户输入,因此 25 00:01:07,750 --> 00:01:08,940 难度一般。 26 00:01:08,940 --> 00:01:12,270 事实上,这就是为什么我们实施 在第一个的get字符串函数 27 00:01:12,270 --> 00:01:13,900 发生在CS50库 - 28 00:01:13,900 --> 00:01:16,900 弄清楚如何处理这些 情况下,在用户类型 29 00:01:16,900 --> 00:01:19,710 比我们更多的字符 最初的预期。 30 00:01:19,710 --> 00:01:21,750 >> 坦率地说,不完全 重写这个程序, 31 00:01:21,750 --> 00:01:23,290 有没有干净的解决方案。 32 00:01:23,290 --> 00:01:26,970 相反,我们所要做的就是让 来自用户1的一个字符 33 00:01:26,970 --> 00:01:28,860 时间,一遍又一遍。 34 00:01:28,860 --> 00:01:32,510 并在每个点上,如果我们意识到我们 记忆体不足,我们将不得不在 35 00:01:32,510 --> 00:01:36,450 这一点回去和重新分配 一些更多的内存,复制用户的 36 00:01:36,450 --> 00:01:39,400 从我们的第一个块前一个输入 内存入新, 37 00:01:39,400 --> 00:01:40,810 较大块的内存。 38 00:01:40,810 --> 00:01:44,610 然后重复这个过程, 再次,直到用户完成提供 39 00:01:44,610 --> 00:01:45,860 他或她的输入。 40 00:01:45,860 --> 00:01:48,246