[Powered by Google Translate] [CS50 Library]
[Nate Hardison] [Harvardeko Unibertsitateko]
[Hau CS50 da. CS50.TV]
CS50 liburutegi tresna lagungarria da tresnaren instalatu dugun
programak idazteko erraztea da sarrera erabiltzaile abisua.
Bideo honetan, tira itzuli gara oihala eta zer zehazki CS50 liburutegian begiratu.
>> C liburutegiak bideoa, hitz egin dugu nola sartzeko goiburu fitxategiak
iturburu-kodea liburutegia,
eta, ondoren, liburutegi fitxategi bitar-lotzen fasean
konpilazio prozesuak.
Goiburu fitxategiak zehaztu liburutegian interfazean.
Hau da, liburutegia baliabide guztiak ditu eskuragarri erabili nahi duzun zehatz-mehatz dute,
funtzioa-aitorpenak, konstanteak, eta datu-mota bezala.
Bitarra liburutegia liburutegia ezartzeko badu,
liburutegiko goiburua fitxategiak eta liburutegiaren c iturburu-kodea fitxategiak konpilatu.
>> Bitarra liburutegia ez da oso interesgarria begiratzen da, izan ere, 'binary.
Beraz, dezagun liburutegia fitxategiak goiburua ordez begirada bat.
Kasu honetan, ez dago bakarra goiburua izeneko fitxategi cs50.h.
Instalatuko dugu besteak beste, erabiltzailearen direktorioa
beste sistema liburutegiak 'goiburu fitxategiak batera.
>> Nabarituko duzu lehen gauza bat da cs50.h # goiburua beste liburutegi fitxategiak
float, mugak, standard nuen, eta estandar lib.
Gurpila estilu printzipioa jarraituz,
eraiki dugu beste tresna batzuk Gurekin erabiliz CS0 liburutegia.
>> En la biblioteca ikusiko dituzu hurrengo gauza da definitzen dugun izeneko mota berri bat "katea."
Lerro honek benetan just * char mota ezizen bat sortzen,
beraz, ez da magikoki imbue atributuak katea mota berri
normalean katea beste hizkuntza batzuetan objektu lotutako
hala nola, luzera.
Egin dugu honen arrazoia da, programatzaileak armarria berrien góry xehetasunak
erakusleak dira prest arte.
>> Goiburu-fitxategia hurrengo funtzioen adierazpen
CS50 liburutegia dokumentazio batera eskaintzen du.
Iragarki xehetasun maila iruzkinak hemen.
Hau da super garrantzitsua da, beraz, jendeak jakin nola funtzio hauek erabiltzeko.
Aldarrikatzen dugu, aldi berean, erabiltzaileak eta bueltan karakteretan, bikoiztu, karroza, ints gonbita funtzionatzen,
luze Longs, eta kateak, gure kate-mota erabiliz.
Informazioa ezkutatzea printzipioa jarraituz,
jarri dugu gure definizioa bat bereizi c ezartzeko fitxategia cs50.c--
Erabiltzaile iturburu direktorioan kokatzen da.
Fitxategi hori eman dugu, beraz, itxura bat hartu ahal izango duzu ere.
ikasteko, eta birkonpilatzeko makina ezberdinetan, nahi izanez gero,
nahiz eta hobe da tresna klase honetan lan egin uste dugu.
Dena den, dezagun begirada bat.
>> Funtzioak GetChar, GetDouble, GetFloat, GetInt, eta GetLongLong
funtzioa GetString gainean eraiki zen.
Bihurtzen da, guztiak direla funtsean berdina eredua jarraitu.
Bitartean begizta bat erabiltzen dute sarrera-lerro bat erabiltzaileari galdetuko.
Erabiltzaileak input lerro huts bat izanez gero, balio berezi bat itzuliko dute.
Erabiltzailearen sarrera analizatu motaren arabera saiatuko dira,
izango da karakterra, bikoitz bat, mugikor bat, eta abar.
Eta gero itzuli edo sarrera zuzen analizatu
edo erabiltzailea reprompt dute.
>> Maila altua, hemen ez dago ezer benetan delikatua da.
Idatzi dezakezu, era berean, egituratutako kodea bakarrik iraganean.
Agian gehien parte críptica begira dei erabiltzailearen sarrera parses duen sscanf da.
Sscanf sarrerako formatua bihurketa familiaren zati bat da.
Standard io.h bizi da, eta bere lana da, C kate bat analizatu,
formatu jakin baten arabera, aldakorra emaitzak parse gordetzeko
deitzaileari emandako.
Sarrerako formatua bihurketa funtzioak oso erabilgarriak dira, asko erabiltzen den funtzio direnez
ez dira super intuitiboa lehen at,
joan beharko dugu nola sscanf funtzionatzen.
>> Sscanf lehen argumentua da char * karaktere bat erakuslea.
Funtzioa behar bezala lan egiteko,
pertsonaia bat C Kate baten lehen karakterea izan behar du,
\ null izaera 0 amaitu.
Katea analizatu
Sscanf argudio bigarren formatu katea da,
normalean kate-konstante bat igaro ondoren,
eta ikusi izan liteke hau atsegin katea printf erabiliz aurretik.
Formatu katea saioa ehuneko A bihurketa adierazlea bat adierazten du.
Pertsonaia berehala ehuneko ikurra ondoren,
C mota nahi dugun sscanf bihurtzeko adierazten du.
GetInt, ez dagoela% d eta% c ikusiko duzu.
Horrek esan nahi du, sscanf dela hamartar int saiatu -% d - eta char bat -% c.
Formatu katea adierazlea bihurketa bakoitzean,
sscanf espero dagokion argumentu bat geroago bere argumentua zerrendan.
Argumentua behar dela kokapen egokia idatzitako bat seinalatu
bihurketa emaitza gordetzeko.
>> Hau egiteko modu tipikoa da, aldagai bat sortzeko pilaketan sscanf dei aurretik
katea analizatu nahi duzun elementu bakoitza
eta, ondoren, erabili helbide operadorea ampersand - erakusleak pasatzeko
aldagai berri horien, sscanf deia.
GetInt zehazki egiten dugu hau ikus dezakezu.
Eskuin sscanf dei aurretik, int izeneko n eta pilaketan dei char c aldarrikatzen dugu,
eta horien erakusle pasatzen dugu sscanf deialdian sartu.
Aldagai horiek part pilaketan esleitutako lekua erabiliz nahiago
malloc zeure, malloc deia goiburu saihesteko geroztik,
eta ez duzu memoria leaking kezkatu.
Ez da ehuneko ikurra aurrizki Pertsonaiak ez galdetu bihurketa.
Beharrean formatu zehaztapen besterik ez dute gehitzeko.
>> Adibidez, kate formatua GetInt ziren% d bat izanez gero, horren ordez,
sscanf gutun int bat bilatzeko,
eta int bihurtzeko saiatuko bitartean, ez litzateke beste edozer bat.
Honen salbuespen bakarra zuriunez da.
White espazioa formatu katea karaktere zuriuneak zenbatekoa edozein dator -
are none guztiak.
Beraz, zergatik comment aipatzen ziurrenik liderra eta / edo zuriuneak amaierako.
Beraz, puntu hau begiratzen gure sscanf dei bezala, erabiltzaileak sarrera-katea analizatu saiatuko da
liderra posible zuriunez egiaztapena,
bihurtuko da eta aldagai int n gordetako int ondoren
zuriunez zenbatekoa batzuk jarraian, eta karaktere bat, eta jarraian
char c aldagaia gordetzen da.
>> Itzultzen den balioa zer?
Sscanf sarrerako lerroan analizatu hasiko da eta bukatu,
den amaierara iristean gelditu denean, edo pertsonaia bat sarrera
ez dator bat formatu pertsonaia bat denean, edo ezin da bihurketa bat egiteko.
Denean gelditu bakar itzuli balioa erabiltzen da.
Gelditu bada, sarrerako kate amaiera iritsi delako
bihurketa edozein egin aurretik eta formatu katea zati bat huts egin aurretik,
gero berezia etengabeko EOF itzuliko da.
Bestela, bihurketa arrakastatsua kopurua itzultzen du,
0, 1 edo 2 izan daiteke, bi bihurketa dugu eskatu geroztik.
Gure kasuan, ziurtatu erabiltzaileak int eta int bat bakarrik idatzi egin nahi dugu.
>> Beraz, sscanf 1 itzuli nahi dugu. Ikusi zergatik?
Sscanf itzuli 0 bada, orduan bihurketa ez egin ziren,
horrela, erabiltzaileak idatzitako sarrera hasieran int bat baino zerbait beste.
Sscanf itzultzen 2 bada, orduan erabiltzaileak ez du behar bezala idatzi sarrera hasieran,
baina gero, ez-zuriuneak karaktere batzuk idatzi gero
c conversion% geroztik egin da.
Wow, nahiko funtzio deia azalpen luze bat.
Dena den, nahi duzun sscanf eta bere anai-arrebak buruzko informazio gehiago izanez gero,
check out man orriak, Google, edo biak.
Formatu katea aukera asko daude,
eta horiek gorde ahal eskuzko lan asko kateak analizatu C. nahian
>> Azken liburutegian funtzioa begiratzen GetString.
Bihurtzen da GetString delikatua funtzioa behar bezala idatzi da,
arren, badirudi, simple, besteak beste, zeregin komun bezala.
Zergatik da kasu honetan?
Beno, dezagun nola line gordetzeko dugu pentsatu erabiltzaileari mota sartu
Kate bat karakteretan sekuentzia bat denez,
array batean gorde pilaketan nahi dugu agian,
baina zenbat denboraz array izango denean aldarrikatzen dugu jakin beharko genuke.
Era berean, zeure gainean jarri nahi dugu,
malloc gainditu nahi erreserba dugu byte kopurua behar dugu,
baina hori ezinezkoa da.
Ez daki zenbat karakteretan erabiltzaileak idazten ditugu
Erabiltzaileak benetan aurretik idatzi du.
>> Arazo honen konponbidea inozoa da soilik erreserbatu espazioaren zati handi bat, adibidez,
1000 erabiltzailearen sarrera karaktere bloke bat,
Erabiltzaileak ez litzateke inoiz kate bat idatzi luze suposatuz.
Bi arrazoigatik ideia txarra da.
Lehenik eta behin, erabiltzaile normalean ez kate batean idatzi luze suposatuz,
memoria asko alferrik izan duzu.
Makina moderno On, hori ez da arazo bat izan badituzu
instantzia isolatu bat edo bi,
baina ari zaren erabiltzailearen sarrera badu, begizta batean eta geroago erabiltzeko gordetzeko,
azkar dezakezu zurrupatu memoria tona bat.
Horrez gain, idazten ari zaren programa izanez gero, ordenagailu bat txikiagoa da
smartphone bat edo beste zerbait memoria mugatua duten bezala gailu bat -
irtenbide hau, arazoak sor ditzakete asko azkarrago.
Bigarren, arrazoi larriak ez uzten zure programa zaurgarria
zer izeneko bat buffer-gainezkatzea erasoa.
Programazioa, buffer bat sarrera edo irteerako datuak aldi baterako gordetzeko memoria erabiltzen da,
kasu honetan, gure 1000-char blokea da.
Buffer gainezkatzea A gertatzen da datuak blokearen amaiera iraganeko idatzi.
>> Adibidez, erabiltzaile batek benetan ez badu mota baino gehiago 1000 karakteretan.
Bizi izan dezakezu hau ustekabean denean array programazioa.
10 ints array bat izanez gero, ez da ezer gelditzen da, irakurri edo idazten saiatu
15ean int.
Konpilatzailea abisu edo akatsak ez daude.
Programa hanka sartzeak Zuzen eta memoria sartzen
non pentsatzen int 15ean izango da, eta hau da zure beste aldagai ordezka ditzakete.
Kasurik okerrenean, zure programaren barne batzuk gainidatzi dezakezu
kontrol-mekanismoak, zure programa eragin desberdinak benetan exekutatu jarraibideak
asmoa baino.
>> Orain, berriz, ez da ohikoa hori egin nahi gabe,
baina hau nahiko ohikoa teknika txarra guys erabiltzen duten programak apurtu da
eta kode maltzurren jarri besteen ordenagailuetan.
Hori dela eta, ezin dugu erabili gure inozoa konponbidea.
Zaurgarria izatea gure programak saihesteko modu bat behar dugu
to bat buffer gainezkatzea erasoa.
Horretarako, ziurtatu gure buffer irakurri dugun bezala hazten egin behar dugu
Erabiltzaileak sarrera gehiago.
Irtenbidea? Zeure esleituriko buffer erabiltzen dugu.
Tamainaz aldatu ahal izango dugu geroztik erabiliz resize idazketa funtzioa,
eta segimendua egiteko bi zenbakien hutsaren hurrengo slot indizea bufferraren
eta luzera edo bufferraren gaitasuna.
Erabiltzaile bat karakteretan irakurri dugu denbora bat fgetc funtzioa erabiliz.
Argumentua fgetc funtzioa hartzen - stdin - erreferentzia bat da, sarrera estandarra katea,
sarrera kanal preconnected hori erabiltzailearen sarrera transferitzeko erabiltzen da
terminalean programa.
>> Bakoitzean pertsonaia berri bat erabiltzaileak motak, ikus egiaztatu indizearen
free slot hurrengo plus 1 bufferraren gaitasuna baino handiagoa da.
+1 Hurrengo free indizea delako 5 dator,
ondoren, gure buffer luzera 6 esker 0 indexatzeko izan behar du.
Exekutatzen dugu bada espazio bufferraren, gero tamaina aldatu saiatuko gara,
bikoiztu egin da, beraz, behera moztu dugu zenbat aldiz tamaina aldatzeko dugun
Erabiltzaileak bada benetan kate luzea idazten.
Katea luzeegia badu ahaztuak edo exekutatu dugu zeure memoria,
bufferrean eta bueltan null askatzea dugu.
>> Azkenik, karakterra bufferraren erantsi dugu.
Erabiltzaile hits sartu edo ondoren itzultzeko, linea berri bat seinaleztapen,
edo berezia char control d sarrera amaiera seinaleak,
Erabiltzaileak benetan ezer idatzi guztiak ikusteko txeke bat egiten dugu.
Hala ez bada, null itzuliko gara.
Bestela, gure buffer da seguruenik behar baino handiagoa dugu delako,
txarrena kasuan, ia bi aldiz handiak behar dugu
tamainaz aldatu dugu denbora behin bikoiztu egin dugu aurrera,
espazioaren zenbatekoa behar ditugu erabiliz katea kopia berri bat egiten dugu.
Extra 1 malloc dei bat gehitu dugu,
\ 0 -, beraz, null berezia amaierako karakterea espazio
erantsi dugu pertsonaien gainerako katea kopiatzen dugu behin,
strncpy ordez strcpy
beraz, zehatz-mehatz zenbat karakteretan kopiatu nahi dugun zehaztu ahal izango dugu.
Strcpy kopiatzen hits a \ 0 arte.
Ondoren, gure buffer libre dugu eta kopia deitzaileari itzultzeko.
>> Nor bazekien simple-seeming funtzio bat, hala nola, beraz, zaila izan behar da?
Orain badakizu zer CS50 liburutegia doa.
>> Nire izena Nate Hardison da, eta hau da CS50.
[CS50.TV]