[Powered by Google Translate] [CS50 Bibliyotèk]
[Nate Hardison] [Inivèsite Harvard]
[Sa a se CS50. CS50.TV]
Bibliyotèk la CS50 se yon zouti itil ke nou te enstale sou aparèy la
fè li pi fasil pou ou pou w ekri pwogram ki itilizatè yo èd memwa pou D '.
Nan videyo sa a, nou pral rale tounen rido a ak gade nan ki sa egzakteman se nan bibliyotèk la CS50.
>> Nan videyo a sou C bibliyotèk, nou pale sou fason ou # enkli Tèt dosye
nan bibliyotèk la nan kòd sous ou a,
ak Lè sa a, ou konekte avèk yon dosye bibliyotèk binè pandan faz la ki lye ak
nan pwosesis la konpilasyon.
Dosye yo header presize koòdone la nan bibliyotèk la.
Sa se, yo detay tout resous yo ki bibliyotèk la gen disponib pou ou pou w itilize,
tankou deklarasyon fonksyon, konstan, ak kalite done.
Dosye a bibliyotèk binè gen aplikasyon an nan bibliyotèk la,
ki se konpile nan dosye header bibliyotèk la ak nan bibliyotèk la. dosye c kòd sous.
>> Dosye a bibliyotèk binè se pa trè enteresan fè yon gade nan depi li nan, byen, nan binè.
Se konsa, kite a pran yon gade nan dosye yo header pou bibliyotèk la pito.
Nan ka sa a, gen nan yon sèl dosye header rele cs50.h.
Nou te enstale l 'nan itilizatè a gen ladan anyè
ansanm ak dosye header bibliyotèk yo sistèm lòt '.
>> Youn nan bagay ki premye ou pral avi se ke cs50.h # gen ladan dosye header nan bibliyotèk lòt -
flote, limit, estanda bouleen, ak LIB estanda.
Yon fwa ankò, swiv prensip la nan pa reenvante wou an,
nou te bati nan bibliyotèk la lè l sèvi avèk zouti ki CS0 lòt bay pou nou.
>> Bagay nan pwochen ou pral wè nan bibliyotèk la se ke nou defini yon kalite nouvo rele "fisèl."
Liy sa a vrèman jis kreye yon alyas pou di ki kalite a * Char,
konsa li pa maji enpreye kalite nan fisèl nouvo ak atribi
souvan ki asosye avèk objè fisèl nan lòt lang yo,
tankou longè.
Rezon ki fè nou te fè sa a se pwoteje pwogramasyon nouvo soti nan detay yo esyon
nan pwent yo jiskaske yo ap pare.
>> Pati nan pwochen nan dosye a header se deklarasyon an nan fonksyon yo
ki nan bibliyotèk la CS50 bay ansanm ak kopi dokiman yo.
Avi nivo a detay nan kòmantè yo isit la.
Sa a se super enpòtan pou ke moun yo konnen ki jan yo sèvi ak sa yo fonksyon.
Nou deklare, nan vire, fonksyon vit itilizatè a ak charaktèr retou, double, flote, antye,
long fin fou, ak strings, lè l sèvi avèk kalite pwòp fisèl nou an.
Apre prensip la nan kache enfòmasyon,
nou te mete definisyon nou yo nan yon separe dosye aplikasyon c -. cs50.c--
ki sitiye nan anyè a sous itilizatè.
Nou te bay ke dosye pou ke ou ka pran yon gade nan li,
aprann nan men li, epi compile l 'sou machin diferan si ou vle,
menm si nou panse li pi bon travay sou aparèy la pou sa a nan klas la.
Anyway, kite a pran yon gade nan li kounye a.
>> Fonksyon yo GetChar, GetDouble, GetFloat, GetInt, ak GetLongLong
, yo tout bati sou tèt fonksyon an GetString.
Li sanble ke yo tout swiv esansyèlman modèl la menm.
Yo sèvi ak yon riban pandan y ap akselere itilizatè a pou yon liy nan D '.
Yo retounen yon valè espesyal si itilizatè a entrain yon liy vid.
Yo eseye analizan D 'itilizatè a kòm kalite a ki apwopriye,
se pou li yon Char, yon doub, yon flote, elatriye
Lè sa a, yo swa retounen rezilta a si yo te D 'la avèk siksè parcouru
oswa yo reprompt itilizatè a.
>> Nan yon nivo segondè yo, pa gen anyen vrèman difisil isit la.
Ou ta ka yo te ekri menm estriktire kòd tèt ou nan tan lontan an.
Petèt pati ki pi skre-ap chèche se rele an sskanf ki pars D 'itilizatè a la.
Sskanf se yon pati nan fanmi an konvèsyon fòma opinyon.
Li ap viv nan io.h estanda, ak travay li se analizan yon fisèl C,
dapre yon fòma an patikilye, estoke rezilta yo analizan nan varyab
ki ofri pa moun kap rele a.
Depi fonksyon yo opinyon konvèsyon fòma yo trè itil, lajman itilize fonksyon
ki pa super entwisyon an premye,
nou pral ale sou kijan sskanf travay.
>> Agiman nan premye sskanf se yon * Char - yon konsèy nan yon karaktè.
Pou fonksyon an yo travay byen,
ki karaktè yo ta dwe karaktè an premye nan yon fisèl C,
sispann ak nil \ pèsonaj la 0.
Sa a se fisèl la analizan
Agiman Dezyèm fwa w sskanf se yon fisèl fòma,
tipikman ki te pase nan kòm yon konstan fisèl,
epi ou ta ka te wè yon fisèl tankou sa a anvan lè w ap itilize printf.
Yon siy pousan nan fisèl la fòma endike yon dvi konvèsyon.
Pèsonaj la imedyatman apre yon siy pousan,
endike kalite a C ke nou vle sskanf konvèti nan.
Nan GetInt, ou wè ke gen yon d% ak yon c%.
Sa vle di ke sskanf pral eseye yon int desimal - d la% - ak yon Char - c la%.
Pou chak dvi konvèsyon nan fisèl la fòma,
sskanf espere yon agiman korespondan pita nan lis agiman li yo.
Sa agiman dwe lonje dwèt sou yon kote ki apwopriye tape
nan ki nan magazen rezilta a nan konvèsyon an.
>> Fason nòmal la an pou fè sa se kreye yon varyab sou chemine a anvan apèl la sskanf
pou chak atik ke ou vle analizan soti nan fisèl la
ak Lè sa a, sèvi ak operatè a adrès - comercial la - yo pase endikasyon
bay moun varyab apèl la sskanf.
Ou ka wè nan GetInt nou fè egzakteman sa.
Dwa anvan apèl la sskanf, nou deklare yon int rele n ak yon c rele Char sou chemine a,
epi nou pase endikasyon yo nan apèl la sskanf.
Mete sa yo varyab sou chemine a gen plis pouvwa sou lè l sèvi avèk espas afekte
sou pil wòch la ak malok, depi ou evite sou tèt la nan apèl la malok,
epi ou pa gen enkyete sou koule memwa.
Karaktè pa genyen prefiks pa yon siy pousan pa rapid konvèsyon.
Olye de sa yo jis ajoute nan spesifikasyon la fòma.
>> Pou egzanp, si fisèl la fòma nan GetInt te yon d% olye de sa,
sskanf ta gade pou lèt la yon ki te swiv pa yon int,
ak pandan ke li ta eseye konvèti int a, li pa ta fè nenpòt lòt bagay ki gen yon la.
Sèl eksepsyon yo fè sa a se blan.
Karaktè espas blan nan fisèl la fòma matche ak nenpòt kantite lajan nan blan -
menm okenn nan tout.
Se konsa, sa a, se poukisa kòmantè a mansyone posib ak dirijan ak / oswa fin blan.
Se konsa, nan pwen sa a li sanble rele sskanf nou pral eseye analizan fisèl D 'itilizatè a nan
lè w tcheke pou posib blan dirijan,
swiv pa yon int ke yo pral konvèti ak ki estoke nan n nan varyab int
ki te swiv pa kèk kantite lajan pou blan, ak ki te swiv pa yon karaktè
ki estoke nan c a Char varyab.
>> Ki sa ki sou valè a retounen?
Sskanf pral analizan liy lan D 'Depi nan kòmansman fini,
kanpe lè li rive nan fen an oswa lè yon karaktè nan D 'a
pa matche ak yon karaktè fòma oswa lè li pa kapab fè yon konvèsyon.
Se valè retounen li nan sèvi ak yon sèl lè li sispann.
Si li sispann, paske li te rive jwenn nan fen fisèl la D '
anvan ou fè nenpòt konvèsyon ak devan li pap resevwa matche ak yon pati nan fisèl la fòma,
Lè sa a, se espesyal èof a konstan retounen.
Sinon, li retounen ki kantite konvèsyon siksè,
ki ta ka 0, 1, oswa 2, depi nou te mande pou de konvèsyon.
Nan ka nou an, nou vle asire w ke itilizatè a tape nan yon int epi sèlman int yon.
>> Se konsa, nou vle sskanf retounen 1. Al gade nan poukisa?
Si sskanf tounen 0, Lè sa a, pa gen okenn konvèsyon yo te fè a,
Se konsa itilizatè a tape yon lòt bagay pase yon int nan kòmansman an nan opinyon an.
Si sskanf retounen 2, Lè sa a, itilizatè a t 'byen tape l' nan nan kòmansman an nan opinyon an,
men yo Lè sa a, tape nan kèk karaktè ki pa blan apre sa
depi% nan c konvèsyon nan plas.
Wow, sa se afè yon eksplikasyon long pou yon apèl fonksyon.
Anyway, si ou vle plis enfòmasyon sou sskanf ak frè ak sè li yo,
tcheke deyò paj yo moun, Google, oswa toude.
Gen anpil bagay nan opsyon fisèl fòma,
ak sa yo kapab sove ou yon anpil travay manyèl lè w ap eseye analizan strings nan C.
>> Fonksyon an final nan bibliyotèk la fè yon gade nan se GetString.
Li sanble ke GetString se yon fonksyon difisil yo ekri byen,
menm si li sanble tankou tankou yon senp, travay komen.
Poukisa se ka sa a la?
Oke, kite la panse osijè de kòman nou pral nan magazen liy lan ki itilizatè a kalite pous
Depi yon kòd se yon sekans nan charaktèr,
nou ta ka vle kenbe l nan yon etalaj sou chemine a,
men nou ta bezwen konnen konbyen tan etalaj la a pwal lè nou deklare li.
Menm jan an tou, si nou vle mete l 'sou pil wòch la,
nou bezwen pase malok ki kantite bytes nou vle rezèv,
men sa a se enposib.
Nou pa gen okenn lide ki jan anpil charaktèr itilizatè a ap tape nan
anvan itilizatè a aktyèlman tape yo.
>> Yon solisyon nayif pwoblèm sa a se jis rezève yon moso gwo nan espas, di,
yon blòk nan 1000 charaktèr pou D 'itilizatè a la,
an konsideran ke itilizatè a pa ta janm tape nan yon kòd ki long.
Sa a se yon lide move pou de rezon ki fè.
Premye, an konsideran ke itilizatè yo tipikman pa tape nan strings ki long,
ou ta ka gaspiye yon anpil nan memwa.
Sou machin modèn, sa a pa ta kapab yon pwoblèm si ou fè sa
nan youn oubyen de sikonstans izole,
Men, si ou ap pran opinyon itilizatè a nan yon riban epi estoke pou itilize pita,
ou ka byen vit souse yon tòn a memwa.
Anplis de sa, si pwogram nan w ap ekri a se pou yon òdinatè ki pi piti -
yon aparèy tankou yon smartphone oubyen yon lòt bagay avèk memwa limite -
sa a solisyon pral lakòz pwoblèm yon anpil pi vit.
Dezyèm fwa, rezon ki fè yo pi grav yo pa fè sa a se ke li kite pwogram ou an vilnerab
de sa ki te rele yon kriz debòde tanpon.
Nan pwogram, yon zòn de defans se memwa itilize tanporèman magazen D 'oswa pwodiksyon done,
ki nan ka sa a se blòk 1000-Char nou an.
Yon debòde tanpon fèt lè done ki ekri nan Liv sot pase nan fen blòk an.
>> Pou egzanp, si yon itilizatè aktyèlman fè sa ki kalite nan plis pase 1000 charaktèr.
Ou ta ka fè eksperyans sa a aksidantèlman lè pwogramasyon ak ranje.
Si ou gen yon etalaj la 10 antye, pa gen anyen arè ou nan ap eseye li ak ekri
int la 15.
Pa gen okenn avètisman du oswa erè.
Pwogram nan jis ereur dwat devan ak jwenn aksè memwa a
kote li panse int la 15 pral, ak sa a kapab recouvrir varyab lòt ou.
Nan ka ki pi mal la, ou ka recouvrir kèk nan entèn pwogram ou an
mekanism kontwòl, sa ki lakòz pwogram ou a aktyèlman egzekite enstriksyon diferan
pase ou gen entansyon.
>> Koulye a, li pa komen nan fè sa aksidantèlman,
men sa a se yon teknik san patipri komen ki nèg move sèvi ak kraze pwogram
epi li mete move kòd sou òdinatè lòt moun.
Se poutèt sa, nou pa kapab jis itilize solisyon nayif nou an.
Nou bezwen yon fason yo anpeche pwogram nou yo te soti nan vilnerab
nan yon atak debòde tanpon.
Pou fè sa, nou bezwen asire w ke zòn de defans nou ka grandi lè n ap li
plis enfòmasyon nan men gwoup itilizatè a.
Solisyon an? Nou itilize yon zòn de defans affecte pil wòch.
Depi nou kapab Rdimansyone li lè l sèvi avèk rdimansyonman nan fonksyon an realloc,
epi nou kenbe tras nan de nonb - endèks la nan plas nan pwochen vid nan zòn de defans la
ak longè a oswa kapasite nan zòn de defans la.
Nou li nan charaktèr soti nan itilizatè a yon sèl nan yon moman lè l sèvi avèk fonksyon an fgetc.
Agiman a fonksyon an fgetc pran - stden - se yon referans a fisèl la opinyon estanda,
ki se yon kanal D 'preconnected ke yo itilize yo transfere D' itilizatè a nan
soti nan tèminal la nan pwogram nan.
>> Chak fwa itilizatè a kalite nan yon karaktè nouvo, nou tcheke yo wè si endèks la
nan pwochen plas la gratis plis 1 se pi gran pase kapasite a nan zòn de defans la.
+1 La vini nan paske si endèks nan pwochen gratis se 5,
Lè sa a, longè zòn de defans nou an dwe gen 6 gras a 0 Indexing.
Si nou te kouri soti nan espas nan zòn de defans la, Lè sa a, nou eseye Rdimansyone li,
double pwensip li pou nou koupe desann sou kantite fwa ke nou Rdimansyone
si itilizatè a se tape nan yon fisèl reyèlman long.
Si fisèl la vinn twò lontan oswa si nou kouri soti nan memwa pil wòch,
nou libere tanpon nou yo ak nil retou.
>> Finalman, nou ajoute Char nan zòn de defans la.
Yon fwa frape yo itilizatè antre nan oswa retounen, signalisation yon liy nouvo,
oswa espesyal Char - kontwòl d la - ki siyal yon fen nan opinyon,
nou fè yon chèk yo wè si itilizatè a aktyèlman tape nan anyen nan tout.
Si ou pa, nou retounen nil.
Sinon, paske tanpon nou an, se pwobableman pi gwo pase nou bezwen,
nan ka ki pi mal la li prèske de fwa ki gwo tankou nou bezwen
depi nou double chak fwa nou Rdimansyone,
nou fè yon kopi nouvo sou fisèl la lè l sèvi avèk jis kantite lajan an nan espas ke nou bezwen.
Nou ajoute yon 1 siplemantè nan apèl la malok,
pou ke gen nan espas pou espesyal karaktè nan Terminator nil - \ 0 a,
ki nou kole fisèl la yon fwa nou kopi nan rès la nan karaktè yo,
lè l sèvi avèk strki olye pou yo strki
pou nou ka presize egzakteman kouman anpil charaktèr nou vle yon kopi.
Strki kopi jiskaske li frape yon \ 0.
Lè sa a, nou libere tanpon nou yo ak retounen kopi nan moun kap rele a.
>> Ki moun ki te konnen te kapab tankou yon fonksyon senp-sanblans dwe tèlman konplike?
Koulye a, ou konnen ki sa ki ale nan bibliyotèk la CS50.
>> Non mwen se Nate Hardison, e sa se CS50.
[CS50.TV]