>> SPEAKER 1: Pieņemsim uzrakstīt programmu, kas izpaužas string no lietotāja bez
izmantojot CS50 bibliotēkas darboties GetString.
Lai to paveiktu, mēs iesim uz priekšu un izmantot scanf, funkcija, kas GetString
funkcija faktiski izmanto zem motora pārsega.
Bet es esmu gatavojas darīt to apzināti ar buggy veidā.
Es esmu gatavojas darīt tādā veidā, ka es domāju, ka būtu labi, bet izrādās, ka
mans pieņēmums ir gatavojas būt diezgan, diezgan kļūdains.
Un patiesībā, ir diezgan bīstami.
Jo kļūdas, piemēram, kādu es esmu par to, lai padarīt var izmantot ar pretiniekiem
tāds, ka jūsu mašīna, vai jūsu programma var pārņemt iespējami.
>> Sāksim šādi.
Vispirms pieņemsim pasludināt mūsu virkni, citādi zināma tagad kā char zvaigzne,
un sauc to s.
Lets nākamais atgādinās lietotājam par virkni, kā ar "string, lūdzu." Un
pieņemsim tagad saņemt virkni no lietotāja izmantojot scanf, citējot likt pēdiņas beigās, "% s." Uz
Citiem vārdiem sakot, pieņemsim informē scanf, ka mēs Vai tiešām gaidīt, lai saņemtu virkni
no lietotāja.
>> Bet tagad mums ir nepieciešams, lai pastāstītu scanf viena cita lieta -
kur likt virkni, kas lietotājs sniedz.
Nu, es esmu gatavojas gluži vienkārši sākt ar komatu s, norādot, ka es gribētu
scanf likt virkni tur.
Es esmu blakus gatavojas izdrukāt kaut ko piemēram, printf "Paldies par% s
slīpsvītru n komats. "Un, kā vienmēr, es esmu gatavojas pāriet virknes, s.
Tagad pieņemsim saglabāt, apkopot un palaist šo programmu, un redzēt, ja mēs nevaram izraisīt
problēma man prognozēt.
>> Padarīt Scanf-1.
./scanf-1.
String lūdzu.
Pieņemsim sniegt kaut ko līdzīgu, "hello". "Paldies par nulli." Hmm, tas nav
ko es biju gaidījis.
Tātad, kas notiek šeit?
>> Nu, izrādās, ka mēs būtu deklarējuši s kā char zvaigzne, bet mēs neesam
faktiski uzglabā s adresi faktiskais rieciens atmiņas, scanf nebija
nekur likt virkni ka lietotājs drukāti collas
Patiešām, ja lietotājs būtu tagad rakstīt daudz ilgāk string par "hello"
piemēram vairākas teksta rindas vai vairāki punkti teksta, tas ir diezgan
Iespējams, ka mēs varētu izraisīt tā saukto segmentāciju vaina.
>> Jo scanf nav gatavojas zināt, ka Man nav tiešām likts adresi
iekšpusē s.
Drīzāk, tas notiek, lai redzētu kādu vērtību S, daži modelis biti, kas var
ļoti labi būt atkritumu vērtību, tur tikai nejauši.
Un scanf joprojām turpinās, lai mēģinātu uzrakstīt lietotājs string uz šo adresi,
pat tad, ja tā ir atkritumu vērtību, kas tiešām varētu izraisīt avāriju.
>> Tātad, kā mēs gatavojamies noteikt šo?