[Powered by Google Translate] [CS50 Librerija]
[Nate Hardison] [Università ta 'Harvard]
[Dan huwa CS50. CS50.TV]
Il-librerija CS50 hija għodda utli li aħna jkollu stallat fuq l-appliance
li jagħmilha aktar faċli għalik biex jiktbu programmi li l-utenti fil-pront għall-input.
F'dan il-video, aħna ser iġbed lura l-purtiera u tħares lejn dak li eżattament fil-librerija CS50.
>> F'dan il-video fuq il-libreriji C, nitkellmu dwar kif inti # jinkludu fajls headers
tal-librerija fil-kodiċi tas-sors tiegħek,
u allura inti tqabbad mal-fajl librerija binarju matul il-fażi li jgħaqqdu
tal-proċess kumpilazzjoni.
Il-fajls header jispeċifikaw l-interface tal-librerija.
Dan huwa, huma dettall kollha tar-riżorsi li l-librerija tkun disponibbli għalik għall-użu,
bħal dikjarazzjonijiet funzjoni, kostanti, u tipi ta 'data.
Il-fajl librerija binarju jkun fih l-implimentazzjoni tal-librerija,
li hija miġbura mill-fajls header tal-librerija u l-l-librerija taċ. fajls kodiċi c sors.
>> Il-fajl librerija binarju ma tantx hu interessanti li wieħed iħares lejn peress li huwa, ukoll, fil-binarju.
Allura, ejja tagħti ħarsa lejn il-fajls header għall-librerija minflok.
F'dan il-każ, hemm wieħed biss header fajl imsejjaħ cs50.h.
Imxejna stallat fil-utent tinkludi direttorju
flimkien ma 'fajls header tal-libreriji sistema oħra ".
>> Waħda mill-ewwel affarijiet li inti ser avviż huwa li cs50.h # jinkludi fajls header minn libreriji oħra -
float, limiti, standard bool, u LIB standard.
Għal darb'oħra, skond il-prinċipju ta 'mhux diġà sar-rota,
konna mibnija l-librerija CS0 permezz ta 'għodod li hemm provvediment ieħor għalina.
>> Il-ħaġa li jmiss inti taf tara fil-librerija hija li aħna jiddefinixxu tip ġdid imsejjaħ "string".
Din il-linja verament ftit toħloq alias għat-tip * char,
sabiex ma magically jagħtihiex-tip sekwenza l-ġdida bl-attributi
komuni assoċjati ma 'oġġetti string f'lingwi oħra,
bħat-tul.
Ir-raġuni aħna ghamilt dan huwa li jipproteġu programmaturi ġodda mill-dettalji rija
ta 'pointers sakemm qed lest.
>> Il-parti li jmiss tal-fajl tal-header hija d-dikjarazzjoni tal-funzjonijiet
li l-librerija CS50 jipprovdi flimkien ma 'dokumentazzjoni.
Avviż tal-livell ta 'dettall fil-kummenti hawn.
Dan huwa super importanti sabiex in-nies jafu kif jużaw dawn il-funzjonijiet.
Aħna niddikjaraw, imbagħad, funzjonijiet li fil-pront lill-utent u Chars ritorn, jirdoppja, sufruni, ints,
twil twal, u kordi, bl-użu tip tagħna string stess.
Wara l-prinċipju ta 'ħabi ta' informazzjoni,
aħna poġġew definizzjoni tagħna separata fajl implimentazzjoni ċ -. cs50.c--
jinsabu fid-direttorju sors utent.
Imxejna sakemm dan il-fajl sabiex inti tista 'tagħti ħarsa lejn dan,
jitgħallmu minnha, u recompile fuq magni differenti jekk tixtieq,
anke jekk aħna naħsbu huwa aħjar biex jaħdmu fuq l-appliance għal din il-klassi.
Xorta waħda, ejja tagħti ħarsa lejn dan issa.
>> Il-funzjonijiet GetChar, GetDouble, GetFloat, GetInt, u GetLongLong
huma kollha mibnija fuq quċċata tal-funzjoni GetString.
Jirriżulta li dawn kollha jsegwu essenzjalment l-istess mudell.
Huma jużaw loop filwaqt li fil-pront lill-utent għall-linja waħda ta 'input.
Huma ritorn ta 'valur speċjali jekk l-utent inputs ta' linja vojta.
Huma jippruvaw parse input-utent bħala t-tip xierqa,
jekk tkun char, a doppja, float, eċċ
U allura huma jew jirritornaw r-riżultat jekk l-input kien b'suċċess parsed
jew huma reprompt-utent.
>> Fuq livell għoli, m'hemm xejn verament delikata hawn.
Inti jista 'jkollok bil-miktub kodiċi bl-istess mod strutturat ruħek fil-passat.
Forsi l-iktar parti cryptic li tħares huwa l-sejħa sscanf li parses input l-utent.
Sscanf hija parti mill-input format ta 'konverżjoni tal-familja.
Hija tgħix fil io.h standard, u tax-xogħol tagħha huwa li parse string C,
skond format partikolari, il-ħażna r-riżultati parse fil-varjabbli
pprovduta mill-sejjieħ.
Peress li l-funzjonijiet ta 'input ta' konverżjoni format huma utli ħafna, il-funzjonijiet użati
li mhumiex super intuwittivi fl-ewwel,
aħna ser jmorru fuq kif sscanf xogħlijiet.
>> L-ewwel argument li sscanf huwa * char - pointer għal karattru.
Għall-funzjoni biex jaħdem kif suppost,
dan il-karattru għandu jkun l-ewwel karattru ta 'sensiela C,
terminat bil-null \ 0 karattru.
Dan huwa l-sekwenza biex parse
It-tieni argument li sscanf hija sekwenza format,
tipikament mgħoddi fl bħala kostanti string,
u inti tista raw string bħal din qabel meta jużaw printf.
Sinjal mija fis-sekwenza format jindika specifier konverżjoni.
Il-karattru immedjatament wara sinjal fil-mija,
jindika t-tip Ċ li aħna rridu sscanf li jikkonvertu l.
Fil GetInt, tara li hemm d% u ċ%.
Dan ifisser li sscanf se tipprova li int deċimali - il-% d - u char - il-c%.
Għal kull specifier konverżjoni fis-sekwenza format,
sscanf jistenna argument korrispondenti aktar tard fil-lista argument tagħha.
Dan l-argument għandu jindika f'post xieraq ittajpjat
fejn jinħażnu l-riżultat tal-konverżjoni.
>> Il-mod tipiku ta 'kif isir dan huwa li jinħoloq varjabbli fuq il-munzell qabel is-sejħa sscanf
għal kull oġġett li inti tixtieq li parse mill-sekwenza
u mbagħad jużaw l-operatur indirizz - l-ampersand - li tgħaddi pointers
li dawk il-varjabbli għas-sejħa sscanf.
Tista 'tara li fil-GetInt nagħmlu eżattament dan.
Dritt qabel is-sejħa sscanf, aħna jiddikjaraw int imsejħa n u ċ sejħa char fuq il-munzell,
u aħna jgħaddu pointers għalihom fis-sejħa sscanf.
Tqegħid dawn il-varjabbli dwar il-munzell huwa preferut fuq użu ispazju allokat
fuq il-munzell bil malloc, peress li inti tevita l-overhead tas-sejħa malloc,
u inti ma għandekx għalfejn tinkwieta dwar jnixxu memorja.
Karattri mhux prefissi b'sinjal fil-mija ma pront konverżjoni.
Pjuttost huma biss iżidu l-ispeċifikazzjoni format.
>> Per eżempju, jekk l-sekwenza format GetInt kienu d% minflok,
sscanf se tfittex l-ittra ta 'segwita minn int,
u filwaqt li kien ser jipprova li jikkonvertu l-int, ma tagħmel xi ħaġa oħra mal-a.
L-unika eċċezzjoni għal dan hija whitespace.
Karattri White ispazju fil-sekwenza format jlaħħaq kull ammont ta 'whitespace -
anke xejn affattu.
Allura, hu għalhekk li l-kumment isemmi possibilment iwassal u / jew tkaxkir whitespace.
Allura, f'dan il-punt jidher qisu sejħa sscanf tagħna se tipprova li parse string input tal-utent
billi tiċċekkja għall whitespace ewlieni possibbli,
segwit minn int li se jiġu konvertiti u maħżuna fil-varjabbli n int
segwit minn xi ammont ta 'whitespace, u segwit minn karattru
maħżuna fil-c varjabbli char.
>> Xi ngħidu dwar il-valur tar-ritorn?
Sscanf se parse-linja input mill-bidu sat-tmiem,
waqfien meta jilħaq it-tmiem jew meta karattru fil-input
ma taqbilx ma 'karattru format jew meta ma jkunx jista' jagħmel konverżjoni.
Valur tar-ritorn huwa jintuża biex jiġi individwat meta hija waqfet.
Jekk hija waqfet, minħabba li laħqu t-tmiem tas-sekwenza input
qabel ma tagħmel xi konverżjonijiet u qabel ma jaqblu parti mill-sekwenza format,
allura l-EOF kostanti speċjali huwa rritornat.
Inkella, dan jirritorna l-għadd ta 'konverżjonijiet ta' suċċess,
li jista 'jkun 0, 1, jew 2, peress li konna mitluba għal żewġ konverżjonijiet.
Fil-każ tagħna, irridu li jagħmlu ċert li l-utent ittajpjat fi int u biss int.
>> Għalhekk, irridu sscanf li jirritornaw 1. Ara għaliex?
Jekk sscanf lura 0, allura l-ebda konverżjonijiet saru,
sabiex l-utent ittajpjat xi ħaġa oħra għajr int fil-bidu ta 'l-input.
Jekk sscanf prospetti 2, allura l-utent ma suppost tip fil fil-bidu ta 'l-input,
iżda mbagħad ittajpjat f'xi natura mhux whitespace wara
peress li l-% c konverżjoni irnexxielu.
Ara naqra, li pjuttost spjegazzjoni twila għal sejħa funzjoni waħda.
Xorta waħda, jekk inti tixtieq aktar informazzjoni dwar sscanf u aħwa tiegħu,
jiċċekkjaw il-paġni bniedem, Google, jew it-tnejn.
Hemm ħafna ta 'għażliet spag format,
u dawn jistgħu jiffrankaw inti ħafna ta 'xogħol manwali meta jippruvaw biex parse kordi fl C.
>> Il-funzjoni finali fil-librerija li tħares lejn huwa GetString.
Jirriżulta li GetString huwa funzjoni delikata biex jiktbu sew,
anke jekk jidher li huwa simili tali sempliċi, kompitu komuni.
Għaliex dan huwa l-każ?
Ukoll, ejja jaħsbu dwar kif aħna qed tmur biex jaħżnu l-linja li l-utent tipi pulzieri
Peress string hija sekwenza ta 'Chars,
aħna tista 'tixtieq li jaħżen fil-firxa fuq il-munzell,
imma aħna jeħtieġ li tkun taf kemm żmien il-firxa se tkun meta aħna tiddikjara dan.
Bl-istess mod, jekk irridu li tqiegħed lilha fuq il-munzell,
għandna bżonn li tgħaddi lill malloc-numru ta 'bytes irridu riserva,
iżda dan huwa impossibbli.
Għandna l-ebda idea kif ħafna Chars l-utent se tip
qabel l-utent fil-fatt ma tip tagħhom.
>> Soluzzjoni naive għal din il-problema huwa biss jirriżervaw blokki kbar ta 'spazju, ngħidu aħna,
blokk ta '1000 Chars għall-input tal-utent,
jekk wieħed jassumi li l-utent qatt ma tip fil string dik twila.
Din hija idea ħażina għal żewġ raġunijiet.
L-ewwel, jekk wieħed jassumi li l-utenti tipikament ma tip fil kordi dak twil,
inti tista 'skart ħafna ta' memorja.
Fuq il-magni moderni, dan ma jista 'jkun kwistjoni jekk inti tagħmel dan
f'waħda jew żewġ każijiet iżolati,
imma jekk inti qed tieħu l-input utent fil-linja u l-ħażna għall-użu aktar tard,
inti tista 'malajr terda up ton ta' memorja.
Barra minn hekk, jekk il-programm int bil-miktub hija għal kompjuter iżgħar -
mezz bħal smartphone jew xi ħaġa oħra bil-memorja limitata -
din is-soluzzjoni tikkawża problemi ħafna aktar malajr.
It-tieni, ir-raġuni aktar serji li ma tagħmel dan huwa li tħalli programm tiegħek vulnerabbli
għal dak li sejjaħ attakk overflow buffer.
Fil-programmazzjoni, ta 'buffer hija memorja użati biex jaħżnu temporanjament data input jew output,
li f'dan il-każ huwa 1000-char blokk tagħna.
A overflow buffer iseħħ meta data hija miktuba passat il-tarf tal-blokka.
>> Per eżempju, jekk utent attwalment ma tip f'aktar minn 1000 Chars.
Inti jista 'jkollok esperjenza dan aċċidentalment meta jipprogrammaw l-matriċi.
Jekk għandek firxa ta '10 ints, xejn inti tieqaf milli tipprova taqra jew tikteb
l-15 int.
M'hemm l-ebda twissijiet kompilatur jew żbalji.
Il-programm biss blunders dritt 'il quddiem u aċċessi l-memorja
fejn jidhirlu l-int 15 se jkun, u dan jista 'jissostitwixxu varjabbli oħra tiegħek.
Fl-agħar każ, inti tista jissostitwixxu xi interna program tiegħek
mekkaniżmi ta 'kontroll, li jikkawżaw program tiegħek biex fil-fatt iwettaq l-istruzzjonijiet differenti
milli suppost maħsuba.
>> Issa, mhuwiex komuni biex tagħmel dan aċċidentalment,
iżda din hija teknika pjuttost komuni li guys ħżiena jużaw biex jinkiser programmi
u mqiegħda kodiċi malizzjużi fuq kompjuters nies oħrajn.
Għalhekk, ma nistgħux biss tuża soluzzjoni naive tagħna.
Għandna bżonn mod biex jipprevjenu programmi tagħna milli jkunu vulnerabbli
għal attakk overflow buffer.
Biex tagħmel dan, għandna bżonn li jiġi żgurat li buffer tagħna jkunu jistgħu jikbru hekk kif naqraw
aktar rispons mill-utent.
Is-soluzzjoni? Aħna nużaw buffer allokazzjoni borġ.
Minħabba li aħna jistgħu resize billi tuża l resize l-funzjoni realloc,
u aħna jżommu rekord ta 'żewġ numri - l-indiċi ta' l-islott vojta jmiss fil-buffer
u t-tul jew il-kapaċità tal-buffer.
Naqraw fil Chars mill-utent wieħed fi żmien tuża l-funzjoni fgetc.
L-argument tal-funzjoni fgetc jieħu - stdin - hija referenza għall-sekwenza input standard,
li huwa kanal input preconnected li jintuża biex jittrasferixxi input tal-utent
mit-terminal għall-programm.
>> Kull meta l-utent tipi fil-karattru ġdid, aħna tikkontrolla biex tara jekk l-indiċi
ta 'l-islott ħielsa jmiss plus 1 hi akbar mill-kapaċità tal-buffer.
Il-1 taqa 'fil għaliex jekk l-indiċi ħielsa jmiss huwa 5,
imbagħad tul buffer tagħna għandhom jkunu bejn 6 grazzi għall 0 indiċjar.
Jekk konna jispiċċaw l-ispazju fil-buffer, allura aħna tentattiv biex resize dan,
irduppjar hekk li aħna tnaqqas il-numru ta 'drabi li aħna resize
jekk l-utent huwa ittajpjar fl string verament twila.
Jekk il-sekwenza gotten wisq twil jew jekk aħna jispiċċaw tal-memorja borġ,
aħna ħielsa buffer tagħna u null ritorn.
>> Fl-aħħarnett, aħna tehmeż l-karatteristiċi tal-buffer.
Ladarba l-hits utent jidħol jew jirritornaw, sinjalar linja ġdida,
jew l speċjali karatteristiċi - kontroll d - li juri fit-tmiem ta 'input,
nagħmlu verifika biex tara jekk l-utent fil-fatt ittajpjat fil xejn affattu.
Jekk le, nerġgħu lura null.
Inkella, għaliex buffer tagħna huwa probabbilment akbar minn għandna bżonn,
fl-agħar każ huwa kważi darbtejn akbar mill neħtieġu
peress li aħna doppju kull darba we resize,
nagħmlu kopja ġdida tas-sekwenza jużaw biss l-ammont ta 'spazju li għandna bżonn.
Aħna żid 1 żejjed għas-sejħa malloc,
b'tali mod li hemm spazju għall-karattru terminatur speċjali null - il-\ 0,
li aħna ehmeż mad-sekwenza ladarba aħna kopja fil-bqija tal-karattri,
użu strncpy minflok strcpy
sabiex inkunu nistgħu jispeċifikaw eżattament kemm Chars irridu li kopja.
Strcpy kopji sakemm hits a \ 0.
Imbagħad aħna ħielsa buffer tagħna u jirritorna l-kopja lill-sejjieħ.
>> Min jaf din il-funzjoni sempliċi seeming jistgħu jiġu hekk kkumplikata?
Issa taf dak li tmur fil-librerija CS50.
>> Jisimni Nate Hardison, u dan huwa CS50.
[CS50.TV]