[Powered by Google Translate] [CS50 Kitabxana]
[Nate Hardison] [Harvard Universiteti]
[Bu CS50 edir. CS50.TV]
The CS50 kitabxana biz cihaz yüklü bir faydalı vasitədir
Siz proqramları yazmaq üçün daha asan daxil üçün tez users.
Bu video, biz pərdə geri çəkmək lazımdır və CS50 kitabxana məhz nə oldu.
>> C kitabxanalar haqqında video, sizdən # başlıqlarını faylları daxil haqqında danışmaq
Sizin mənbə kitabxana,
və sonra keçid mərhələsində ikili kitabxana fayl ilə keçid
tərtibi prosesi.
Başlığı fayllar kitabxana interface daxil.
Yəni, onlar ətraflı istifadə etmək üçün kitabxana mövcud olan resursların bütün deyil,
funksiyası bəyannamələrin, sabitləri və məlumat növləri kimi.
Ikili kitabxana fayl, kitabxana həyata keçirilməsi şey
olan kitabxana mövzu faylları və kitabxana var. c kodunu faylları tərtib edilir.
>> Bu ikili kitabxana faylı ikili, yaxşı, var-ci ildən baxmaq çox maraqlı deyil.
Belə ki, ən header kitabxana üçün faylları yerinə nəzər salaq.
Bu halda, cs50.h. adlanan yalnız bir mövzu fayl var
Biz istifadəçi yüklü sonra kataloqu daxildir
başqa sistem kitabxanaları 'başlığı faylları ilə birlikdə.
>> Siz görəcəksiniz ilk şey biri cs50.h # digər kitabxanalardan mövzu faylları ehtiva edir -
float, limitlərinə, standart bool və standart lib.
Yenə Həcm yeniləndirir deyil prinsipi sonra,
digər bizim üçün alətlər istifadə edərək CS0 kitabxana inşa etdik.
>> Siz kitabxana görəcəksiniz növbəti şey biz adlı yeni növü müəyyən ki "string".
Bu xətt həqiqətən yalnız char * növü üçün bir alias yaradır,
belə ki, magically atributları ilə yeni string növü imbue deyil
adətən, digər dillərdə string obyektləri ilə bağlı
belə uzunluğu kimi.
Biz bu etdik səbəb Qori details yeni proqramçılar dəf etmək
göstəricilərinə onlar hazır qədər.
>> Mövzu fayl növbəti hissəsi funksiyaları elan edir
bu CS50 kitabxana sənədləri ilə birlikdə təmin edir.
Burada şərh detal səviyyəsində edək.
Insanlar bu funksiyaları necə istifadə bilirik ki, bu mühüm super edir.
Biz öz növbəsində, bəyan, istifadəçi və qaytarılması chars, ikiqat, üzüb gedirdi, ints, istemek üçün fəaliyyət
uzun longs və strings, öz string növü istifadə edərək.
Məlumat gizlətmək prinsipi sonra,
. bir ayrı c həyata faylı bizim definition qoyduq - cs50.c -
istifadəçi mənbə kataloq yerləşir.
Siz nəzər ki, Biz ki, fayl verdik
bu məlumat və istədiyiniz əgər müxtəlif maşınlar üzrə derleyeceğiz,
biz bu sinfi üçün cihaz üzərində işləmək üçün daha yaxşı hesab edirəm baxmayaraq.
Hər halda, indi bu nəzər salaq.
>> Funksiyaları GetChar, GetDouble, GetFloat, GetInt və GetLongLong
bütün GetString funksiyası üst inşa edilir.
Onlar bütün mahiyyətcə eyni model aşağıdakı çıxır.
Onlar daxil bir xətt üçün istifadəçi təklif bir müddət loop istifadə edin.
Onlar istifadəçi giriş boş line əgər xüsusi bir dəyər qayıt.
Onlar müvafiq növü kimi istifadəçi daxil analiz etməyə cəhd
bir char, ikiqat, bir float və s olmaq
Daxil uğurla ayrıştırılan edilib və onlar da nəticə qayıtmaq
və ya istifadəçi reprompt.
>> Yüksək səviyyədə, həqiqətən çətin bir şey burada var.
Siz keçmişdə eyni strukturlaşdırılmış kodu özünüzü yazılı ola bilər.
Bəlkə də ən sirli görünüşlü hissəsi istifadəçi daxil çözümler ki sscanf çağırışdır.
Sscanf giriş format dönüşüm ailə hissəsidir.
Bu standart io.h yaşayır və onun iş C simli analiz edir
dəyişən ildə parse nəticələri saxlanılması, müəyyən format uyğun
zəng tərəfindən təmin.
Giriş format dönüşüm funksiyaları çox faydalı, çox istifadə funksiyaları ildən
Əvvəlcə intuitiv super deyil
biz sscanf necə artıq getmək lazımdır.
>> Sscanf üçün ilk arqument bir char * - Bir xarakter bir göstərici.
Funksiyası düzgün qaydada işləməyəcək, üçün
ki, xarakteri, C simli ilk karakter olmalıdır
bu null \ 0 xarakteri ilə xitam.
Bu analiz üçün simli edir
Sscanf ikinci dəlil, bir format string edir
adətən, bir string daimi kimi qəbul
və printf istifadə edərkən əvvəl bu kimi bir string görmüşəm bilər.
Format string bir faiz giriş dönüşüm belirteci göstərir.
Xarakteri dərhal bir faiz işarəsi aşağıdakı
biz çevirmək sscanf istəyirəm ki, C tipi göstərir.
GetInt, bir% d və% c olduğunu görürük.
% D - - və char - Bu% c Bu sscanf bir decimal int çalışacağıq deməkdir.
Format string hər dönüşüm belirteci üçün,
sscanf onun arqument siyahısı müvafiq arqument sonra gözləyir.
Bu arqument bir müvafiq tipli yeri qeyd olunmalıdır
dönüşüm nəticəsində saxlamaq üçün olan.
>> Bunu ən tipik yolu sscanf zəng əvvəl yığını bir dəyişən yaratmaq
Siz simli olan analiz etmək istəyirəm ki, hər bir maddə üçün
göstəricilərinə keçmək - Bu işareti - və sonra ünvan operator istifadə
bu sscanf zəng etmək üçün o dəyişənlər üçün.
Siz GetInt biz məhz bunu görə bilərsiniz.
Sağ sscanf zəng əvvəl, biz, n adlı int və yığını bir char zəng c elan
və biz sscanf zəng daxil onlara göstəricilərinə keçir.
Yığını bu dəyişənlərin verilməsi ayrılmış yerin istifadə üzərində üstünlük verilir
Siz malloc zəng yerüstü qarşısını ildən malloc ilə yığın, haqqında,
və yaddaş sızması narahat yoxdur.
Bir faiz işarəsi ilə prefixed deyil uchun dönüşüm təklif yoxdur.
Əksinə onlar yalnız format dəqiqləşdirilməsi əlavə edin.
>> Məsələn, GetInt biçimi simli əvəzinə% d olsaydı,
sscanf, bir int sonra bir hərf üçün görünür
bu int çevirmək üçün cəhd edəcəyini isə, bu bir ilə başqa bir şey deyil.
Bu yeganə istisna ağ edir.
Format string Ağ kosmik simvol ağ hər hansı məbləğ uyğun -
bütün hətta heç biri.
Yorum aparıcı və / və ya ağ arxada ilə bəlkə qeyd niyə Belə ki, var.
Belə ki, bizim sscanf zəng kimi görünür bu nöqtədə istifadəçi daxil simli analiz etməyə çalışacağıq
mümkün aparıcı ağ kontrol edərək,
bu int dəyişən n çevrilir və saxlanılır ki, bir int sonra
ağ bəzi məbləği izlədi və xarakter izlədi
bu char dəyişən c saxlanılır.
>> Qaytarılması dəyəri nədir?
Sscanf, başdan giriş xətti analiz edəcək
daxil bir xarakter onu sonuna çatdıqda dayandırılması və ya
bir format xarakter uyğun deyil və ya bir dönüşüm etmək bilər.
Bu qaytarılması dəyəri dayandırdığı vahid üçün istifadə olunur.
Bu giriş simli sonuna çatmışdır, çünki o, dayandı edin
Hər hansı bir dönüşüm etməzdən əvvəl və format string hissəsi uyğun etməyərək əvvəl,
sonra xüsusi daimi EOF qaytarılır.
Əks halda, bu, uğurlu dönüşüm sayı qaytarır
biz iki dönüşüm üçün xahiş etdik bəri olan, 0, 1, 2 və ya ola bilər.
Bizim halda, biz istifadəçi int və yalnız int çap əmin etmək istəyirəm.
>> Belə ki, biz sscanf 1 qayıtmaq istəyirəm. Niyə görmək?
Sscanf 0 döndü, onda heç bir dönüşüm edildi
belə istifadəçi giriş əvvəlində bir int-dən başqa bir şey yazılmış.
Sscanf 2 qaytarır, onda istifadəçi düzgün daxil əvvəlində bu yazın vermədi
lakin sonra sonra bəzi qeyri-ağ xarakter tipli
ən% ildən c dönüşüm oldu.
Wow, ki, tamamilə bir funksiyası zəng üçün uzun izahat var.
Hər halda, siz sscanf və onun qardaşları haqqında daha ətraflı məlumat istəyirsinizsə,
adam pages, Google, və ya hər ikisi oldu.
Format string variantları çox var,
C. strings analiz çalışırken və bu siz əl əməyi bir çox saxlaya bilərsiniz
>> Baxmaq üçün kitabxana son funksiyası GetString edir.
Bu, GetString düzgün yazmaq çətin funksiyası çıxır ki,
bu sadə, ümumi tapşırıq kimi görünür baxmayaraq.
Nə üçün bu belədir?
Yaxşı, necə biz line saxlamaq olacaq düşünmək edək ki, daxil istifadəçi növləri
Simli chars bir ardıcıllıqla deyil, ildən
biz yığını bir sıra onu saxlaya bilərsiniz
lakin biz bəyan zaman array olacaq nə qədər bilmək lazımdır.
Eyni zamanda, biz yığın qoyun istəyirsinizsə,
biz malloc biz ehtiyat istəyirəm bytes sayı keçmək lazımdır
lakin bu, mümkün deyil.
Biz istifadəçi yazın necə çox chars heç bir fikrim yoxdur
istifadəçi həqiqətən, onlara yazın deyil əvvəl.
>> Bu problem üçün sadə həll yalnız, kosmik böyük bir yığın saxlayırıq ki, edir
istifadəçi giriş üçün 1000 chars blokunun,
istifadəçi uzun bir string yazın heç vaxt fərz etsək.
Bu iki səbəbə görə pis bir fikirdir.
Birincisi, istifadəçilər adətən uzun strings yazın olmayan fərz
yaddaş bir çox sərf edə bilər.
Bunu əgər müasir maşınlar, bu məsələ ola bilər
bir və ya iki ayrı-ayrı hallarda,
ancaq bir döngü istifadəçi daxil edir və sonra istifadə üçün saxlanılması edirsinizsə,
tez yaddaş ton qədər sormaq bilər.
Bundan əlavə, əgər yazılı etdiyiniz proqram kiçik bir kompüter üçün -
məhdud yaddaş ilə smartphone və ya başqa bir şey kimi bir cihaz -
Bu həll bir çox daha sürətli problemləri səbəb olacaq.
Bunu ikinci, daha ciddi səbəb bu həssas proqram yaradır ki,
bufer daşqın hücum deyirlər nə.
Proqramlaşdırma, bir bufer müvəqqəti giriş və ya çıxış veri istifadə yaddaşı
bu halda bizim 1000-char blok olan.
Data blokunun sonunda keçmiş yazılı zaman bir bufer daşqın baş verir.
>> Məsələn, bir istifadəçi əslində 1000-dən çox chars yazın əgər.
Diziler ilə proqramlaşdırma zaman təsadüfən bu təcrübəli ola bilər.
10 ints bir sıra varsa, heç bir şey oxumaq və ya yazmaq üçün çalışırıq sizə vermir
15 int.
Heç bir compiler xəbərdarlıq və ya səhvlər var.
Bu proqram yalnız düz irəli blunders və yaddaş çatmaz
o hesab etdiyi 15 int olacaq və bu digər dəyişənlərin üzerine bilər.
Ən pis halda, siz proqram daxili bəzi üzerine bilər
nəzarət mexanizmləri, proqram səbəb əslində müxtəlif təlimat yerinə
Əgər nəzərdə tutulan çox.
>> İndi, o, təsadüfən bunu ümumi deyil
ancaq bu pis uşaqlar proqramları pozmaq üçün istifadə edən kifayət qədər ümumi texnika
və digər insanların kompüter zərərli kodu qoydu.
Buna görə də, biz yalnız bizim sadəlövh həll istifadə edə bilməz.
Biz zəif olan bizim proqramları qarşısını almaq üçün bir yol lazımdır
bufer daşqın hücum.
Bunu etmək üçün, biz oxumaq kimi bufer inkişaf edə bilər ki, əmin etmək lazımdır
istifadəçi daha girdi.
Həlli? Biz bir yığın ayrılmış tampon istifadə edin.
Biz boyutlandır bilər-ci ildən o, ölçüsünü də realloc funksiyasından istifadə
və biz iki ədəd takip - Növbəti boş slot göstəricisi tampon ilə
, uzunluğu və ya tampon gücü.
Biz fgetc funksiyası istifadə edərək, bir vaxt istifadəçi bir Sandıqı oxumaq.
Stdin - - Bu fgetc funksiyası edir arqument, standart giriş string istinad edir
hansı istifadəçi daxil köçürmək üçün istifadə bir preconnected giriş kanalı
terminaldan proqram.
>> Zaman yeni bir xarakter istifadəçi növləri, biz kontrol əgər indeksi
növbəti pulsuz slot müsbət 1 bufer tutumu çox böyükdür.
The +1, növbəti pulsuz index 5 əgər çünki gəlir
sonra bufer uzunluğu 6 sayəsində 0 endeksleme olmalıdır.
Biz bufer yer tökülmək varsa, onda biz, bu ölçüsünü cəhd
biz ölçüsünü ki, sayını azaltmaq ki, bu misli
istifadəçi həqiqətən uzun string yazaraq olunur.
Simli çox uzun kazanılmış və ya biz yığın yaddaş tökülmək əgər varsa,
biz bufer və qaytarılması null pulsuz.
>> Nəhayət, biz bufer üçün char əlavə.
Istifadəçi Xit daxil edin və ya qayıtmaq, yeni xətt siqnalizasiya, sonra
və ya xüsusi char - nəzarət d - input son xəbərdarlıq edən
biz istifadəçi həqiqətən bütün bir şey çap görmek üçün bir çek yoxdur.
Əgər, biz null qayıtmaq.
Əks halda, bizim bufer biz ehtiyac çox güman ki, daha böyük, çünki
ən pis halda biz lazım olan kimi demək olar ki, iki dəfə böyük var
biz ölçüsünü hər dəfə iki ildən
biz lazımdır ki, yer yalnız məbləği istifadə edərək string yeni bir kopyasını edir.
Biz malloc zəng üçün əlavə 1 əlavə
olan \ 0 - xüsusi null terminator xarakter üçün yer var ki,
olan biz simvol qalan surəti dəfə biz simli üçün əlavə,
əvəzinə strcpy və strncpy istifadə
ki, biz kopyalamak etmək istəyirsinizsə tam olaraq necə bir çox chars belirtebilirsiniz.
Bir \ 0 xit qədər Strcpy nüsxə.
Sonra bufer azad və zəng etmək surəti geri.
>> Kim belə bir sadə zahiri funksiyası belə mürəkkəb ola bilər bilirdi?
İndi CS50 kitabxana gider bilirik.
>> My name Nate Hardison və bu CS50 edir.
[CS50.TV]