1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Pieņemsim uzrakstīt programmu, kas izpaužas string no lietotāja bez 3 00:00:02,920 --> 00:00:05,700 izmantojot CS50 bibliotēkas darboties GetString. 4 00:00:05,700 --> 00:00:08,720 Lai to paveiktu, mēs iesim uz priekšu un izmantot scanf, funkcija, kas GetString 5 00:00:08,720 --> 00:00:10,950 funkcija faktiski izmanto zem motora pārsega. 6 00:00:10,950 --> 00:00:13,780 Bet es esmu gatavojas darīt to apzināti ar buggy veidā. 7 00:00:13,780 --> 00:00:17,230 Es esmu gatavojas darīt tādā veidā, ka es domāju, ka būtu labi, bet izrādās, ka 8 00:00:17,230 --> 00:00:19,380 mans pieņēmums ir gatavojas būt diezgan, diezgan kļūdains. 9 00:00:19,380 --> 00:00:20,800 Un patiesībā, ir diezgan bīstami. 10 00:00:20,800 --> 00:00:24,750 Jo kļūdas, piemēram, kādu es esmu par to, lai padarīt var izmantot ar pretiniekiem 11 00:00:24,750 --> 00:00:28,870 tāds, ka jūsu mašīna, vai jūsu programma var pārņemt iespējami. 12 00:00:28,870 --> 00:00:30,200 >> Sāksim šādi. 13 00:00:30,200 --> 00:00:33,540 Vispirms pieņemsim pasludināt mūsu virkni, citādi zināma tagad kā char zvaigzne, 14 00:00:33,540 --> 00:00:34,750 un sauc to s. 15 00:00:34,750 --> 00:00:39,400 Lets nākamais atgādinās lietotājam par virkni, kā ar "string, lūdzu." Un 16 00:00:39,400 --> 00:00:44,250 pieņemsim tagad saņemt virkni no lietotāja izmantojot scanf, citējot likt pēdiņas beigās, "% s." Uz 17 00:00:44,250 --> 00:00:47,760 Citiem vārdiem sakot, pieņemsim informē scanf, ka mēs Vai tiešām gaidīt, lai saņemtu virkni 18 00:00:47,760 --> 00:00:48,630 no lietotāja. 19 00:00:48,630 --> 00:00:50,810 >> Bet tagad mums ir nepieciešams, lai pastāstītu scanf viena cita lieta - 20 00:00:50,810 --> 00:00:53,350 kur likt virkni, kas lietotājs sniedz. 21 00:00:53,350 --> 00:00:57,840 Nu, es esmu gatavojas gluži vienkārši sākt ar komatu s, norādot, ka es gribētu 22 00:00:57,840 --> 00:00:59,320 scanf likt virkni tur. 23 00:00:59,320 --> 00:01:04,818 Es esmu blakus gatavojas izdrukāt kaut ko piemēram, printf "Paldies par% s 24 00:01:04,818 --> 00:01:10,670 slīpsvītru n komats. "Un, kā vienmēr, es esmu gatavojas pāriet virknes, s. 25 00:01:10,670 --> 00:01:14,920 Tagad pieņemsim saglabāt, apkopot un palaist šo programmu, un redzēt, ja mēs nevaram izraisīt 26 00:01:14,920 --> 00:01:16,590 problēma man prognozēt. 27 00:01:16,590 --> 00:01:18,650 >> Padarīt Scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String lūdzu. 30 00:01:21,830 --> 00:01:25,540 Pieņemsim sniegt kaut ko līdzīgu, "hello". "Paldies par nulli." Hmm, tas nav 31 00:01:25,540 --> 00:01:26,750 ko es biju gaidījis. 32 00:01:26,750 --> 00:01:28,240 Tātad, kas notiek šeit? 33 00:01:28,240 --> 00:01:32,040 >> Nu, izrādās, ka mēs būtu deklarējuši s kā char zvaigzne, bet mēs neesam 34 00:01:32,040 --> 00:01:36,120 faktiski uzglabā s adresi faktiskais rieciens atmiņas, scanf nebija 35 00:01:36,120 --> 00:01:38,940 nekur likt virkni ka lietotājs drukāti collas 36 00:01:38,940 --> 00:01:42,510 Patiešām, ja lietotājs būtu tagad rakstīt daudz ilgāk string par "hello" 37 00:01:42,510 --> 00:01:46,780 piemēram vairākas teksta rindas vai vairāki punkti teksta, tas ir diezgan 38 00:01:46,780 --> 00:01:50,280 Iespējams, ka mēs varētu izraisīt tā saukto segmentāciju vaina. 39 00:01:50,280 --> 00:01:53,570 >> Jo scanf nav gatavojas zināt, ka Man nav tiešām likts adresi 40 00:01:53,570 --> 00:01:54,610 iekšpusē s. 41 00:01:54,610 --> 00:01:58,000 Drīzāk, tas notiek, lai redzētu kādu vērtību S, daži modelis biti, kas var 42 00:01:58,000 --> 00:02:00,910 ļoti labi būt atkritumu vērtību, tur tikai nejauši. 43 00:02:00,910 --> 00:02:04,600 Un scanf joprojām turpinās, lai mēģinātu uzrakstīt lietotājs string uz šo adresi, 44 00:02:04,600 --> 00:02:08,789 pat tad, ja tā ir atkritumu vērtību, kas tiešām varētu izraisīt avāriju. 45 00:02:08,789 --> 00:02:10,130 >> Tātad, kā mēs gatavojamies noteikt šo? 46 00:02:10,130 --> 00:02:12,523