1 00:00:00,000 --> 00:00:00,340 2 00:00:00,340 --> 00:00:01,960 >> GŁOŚNIK 1: Załóżmy teraz naprawić że ostatni program. 3 00:00:01,960 --> 00:00:04,920 I tym razem, niech wyraźnie przydzielić część pamięci, w którym 4 00:00:04,920 --> 00:00:06,550 Wejście użytkownika będą przechowywane. 5 00:00:06,550 --> 00:00:09,600 Aby to zrobić, niech doskonalić się na tym pierwszym linii kodu, gdzie zadeklarowaliśmy s 6 00:00:09,600 --> 00:00:11,590 wcześniej, aby być gwiazdą char. 7 00:00:11,590 --> 00:00:14,210 Tym razem, niech ponownie deklaruje to w następujący sposób - 8 00:00:14,210 --> 00:00:19,380 char s wspornik 16, na przykład blisko wspornika. 9 00:00:19,380 --> 00:00:23,690 >> Innymi słowy, niech się nie deklarują s już adres postaci, 10 00:00:23,690 --> 00:00:26,610 ale tablica z 16 znaków. 11 00:00:26,610 --> 00:00:30,295 W ten sposób, użytkownik może wpisać do 15 znaków i jeszcze pozostawić miejsce na 12 00:00:30,295 --> 00:00:31,570 terminator null. 13 00:00:31,570 --> 00:00:35,870 Przejdźmy do Save, kompilacji, i Uruchom ten program. 14 00:00:35,870 --> 00:00:40,770 Dodać scanf2 kropka slash scanf2. 15 00:00:40,770 --> 00:00:45,100 Załóżmy teraz wpisz ciąg jak cześć, a my podziękował za cześć. 16 00:00:45,100 --> 00:00:46,440 >> Teraz jest jeszcze problem. 17 00:00:46,440 --> 00:00:50,140 I tylko wpisane w cześć, która jest tylko pięć znaków, plus 1 dla wartości null 18 00:00:50,140 --> 00:00:50,445 terminator. 19 00:00:50,445 --> 00:00:53,610 To pozostawia nam tylko Potrzeba sześć bajtów. 20 00:00:53,610 --> 00:00:56,740 >> Ale niestety, tylko przydzielone 16 w całości. 21 00:00:56,740 --> 00:01:01,305 Więc jeśli użytkownik faktycznie typy w 16 znaków lub 17, lub kilkaset 22 00:01:01,305 --> 00:01:04,410 znaków, nie jesteśmy jeszcze będzie mają wystarczająco dużo miejsca w pamięci dla 23 00:01:04,410 --> 00:01:05,400 Wejście użytkownika. 24 00:01:05,400 --> 00:01:07,750 A w rzeczywistości, to jest to, co sprawia, dane wprowadzone przez użytkownika, tak się 25 00:01:07,750 --> 00:01:08,940 trudne w ogóle. 26 00:01:08,940 --> 00:01:12,270 I rzeczywiście, to właśnie dlatego wdrożyliśmy Funkcja string dostać w pierwszym 27 00:01:12,270 --> 00:01:13,900 miejsce w bibliotece CS50 - 28 00:01:13,900 --> 00:01:16,900 dowiedzieć się, jak radzić sobie z tymi sytuacje, gdy użytkownik wpisze w 29 00:01:16,900 --> 00:01:19,710 więcej znaków, niż początkowo przewidywano. 30 00:01:19,710 --> 00:01:21,750 >> Szczerze mówiąc, nie całkowicie przepisywanie tego programu, 31 00:01:21,750 --> 00:01:23,290 nie ma prostego rozwiązania. 32 00:01:23,290 --> 00:01:26,970 Raczej, co musimy zrobić, to postać z jednej na użytkownika 33 00:01:26,970 --> 00:01:28,860 czas, znowu i znowu. 34 00:01:28,860 --> 00:01:32,510 A w każdym momencie, jeśli uświadomimy sobie, że jesteśmy z pamięci, będziemy musieli w 35 00:01:32,510 --> 00:01:36,450 że punkt wrócić i realokacji trochę więcej pamięci, skopiować użytkownika 36 00:01:36,450 --> 00:01:39,400 poprzednie wejście od naszego pierwszego kawałka pamięci w nowy, 37 00:01:39,400 --> 00:01:40,810 większy fragment pamięci. 38 00:01:40,810 --> 00:01:44,610 A następnie powtórzyć ten proces jeszcze raz i ponownie, dopóki użytkownik dokonuje dostarczania 39 00:01:44,610 --> 00:01:45,860 jego lub jej wejście. 40 00:01:45,860 --> 00:01:48,246