[Musiikki soi] ROB BODEN: Selvä. Joten, ensimmäinen asia ensin, video alkaen tutut kasvot. [VIDEOTOISTOSTA] -Selvä. Tämä on CS50, ja tämä on alussa viikolla kolme. Olen pahoillani, etten voinut olla siellä teidän kanssanne tänään, mutta saanen esitellä CS50 oma Rob Boden. [END VIDEOTOISTOSTA] [APPLAUSE ja kippis] ROB BODEN: filmografia in että video on fantastinen. Selvä. Ensin on toinen lounas. Se on huomenna klo 01:15. Ei ole lounasta perjantaina. Se on kanssa Quora. Tommy ei ole täällä vielä, mutta yksi ihmiset on entinen CF Tommy McWilliam. Joten hän on hauska kaveri. Sinun pitäisi tulla. Selvä. Joten viime viikolla, aloimme rikkomatta toisistaan mitä merkkijono todella on. Olemme tienneet alusta lähtien, että se merkkijono. Mutta viime viikolla eläytyä siihen, että mikä on todella sekvenssi merkkiä, hyvin, meillä on nyt ryhmät merkkiä. Ja tiedämme, että merkkijono, se on array merkkejä, aivan lopussa, meillä on tämä erityinen null tavu, tämä backslash 0, joka ilmaisee pää merkkijono. Ja niin merkkijono on joukko merkkiä, mutta voimme olla yli vain erilaisia ​​merkkejä, meillä voi olla erilaisia ​​tahansa tyyppinen asia haluamme. Joten, jos muistatte viime viikolla, Aikuisten ohjelma, David käyttöön todella nopeasti. Joten ensimmäinen asia aiomme tehdä, on kysyä käyttäjältä kokonaisluku, joukko ihmisiä huoneeseen. Kun meillä on tuo kokonaisluku, me julistaa array. Huomata tämän kiinnike syntaksin. Olet menossa tottua siihen. Joten olemme julistamalla joukko kokonaislukuja nimeltään ikäisille, ja siellä on n kokonaislukuja tässä array. Joten tämä kuvio täällä, tämä 4 int i on 0, i on pienempi kuin n, i plus plus, joka on myös olemaan malli että saat hyvin tottunut. Koska se on aika paljon, miten olet aina menossa kerrata yli paneelit. Niin muista, että n on pituus meidän array. Ja niin täällä, me pyytävät toistuvasti iän henkilö i huoneessa. Tämän jälkeen menemme alas, ja jostain mielivaltainen syy, me sitten tulostaa kuinka vanhoja he aikovat olla vuoden päästä. Ja käynnissä ohjelman, katsotaanpa tehdä ikäisille, piste slash ikäisille. Joten ihmisten määrä huoneeseen, sanokaamme on kolme. Ja sanoa, ensimmäinen henkilö on 13, seuraava on 26, ja viimeinen on 30. Niin sitten se tulee kerrata yli nämä kolme ihmiset, tulostaa 14, 27 ja 31. Muista siis, että kun julistamme taulukon koko n, indeksit että array, array on arvojen ja indeksit 0, 1, 2, aina enintään n miinus 1. Joten kun sanoimme, että kolme ihmistä huoneessa, ja me laittaa tänne ensimmäistä iterointia kautta silmukka, i tulee olemaan 0. Joten indeksi 0. Olemme osoitetaan ensin ikä käyttäjä syöttää. Sitten seuraava, olemme syöttämällä Toinen n käyttäjä syöttää ja vieressä kaksi, n viimeksi. Niin huomaa, että taulukon koko kolme ei ole mitään indeksissä kolme. Tämä ei ole voimassa. Selvä. Joten, menee takaisin tänne. Joten nyt olemme kohdanneet paneelit, meillä on joitakin tuttuus. Nyt aiomme siirtyä komento argumentteja, jotka tulevat olemaan melko vaikutusta tähän ongelmakenttään asettaa. Joten asti, kun olet julisti teidän päätehtävä, olemme sanoi int main void. Joten void vain sitä, että emme ohimennen mitään argumentteja tätä toimintoa. Nyt aiomme nähdä, että tärkeimmät voi kestää joitakin perusteluja. Täällä kutsumme heitä int argc ja merkkijono argv suluissa. Suluissa jälleen kerran osoittaa, että olemme tekemisissä paneelit. Joten tässä, merkkijono argv suluissa, olemme käsittelevät Merkkijonotaulukko. Niin argc, että menee ilmoittamaan kuinka monta argumenttia olemme kulunut tähän ohjelmaan. Ja nähdä, mitä se tarkoittaa, , hoidetaan tämä. OK. Joten asti, Teimme kaikki Ohjelma kuten piste slash ikäisille. Voimme myös komentoriville ohi argumentteja, mikä termi, komento argumentteja. Joten ensimmäinen väite, hello world. Joten tässä, argc olisi kolme. Se on määrä argumentteja komentoriviltä. Argc on aina vähintään 1, koska piste slash ikäisille, itse, lasketaan yhdeksi komentoriviargumentteja. Sitten hei on ensimmäinen. Jos piste slash ikäisille on zeroth sitten hei on ensimmäinen, ja maailma on Toinen komentorivillä. Joten merkkijono argv, aiomme nähdä, sisältää jouset, piste slash ikäisille, hei, ja maailma. Ja David pyynnöstä olemme menossa pelata video käyttöön että. [VIDEOTOISTOSTA] -Tähän asti ohjelmissa olemme kirjoitettu, olemme julistaa Tärkein int main void. Ja koko tämän ajan, että mitätön on yksinkertaisesti täsmennetään, että Ohjelma ei ota mitään komentoriviargumentteja. Toisin sanoen, kun käyttäjä suorittaa ohjelmaa, hän voi antaa komennon argumentteja kirjoittamalla lisää sanoja tai lauseita jälkeen ohjelman nimi kehoitteeseenexit. No, jos et haluat ohjelman ottaa komentoriviargumentteja, yksi tai enemmän sellaisia ​​sanoja, meidän on korvattava mitätöidä pari argumentteja. Tehdäänpä että. Sisällytä CS50.h. Ovat standardin io.h. Int main. Ja nyt, sen sijaan mitätön, aion määrittää int nimeltään argc, ja Merkkijonotaulukko kutsutaan argv. Nyt argc ja argv ovat yksinkertaisesti yleissopimukset. Olisimme voineet nimeltään nämä väitteet melkein mitä haluamme. Mutta mikä on tärkeää on, että argc on int koska määritelmän, se on menossa sisältää väitteen määrä, sanojen määrä yhteensä, että käyttäjä on kirjoitettuna hänen ajallaan. argv puolestaan ​​argumentti vektori, on menossa todella array tallentaa kaikki sanat, jotka käyttäjä on kirjoitettuna hänen ajallaan. Katsotaanpa edetä tehdä jotain nyt jossa on yksi tai useampi näistä komentoriviargumentteja. Erityisesti, mennään eteenpäin ja tulosta mitä sana käyttäjätyyppeihin jälkeen ohjelman nimi kehoitteeseenexit. Alkusulkumerkki. Loppusulkumerkki. Printf prosenttia s kenoviiva ja pilkku. Ja nyt minun täytyy kertoa printf mitä arvoa liittämisen että paikkamerkkiin. Haluan ensimmäinen sana, joka käyttäjällä on kirjoitit jälkeen ohjelman nimi, ja niin aion määritellä argv kiinnike 1, lähellä suluissa, puolipiste. Nyt, miksi kannatin 1 eikä kiinnike 0? No, se kääntyy pois, tallennetaan automaattisesti in argv 0 tulee olemaan Ohjelman varsinainen nimi. Joten ensimmäinen sana, että käyttäjä tyypit jälkeen ohjelman nimi on, by yleissopimus, olemaan tallennettu argv 1. Katsotaanpa nyt koota ja suorita tämä ohjelma. Tee argv 0, dot slash argv 0. Ja nyt sana kuin hei. Enter. Ja siellä meillä on, hei. [END VIDEOTOISTOSTA] ROB BODEN: Selvä. Sulje tämä. Joten vilkaisemalla kyseisessä ohjelmassa, jossa me vain esitteli meille hyvin, vain näyttää, jos me painamme argv 0, tee, nyt mitä se on, argv 0, dot slash argv 0. Joten, odotetusti, se tulostaa Ohjelman nimi, koska argv 0 on aina olemaan Ohjelman nimi. Mutta tehdään jotain hieman mielenkiintoisempaa. Joten ongelma asetettu, voit olla otettu käyttöön tämän toiminnon, atoi. Joten mitä me käytämme atoi varten? Se menee muuntaa merkkijono kokonaisluku. Joten jos kuljen merkkijono, yksi kaksi kolme, to atoi, joka tulee muuntaa että on kokonaisluku, yksi kaksi kolme. Menemme siis muuntaa ensin komentorivin argumentti kokonaisluku, ja sitten vain tulostaa että kokonaisluku. Joten periaatteessa, olemme tavallaan reimplementing getint, vain kokonaisluku on kirjattu komento linja sijaan ohjelmaan vuorovaikutteisesti. Joten sitten, jolloin argv 0, tehdään se tänne, ja sulje se. Joten käynnissä argv 0, ja lähdetään kirjoita kokonaisluku, yksi kaksi kolme neljä yksi kaksi. Joten se tulostaa kokonaisluku, yksi kaksi kolme neljä yksi kaksi. On joitakin hienouksia ja atoi että se tulee lakata huolehtimasta mitään pidemmälle voimassa numeerinen merkki, mutta se ei haittaa. Joten mitä luulet tapahtuu jos en tee tätä? Segmentointi vika. Niin miksi? Jos katsot takaisin ohjelmaamme, olemme muuntaa argv 1, ensimmäinen argumentti ohjelman nimen perään, että kokonaisluku. Mutta ei ole argumentti ohitettiin ohjelman nimen perään. Joten tässä me näemme, että tämä on buginen ohjelma, koska, jos yritämme käyttää sitä ilman mitään perusteluja, se vain kaatuu. Joten toinen yhteinen malli näet on jotain, jos argc on vähemmän kuin kaksi, mikä osoittaa, että ei ollut ainakin ohjelman nimi ja Ensimmäisen väitteen, niin me teemme jotain kuten printf, ei riitä komentoriviargumentteja. Se ei todennäköisesti hyvä tulostaa, se on luultavasti jotain, kuten kirjoitettava kokonaisluku komentoriviltä. Otan vain lopettaa se siellä. Ja palata sitten 1. Niin muista, että lopussa meidän ohjelma, jos palaamme 0, että sellainen osoittaa menestystä. Ja tärkeimmät myös automaattisesti palauttaa 0 jos et. Joten tässä, me retuning 1 osoittamaan että se ei ole menestystä. Ja voit palauttaa mitä haluat, vain, 0 osoittaa menestystä ja mitään muuta ilmaisee epäonnistumista. Joten suorita tämä versio asioista. Joten nyt, jos emme anna komentoriviltä argumentti, se tulee oikein kertoa Meille ei riitä komentoriviltä. Eikö lopettaa lauseen. Else, jos todella välittää se yksi, se voi suorittaa ohjelman. Joten tämä on, miten käyttäisit argc vuonna Voidakseen vahvistaa määrä komentoriviargumentteja että tosiasiallista siirtämistä. Joten tehkäämme tämä ohjelma hieman monimutkainen, ja katsoa toista iterointia asioita. Joten nyt, emme vain tulostus Ensimmäinen komentorivillä. Täällä olemme iteroimalla alkaen int i tasavertaisina 0, i on pienempi kuin argc, i plus plus, ja tulostus argv, indeksi i. Joten tämä kuvio, jälleen, tämä on sama mallineuletta kuten aiemmin, lukuun ottamatta sen sijaan kutsuvan muuttujan n, käytämme argc. Joten tämä on iteroimalla yli kukin indeksi pakassa, ja tulostettavaksi joka elementti, että jono. Ja niin, kun otamme tämän ohjelman hyvin, En anna mitään komentoriviltä argumentteja, niin se vain tulostaa ohjelman nimi. Jos astun joukko asioita, niin sitten tulostaa yhden, kukin omalla rivillään. OK. Joten ottakaamme tämä askeleen pidemmälle. Ja sen sijaan tulostus jokaisen argumentin omalla rivillään, nyt tulostaa jokaisen että kukin argumentti omalla rivillään. Niin muista, että argv on Merkkijonotaulukko. Joten mikä on merkkijono, mutta joukko merkkejä? Niin se tarkoittaa, että argv on todella joukko erilaisia ​​merkkejä. Joten hyödyntää, että Katsotaanpa sivuuttaa tätä nyt. Toivotaan vain harkita merkkijono argv 0. Joten jos haluamme tuoda kukin merkki argv 0 omalla rivillään, sitten haluan tehdä mallia olemme tottuneet, i on vähemmän kuin pituus array, joka täällä on strlen on, se on ei mitä haluan tehdä, string s vastaa argv 0. Joten i on pienempi kuin pituus meidän array, joka tässä tapauksessa on matriisi Merkkien, i plus plus. Ja niin, kuten näimme viime viikolla, se on ihanteellinen Jos me siirrymme että strlen ulkopuolella kunnossa, sillä n lisäämme strlen s kerta menemme silmukan läpi, ja se on aio olla muuttumassa. Joten me asettaa se suuruudeltaan n tänne. OK. Joten nyt olemme iteroimalla yli kukin indeksi array. Ja niin, jos haluamme tulostaa jokaisen merkki, että jono, prosenttia c on lipun haluamme käyttää merkeille. Ja nyt kiinnike i tulee olemaan string, indeksi merkki i, joten jos string olivat hei. Sitten s 0 tulee olemaan h, s kiinnike 1 on e, ja niin edelleen. Joten nyt haluamme yhdistää nämä kaksi asiaa. Haluamme tulostaa kunkin merkin Kunkin komentorivillä. Joten aiomme olla sisäkkäisiä silmukka. Ja tavanomaisesti, ensimmäisen laskurin on i, seuraava tulee olemaan j, n on strlen ja argv i, i on pienempi kuin n, i plus plus. Ja nyt sen sijaan tulostus argv i, joten argv kiinnike i on menossa index - että tulee olemaan i. komentoriviltä argumentti, argv i, j on menossa olla nnen luonne i. argumentti. Minä päästä eroon tästä täällä nyt koska voimme toteuttaa sitä, että silmukka. Joten vastaa merkkijono vertaisuuden argv i, ja sitten s kiinnike j. No, meidän ei tarvitse julistaa tämä muuttuja s. Sen sijaan meidän täytyy vain yhdistää nämä kaksi, mitä meillä oli, ARGV i, j. SPEAKER 1: [kuultavissa]. ROB BODEN: Hyvä veto. Joten tämä on rikki. Jos minä itse juoksi sitä, olisimme ovat ymmärtäneet tämän. Joten laskuri välitän tässä erityisesti silmukka on j, iteraattoria. Joten olisit joutunut kysymyksiä, luultavasti päättymättömään silmukkaan, jos me ei ollut vahvistanut sitä. Siksi me myös puhumme noin virheenkorjaus tänään. OK. Joten suorita tämä ohjelma. Ja lähdetään itse lisätä erillinen printf täällä joka vain tulostaa toinen viiva, koska tämä tarkoittaa, kun me suorita ohjelma, siellä tulee olla tyhjä linjassa niiden välillä kukin merkki Kunkin komentorivillä. No, katsotaan mitä se tarkoittaa. Oop. Sai joitakin bug. Virhe epäsuorasti julistamisesta kirjaston funktion strlen. Niin menee takaisin ohjelmaamme, I Unohdin hash kuuluu string.h. Joten string.h tulee olemaan header-tiedosto, joka ilmoittaa toiminto strlen. OK, se kokoaa. Nyt, suorita se. Niin juuri näin. Se tulee tulostaa meidän ohjelman nimi, hello world. Se tulee tulostaa jokaisen asia, jokainen merkki, omalla rivillään. OK. Joten todella ottaa tämän askeleen pidemmälle. Ja sen sijaan käyttää string.h, katsotaanpa miettiä, miten olisimme toteuttaa omia strlen toiminto. Niin minä annan heti toiminto allekirjoitus. Joten soittaa my_strlen, ja se on vie narua argumentti, ja odotamme palata pituus merkkijonon. Joten, jos hän on? Kyllä. OK. Muista siis aikaisemmasta dian oli myös viime viikolla, että joukko hahmoja, hyvin, merkkijono, joten haluan sanoa, tämä on meidän merkkijono s. Joten jos s on merkkijono, hei sitten, H-E-L-L-O, muisti, että menee olla, ja sitten tämä kenoviiva 0 luonnetta. Joten miten saamme pituus s? No, temppu etsii tätä välyksetön 0 luonnetta, tämä null terminaattori. Niin algoritmi on menossa olla jotain muutaman tarpeeksi merkkejä - Katsotaan tämän käden edustavat noin laskuri, kutsukaamme tätä int pituus. Joten, alkaen tänne, olemme menossa kerrata yli meidän merkkijono. Joten ensimmäinen merkki, se on H, ja se ei ole kenoviivan 0, joten pituus on 1. Kerrata seuraavan merkin, E, ja se ei ole kenoviiva 0. Pituus on 2. L, 3. L, 4. O, 5. Ja lopuksi, pääsemme kenoviiva 0, ja niin se tarkoittaa, no, Tämä merkkijono on ohi. Joten palata 5. Niin todellisessa täytäntöönpanossa ensinnäkin, minun n pituus on 0, minun oikea käteni. Ja aiomme kerrata - SPEAKER 1: [kuultavissa] ROB BODEN: Hitto. Hyvä soittaa. Puomi. Joten n pituus vastaa 0. Joten nyt, kun s pituus ei yhtä ja sitten kenoviiva 0. Joten muistakaa, tämä kenoviiva 0, se on todellinen luonne, ja se osoittaa merkkijonon loppuun. Aivan kuten, myös, kenoviiva n on todellinen luonne. Backslash 0 tulee osoittamaan Lopussa meidän merkkijonon. En halua laittaa, että siellä. Ja vaikka s indeksoitu pituus ei ole on yhtä suuri kuin nolla-terminaattorin, sitten olemme juuri menossa kasvattaa pituutta. Joten sitten, lopussa meidän ohjelma, pituus on lopulta menossa olla 5 tässä tapauksessa. Ja me vain palata pituus. OK. Joten nyt tänne, en do my_strlen. Katsotaanpa kääntää sen varmista kaikki sujuu hyvin. On onnistun 2? Vai oliko se 1? Että pitäisi tehdä. Selvä. Joten tämä on argv 2. Toimii ennakoidusti, joskin oli se, että yksi tein sen? Kyllä. OK. Tämä versio asioista ei ole printf uudelle viivalle, mutta se ei tee mitään eroa. OK. Joten toimi odotetusti. Nyt voimme jopa yhdistää tämän askeleen Lisäksi, jos ilmoitusta täällä, hyvin, Ensimmäinen, olemme tarttumalla strlen of argv i, ja sitten olemme iteroimalla yli kunkin merkin merkkijonon. Joten sen sijaan tehdä, että mitä jos me vain yhdistää tätä logiikkaa odottaa kunnes osuimme kenoviiva 0 oikea tähän silmukka? Joten kerrata taas argv i, j ei ei yhtä kenoviiva 0. Joten käyttää sitä ensin. Selvä. Joten tässä, tämä ehto sanoo - Katsotaanpa selvää, että. Joten nyt, olkoon tämä meidän argv. Joten kun minä vain juoksin että ohjelma ennen, argv on Merkkijonotaulukko. Ja niin, jos en suorita sitä dot slash argv 2, hello world, sitten argv itse on pituus 3, ja argv nolla, hei, ja maailma. Ja jokaisen sisällä näiden indeksien on, itse array, jos tämä tulee olemaan dot, tämä on slash, en tiedä jos se oli oikeaan suuntaan, I usko, että se oli. -R-V ajatusviiva, tarvitsevat enemmän tilaa. Leikataan tähän array. -R-V viiva 0, ja sitten kenoviiva 0. Ja sitten sekasorrossa on hei. Sanotaan, H-E kenoviiva 0. Ja lopuksi, W-O kenoviiva 0. Niin algoritmi, että me vain kirjoitti, sisäkkäisiä silmukoita, mitä he tekemässä on, meidän on ensin counter i ja sitten j. Tämä olisi helpompaa koodi näyttö, Mennään takaisin tähän. OK. Niin huomaa, että i on iteraattori joka on iteroimalla yli jokaisen komennon argumentti. Ja j on iteraattoria iteroimalla yli kunkin merkin, että komentorivillä. Joten mitä tämä sisin printf tekee on, olemme printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, mutta nyt argv 0 7 on menossa yhtä kenoviiva 0. Niin sitten me poistua että silmukka, ja nyt olen iteroi 1. Ja nyt me aiomme tulosta argv 1 0, argv 1 1 - No, nyt, koska leikkasin hei lyhyt, argv 1 2 jälleen olemaan kenoviiva 0. Ja niin, lisäys i ja jatkaa, ja niin edelleen, kunnes me tulostaa kaikki maailman, ja ne ovat kolme komentoriviltä argumentteja, ja me poistumiseen syrjäisimpien silmukka, ja loppuun ohjelmaamme. OK. Joten tulkaa takaisin. Joten voit saada joitakin perehtyneisyyttä komentoriviargumentteja tästä Erityisenä ongelmana asetettu. Nyt, virheenkorjaus. Niin olet todennäköisesti jo joutunut tekemään jotkut testaajat aikaisempia Harjoitus. Ja yksi erittäin helppo tapa virheenkorjaus, ensimmäinen, katsotaanpa buginen ohjelma. No, kävely läpi tämän ohjelman aiomme kysyä käyttäjältä kokonaisluku, napata että kokonaisluku, ja sitten, mielivaltaisesti, meillä on taas silmukka, joka on juuri menossa dekrementoidaan i kunnes se on yhtä suuri kuin 10. Katsotaanpa vain olettaa Olen kirjoittamalla kokonaisluku suurempi kuin 10. Joten dekrementoidaan i kunnes se on yhtä suuri kuin 10. Ja sitten meillä on toinen kun silmukka että vaikka minulla ei ole 0, olemme menossa dekrementoidaan I 3. Joten jos näet tarkoitus bug täällä, se on, että tämä tulee dekrementoidaan I olla 10, ja sitten tämä, kun silmukka vähenemä i 10, 7, 4, 1, negatiiviseksi 2, negatiiviseen 5, ja niin edelleen, negatiiviseksi ääretön, koska aion oikeastaan ​​koskaan 0. Ja sitten lopussa tämän ohjelman meillä foo toiminto, joka on meneillään tulostaa että olen. Joten tämä on lyhyt ja triviaali ohjelma, ja vika on ilmeinen, varsinkin kun olen juuri sanoi mitä bug oli. Mutta tarkoitus tässä, hyvin, tämä voisi todella näyttää joku ratkaisuja ahne viimeisestä Harjoitus, ja ehkä et ole Joissakin päättymättömään silmukkaan oman ohjelman, ja sinulla ei ole aavistustakaan mikä aiheuttaa sen. Joten erittäin hyödyllinen virheenkorjaus tekniikka on vain lisätä printfs koko koodi. Joten tässä haluan printf ulkopuolella Ensimmäinen kun silmukka. Ja tässä haluan printf, ja minä vain tulostaa i. Minä jopa tehdä ensin while-silmukka, i. Ulkopuolella, toinen taas silmukka. Jälleen kerran, tulosta sisällä täältä arvo i. Ja juostaan ​​tätä. Joten dot slash debug. Anna kokonaisluku. Tehdään 13. Ja puomi. Näemme, että olemme äärettömän silmukoiminen sisällä toisen while-silmukka. Joten nyt me tiedämme, mitä vika on. Mutta printf virheenkorjaus on täysin suuri, mutta kun ohjelmat saavat pidempi ja monimutkaisempi, on kehittyneempiä ratkaisuja saada homma. Joten poistaa kaikki nämä printfs. Ja varmistetaan että en riko mitään. OK. Joten ohjelma aiomme esitellä kutsutaan GDB, GNU Debugger. No, itse asiassa, nyt poistaa debug varten Toinen, ja tehdä debug uudelleen. No, itse asiassa ensimmäinen, hyvä oppitunti vuonna komentoriviargumentteja. Huomaa, että tämä kalahtaa komento, joka on koota kaikki on ohi komentoriville, nämä komentoriviargumentteja. Joten kuinka aiot käyttää komentoriviargumentteja, kuten me ennenkin, ja kun tahtoa PSET 2, näin kalahtaa käyttää niitä. Niin huomaa, että tämä ensimmäinen lippu, viiva ggdb3, mitä se on sanoa on, kalahtaa, sinun pitäisi koota tämän tiedoston tarkoitusta varten, että me lopulta täytyy debug sitä. Niin kauan kuin sinulla on, että lippu, Sitten voimme GDB debug. Ja se tulee avata GNU Debugger. Niin on olemassa paljon komentoja että sinun täytyy tottua. Ensimmäinen, joka luultavasti heti tarvitsemme Run. Joten mitä Run aikoo tehdä? Se tulee aloittaa ohjelmaamme. Joten ajaa, alkaa ohjelma, ohjelma pyytää meiltä kokonaisluku, 13. Ja sitten se on ääretön silmukoiminen kuin odotettavissa, paitsi poistin printfs, joten emme edes huomaa. Lähtenyt normaalisti. Oh. On mahdollista, että se kääritty kaikki päin, takaisin - välittämättä siitä. Oletetaan se ei poistu normaalisti. Siellä on monimutkainen vastaus tähän. Joten nyt, että ei ole kovin hyödyllinen. Joten juuri käynnissä meidän ohjelma sisällä Tämän debuggeri ei auta meitä millään tavalla, koska olisimme voineet juuri tehneet dot slash debug ulkopuolelta GDB. Joten yksi komento Luultavasti - ja lopetan tähän. Ohjaus-d tai lopettaa, niin työssä. Joten avaa sen uudelleen. Toinen komento, että luultavasti heti halua tottua, on murtaa. Niin me murtaa tärkeimmistä nyt, ja sitten selitän että. No, tässä näemme asetimme breakpoint Tämän linjan debug.c. Joten mikä tauko keino on, että kun kirjoita tähtäimellä ohjelma on menossa jatkaa toimintaansa, kunnes Löin murtuessa. Joten kun lyön tähtäimellä ohjelma käynnistyy, ja sitten se hajoaa heti, kun se tulee päätehtävä. Rikkoa tärkein tulee olemaan jotain olet aika usein tehdä. Ja nyt esitellä teille Joidenkin enemmän komentoja. Huomaa täällä, että se sanoo me murtui line 11, joka on printf, syötä kokonaisluku. Joten komento Seuraava tulee olemaan, miten menemme seuraavan rivin koodia. Tämä on menossa, jotta voimme astua ohjelmamme kautta rivi riviltä. Joten seuraavaksi. Nyt linja 12, aiomme saada kokonaisluku. Seuraava. Ja jos painaa vain Enter uudelleen, se tulee redo viimeinen asia teit. Joten en tarvitse kirjoittaa ensi kerta. Joten anna kokonaisluku, 13. Joten nyt, linja 14, kun i on suurempi kuin 10, ja minä teen seuraavaksi. Ja me näemme aiomme dekrementoidaan i. Menemme siis dekrementoidaan i uudelleen. Joten nyt toinen hyödyllinen komento on Tulosta. Joten Tulosta tulee tulostaa Muuttujan arvo. Katsotaanpa tuoda esiin arvo muuttujan i. Katsotaanpa tulostaa i. Se aikoo sanoa i on 11. Nyt Seuraava uudelleen, kun i on suurempi kuin 10. Joten en vielä suurempi kuin 10, koska se on 11. i minus minus. Katsotaanpa tulostaa i uudelleen. Kuten odotettua, se on 10. Joten nyt seuraavaksi. Se tulee takaisin kunnossa, i on suurempi kuin 10, mutta i on nyt 10, joten se ei ole suurempi kuin 10, joten odotamme sen pudota pois kun silmukka. Ja nyt olemme alle Koodirivin. Ja toinen komento, List, on juuri menossa näyttää edellisen ja seuraavan pari riviä koodia, vuonna Jos olet menettänyt itse. Joten me vain lähtenyt tästä kun silmukka, ja nyt olemme tulleet tähän while-silmukka, linja 18. Joten vaikka i = 0, ei. Ja seuraavaksi, i on yhtä suuri kuin i miinus 3, ja me huomaa, tämä täytyy vain jatkaa eteenpäin. Ja voimme painaa i. Jokainen komento tavallaan on oikoteitä. Joten p on lyhyt Tulosta. Joten voimme p i. Vain pitää holding n, tai pitää tehdä Next. Tulosta i uudelleen. Näet nyt se on negatiivinen 167. Joten tämä jatkuu loputtomiin, mutta ei todella ikuisesti, koska olet juuri nähnyt, se todella päättyy jossain vaiheessa. Niin että alkaa GDB. Mutta katsotaanpa vielä yhden asia GDB. Uh, debug. Niin, tässä nimenomaisessa tapauksessa, päättymättömään silmukkaan sattui olemaan sisällä päätehtävä. Ja nyt, vain hyväksyä, että olen siirrymme päättymättömään silmukkaan osaksi foo toiminto. Vain muistaa, että lopussa tämän ohjelma, no, tämä oli alun perin kutsuvan foo, joka oli juuri painoon i. Mutta nyt soitat foo, joka on menossa dekrementoidaan i kunnes se on 0, ja sitten tulostaa muuttuja. OK. Paitsi että. Make debug. Ja nyt, gdb debug. OK. Joten jos olen vain ajaa niin en aio pystyä todella selata minun ohjelma rivi-line. Joten tauko tärkein, ja kirjoita sitten ajaa. Joten mene läpi tämän, printf, kirjoita kokonaisluku, saat kokonaisluku, 13. Joten aiomme pitää decrementing kunnes i on suurempi kuin 10. Sitten olemme putoamassa läpi while-silmukka, ja saada linja - katsotaanpa avaa sen erilliseen ikkunaan. Joten me pienennetään, kunnes en enää suurempi kuin 10, ja sitten me nimeltään toiminto, foo. Mitä tapahtui, kun osuin funktio foo, no, minä foo, ja Sitten en enää ollut määräysvaltaa GDB. Niin heti kun osuin Seuraava tältä riviltä asioita jatkui kunnes tämä tapahtui, jossa ohjelma saadessaan - olettaa sitä ei ollut lopulta. Näit sen pysähtyä vähän kuitenkin. Joten miksi olen menettää valvoa Ohjelman tässä vaiheessa? No, kun kirjoitan seuraavan, joka menee kirjaimellinen seuraava rivi koodia, että tulee suorittaa. Niin sen jälkeen linja 21, seuraava rivi koodia joka suorittaa on line 22, joka on, joka poistuu tärkein. Joten en halua vain mennä seuraavalle riville koodia. Haluan mennä toiminto, foo, ja sitten myös selata nämä riviä koodia. Niin, että meillä on vaihtoehto. Lopetetaan se uudestaan. Rikkoa tärkein. Uh, 1, seuraava, seuraava, 13, seuraava, seuraava, seuraava huolellisesti, ennen osuimme linja foo. OK. Joten nyt me olemme linja 21, jossa kutsumme foo. Emme halua kirjoittaa seuraavaksi, koska tämä vain soittaa toiminto foo, ja Siirry seuraavalle riville koodia. Mitä haluamme käyttää on Step. Joten ei eroa Step ja Seuraava, jos vaihe astuu toimiakseen, ja Seuraava menee yli-toiminto. Se vain toteuttaa kokonaisuudessaan toimintaa ja pitää menossa. Joten Step aikoo tuoda meille osaksi toiminto, foo. Ja me näemme täällä, nyt olemme takaisin tämä taas silmukka, joka on teoriassa tulee jatkumaan ikuisesti. Ja jos osut vaiheessa, kun se ei ole edes toiminto soittaa, niin se on identtinen Seuraava. Joten se on vain kun olet linja, joka soittaa toiminto Step aikoo poiketa Seuraava. Joten Step tuo meidät tänne. Askel, askel, askel, askel, askel, askel, ja me vain loputon silmukka ikuisesti. Joten saatat tottua sitä oman tapa tunnistaa ääretön silmukoita, on vain tilalla tämän Enter nähdä, missä jäät jumiin. On olemassa parempia tapoja tehdä sitä, mutta nyt, että on täysin riittävä. Ja tyylillisesti, noudattaa Style 50, minun olisi pitänyt tehdä tätä. OK. Joten viimeisen komennon käyttöön. No, gdb debug sisään Joten sen sijaan, rikkomatta kohdallaan, jos en tietää foo toiminto on myös ongelma, niin voisin olla vain sanoi, tauko foo sijaan. Sanotaan rikon at sekä pää-foo. Joten voit asettaa niin monta breakpoints kuin haluat. Kun kirjoitan aikavälillä, se tulee pysähtyä - ooh, nyt kääntää, koska Olen muuttanut asioita. Näet tämän linjan, Varoitus, lähde tiedosto on uudempi kuin suoritettavan. Niin se tarkoittaa, että olen vain meni täällä ja muutti nämä mukaiseksi Style 50, mutta en uudelleenkääntää ohjelma. Joten GDB saa minut tietoisia siitä. Lopetan, tee debug uudelleen, osuma GDB debug. OK. Joten nyt takaisin siihen, mitä olin tekemässä. Rikkoa tärkein, break foo. Nyt jos en suorita ohjelma, joten se on tulee jatkumaan, kunnes osuu murtuessa. Että breakpoint sattuu olla ensimmäinen yksi tärkeimmistä. Nyt sen sijaan tehdä seuraavaksi, seuraavaksi, seuraavaksi, seuraava, seuraava, kunnes osuin foo, I voi kirjoittaa jatkaa, joka jatkaa kunnes osut seuraavaan murtuessa. Minun täytyy syöttää kokonaisluvun ensin. Jatka jatkuu kunnes osuin Seuraavan murtuessa, jonka mukaan funktio foo. Joten Run jatkuu osut murtuessa, mutta sinulla on vain kirjoitat aikavälillä, kun olet alkanut ohjelma, ja sitten lähtien, se on edelleen. Jos tein rikkoa pää-ja sitten juoksi, se tulee tauko Tärkein, ja jatka sitten. Koska minulla ei ole taitekohta klo foo, Syötä kokonaisluku, niin nyt olen aio rikkoa klo foo. Se on vain olemaan ääretön silmukka kunnes. OK. Niin, että Intro GDB. Sinun pitäisi alkaa käyttää sitä teidän ongelma sarjaa. Se voi olla hyvin hyödyllinen tunnistaa vikoja. Jos todella vain, rivi riviltä, ​​go läpi koodin, ja vertailla, mitä on todella tapahtuu, mitä odotat tapahtua, niin se on aika vaikea kaipaamaan vikoja. OK. Joten viime viikolla David vienyt tämän salaisen avaimen salausta juttuja ensimmäistä kertaa, jos emme halua salasanat vain olla tallennetussa tietokone joissakin tekstitiedosto, jossa joku voi tulla yli ja vain avaa sen ja lukea niitä. Ihannetapauksessa, ne salataan jollain tavalla. Ja Harjoitus 2, voit olla tekemisissä yhden tavan salauksen, tai, no, kaksi menetelmää, mutta ne eivät ole niin suuria. Jos et hakkeri painos, olet Lisäksi aiotaan käsitellä salauksen joitakin asioita. Joten kysymys on nyt hyvin, vaikka meillä on vahvin salaus algoritmi maailmassa, jos valitset erityisen heikko salasana, niin se ei auta sinua paljon, koska ihmiset voi silti tajuta se. Vaikka nähdä salattu merkkijono ja se näyttää sotku roskat että ei merkitse mitään, jos he silti täytyy vain kokeilla muutamia salasanoja tajuta se, niin eivät ole kovin turvallinen. Joten katselet videota, joka tekee tältä osin. [VIDEOTOISTOSTA] -Kypärä, sinun riiviö. Mitä on tekeillä? Mitä teet tyttärelleni? -Saanen esitellä loistava nuori plastiikkakirurgi, tohtori Phillip Schlotkin, suurin nenä työ mies koko maailmankaikkeus, ja Beverly Hills. -Your Highness. -Nenä työtä? En ymmärrä. Hän on jo ollut nenä työtä. Se oli Sweet Sixteen läsnä. -Ei. Se ei ole mitä luulet. Se on paljon, paljon pahempi. Jos et anna minulle yhdistelmä ilmasuojan, Dr. Schlotkin tulee anna tyttäresi takaisin hänen vanhan nenä. -Ei. Mistä sait sen? -Selvä. Kerron. Kerron. Ei, isä. Ei, et saa. Olet oikeassa, kultaseni. Tulen kaipaamaan uusi nenä. Mutta en kerro hänelle yhdistelmä, ei väliä mitä. -Erittäin hyvin. Dr. Schlotkin, tee pahin. -Mielelläni. [Työkaluja vain teroitettu] -Ei. Odota. Odota. Kerron. Kerron. -Tiesin, että se toimisi. Selvä. Anna se minulle. -Yhdistelmä on yksi. -One. -One. -Kaksi. -Kaksi. -Kaksi. -Kolme. -Kolme. -Kolme. -Neljä. -Neljä. -Neljä. -Viisi. -Viisi. -Viisi. -Joten yhdistelmä on yksi, kaksi, kolme, neljä, viisi. Se on typerin yhdistelmä Olen koskaan kuullut elämässäni. Se on sellainen asia idiootti olisi hänen matkatavaroita. -Kiitos, teidän korkeutenne. -Mitä teit? -Käännyin pois seinästä. -Ei et tehnyt. Olet sammuttanut koko elokuvan. -Minun on painanut väärää nappia. -No, laita se takaisin. Laittaa elokuva takaisin. -Kyllä, sir. Kyllä, sir. -Mennään, Arnold. Tule, Gretchen. Tietenkin, tiedät olen silti täytyy laskuttaa sinua tästä. [END VIDEOTOISTOSTA] ROB BODEN: Selvä. Joten nyt, että me puhutaan jo turvallisuus jollain tapaa, nice pikku elokuvajuliste, joten viime päivää, nämä kysymykset NSA seurantaa kaiken. Se voi olla vaikeaa tuntuu et on jonkinlainen yksityisyyden online-maailma, vaikka en voinut kertoa sinua eniten yksityiskohdista Prism. Joten siirtymässä Prism, emme aio puhuvan, että nyt mieti kannettavan tietokoneen. Joten tänne, haluan vaihtaa minun todellinen tilille, pikku pingviini. Joten minulla on salasana asetettu, ja että salasana on mitä haluan sen olevan. Mutta muista, että mitä olen kirjautumisen kanssa, joten tämä login ajallaan, on jokin ohjelma. Se on joku ohjelma, joka oli kirjoittanut joitakin henkilö. Ja niin, että henkilö, jos ne ovat erityisen ilkeä, ne voisivat ovat sanoneet, kaikki hyvin, joten jos salasana että astun on yhtä kuin minun Varsinainen salasana tai se on yhtä suuri Joidenkin erityisen salasanan - David on mahtava tai jotain - anna heidät sisään Niin ilkeä ohjelmoija voisi olla pääsy kaikkiin Macit tai Windows, tai jotain. Niin että ei ole paljon huolta, koska Tarkoitan, tämä on kirjautunut ohjelmaan joka toimitetaan OS X, satoja tai tuhannet ihmiset ovat tarkasteli tätä koodia. Ja niin, jos koodissa jonnekin, sinun sanoa, jos tämä merkkijono vastaa tasavertaisina David on mahtava, kirjaudu sisään, niin jonkun tulee olemaan, kuten, odota. Tämä ei ole oikein. Tämän ei pitäisi olla täällä. Niin, että yksi tapa saamme asiat olla sellainen turvallinen. Mutta ajattele jopa ohjelmia että kirjoitat. Sanotaan, että olet kirjoittanut kirjautuminen ohjelmaan. Joten tämä login ohjelma, jonka kirjoitit, joten ilmeisesti, olet hyvä ohjelmoija. Et aio tehdä mitään haittaohjelmia jos x on yhtä vastaa David on mahtava omaan koodia. Mutta tämä ohjelma, mitä sinä koostaa tätä ohjelmaa? Jotain kalahtaa. Joten mitä jos henkilö, joka sattui kirjoittaa kalahtaa erityistä cased kalahtaa jotain, jos olen koota kirjaudu ohjelma, kirjoita tämä koodi osaksi login ohjelma, joka kertoo, jos X vastaa vastaa David on mahtava? Joten ei ihan vielä, mutta meillä on sama kysymys, jossa kalahtaa, hyvin, tuhansia, ellei kymmeniä tuhansia ihmiset, ovat tutkineet kalahtaa, on Katsoin sen riviä koodia ja sanoi: kunnossa, ei mitään pahaa täällä. Kukaan ei toki tekee mitään tämän ilkeä. Mutta mitä on kalahtaa itse, kuten, mitä jos en koota kalahtaa? Entä jos minulla on kääntäjä, joka kokoaa Clang, joka lisää osaksi Clang tämä erityinen hakata joka sanoo, kaikki hyvin, kun minä koota kalahtaa, sitten suoritettavan Saan pitäisi erityisesti tarkastella sisällä login ohjelman ja insertti tämä salasana, vastaa tasavertaisina Dave on mahtava? Niin muista, että kääntäjä itse tarpeen laatia jossain vaiheessa. Joten jos mitä haluat koota kalahtaa kanssa, itse on ilkeä, niin voitaisiin kierretään kokonaan tavalla ruodussa. Joten tässä meillä on Ken Thompson ja Dennis Ritchie. Joten tämä on ikonin kuva. Dennis Ritchie on oikealla. Hän on suuri - melko paljon kirjoitti C. Voit siis kiittää häntä tähän luokkaan. Ken Thomson on vasemmalla. Kaksi heistä pohjimmiltaan kirjoitti UNIX. No, he olivat tärkeimpiä toimijoita UNIX. Oli joitakin muita. Joten Ken Thompson, jossain vaiheessa, hän voittaa Turing Award. Ja Turingin palkinnon, olen aina kuullut se viitattu tällä tavalla, se on Nobelin tietojenkäsittelytiede. Joten Turing Award, hänen on antaa hän hyväksyy puheessaan. Ja hän antaa tämän hyvin kuuluisan puheensa nyt nimeltään Mietteitä Luottavainen Luottamusta, jonka olemme sidoksissa Päälle kurssin verkkosivuilla. Ja tässä puheenvuorossa, hän sanoo, kaikki hyvin, joten kirjoitin UNIX, ja nyt kaikki te ihmiset käyttävät UNIX. Nyt, nyt muistettava, että Linux on suora jälkeläinen UNIX. OS X: n suoraan käyttää UNIX. Windows ei niinkään, mutta paljon ideoita otettiin UNIX. Niin hän menee lavalle ja sanoo, okei, minä kirjoitin UNIX. Ja juuri niin te tiedätte, olen voi kirjautua jokaiseen ikisen tietokoneissa. Koska laitoin jotakin näistä erikoistyökaluja, jos x vastaa vastaa Ken Thomson on mahtava, niin olen voi kirjautua. Joten ihmiset ovat kuin hyvin, Miten teit sen? Katselimme login ohjelman ja mikään ei ole siellä. Hän on kuin, no, minä muutettu kääntäjä kirjautua sisään kirjautuminen ohjelmaan jotta kirjautuminen ohjelma nyt on että x on yhtä vastaa Ken Thompson on mahtava. Ja he sanovat, no, se ei ole totta. Etsimme kääntäjä, ja kääntäjä ei ole riviä koodia niin. Hän on kuin, OK, mutta mitä sinä kokoamiseen kääntäjän kanssa? Ja he ajattelevat, ja hän on, kuten hyvin, Minä olen se, joka antoi sinulle kääntäjä käytät kääntää kääntäjä, joten olet koota kääntäjä, joka itsessään on ilkeä, ja tulee rikkoa login ohjelman. Joten periaatteessa, siinä vaiheessa, siellä on mitenkään voisit katsoa lähde koodi login ohjelman nähdä, mikä on väärin. Et voi edes katsoa lähdekoodin kääntäjä nähdä, mikä on väärin. Sinun täytyy tarkastella koneen koodia, todellinen binary ja koonnut kääntäjä nähdä, odota, nämä riviä koodia ei pitäisi olla täällä. Mutta Ken Thompson otti sen askeleen pidemmälle ja sanoi hyvin, on näitä erityisiä ohjelmia, jotka todella auttaa sinua lukemaan binary ohjelmien, ja niin jos joku käyttää kyseisen ohjelman lukea binary, he näkisivät nämä riviä koodia. Hän muutettu näiden ohjelmien sanoa, kaikki oikea, jos etsit kääntäjä, älä näytä tätä erityistä asennuspaketit saadaan mahtumaan. Niin sitten sinun täytyy ottaa se askel edelleen ja periaatteessa, joilla voi olla otettu useita tasoja välillisen, ja jossain vaiheessa, kukaan ei oikeastaan aiotaan tarkistaa. Joten Tarinan on, olet aio olla kirjallisesti Kalahtaa tässä luokassa. Aiot käyttää kiipeily Kalahtaa paljon tässä luokassa. Kaikki tiedätte, kalahtaa on ilkeä ohjelma, joka on sabotoi jokainen yksi ohjelma olet koskaan koottu. Ja jättää sinut, että hyvin huolestuttavana Huomioithan, nähdään keskiviikkona. [APPLAUSE] SPEAKER 2: Seuraavalla CS50. SPEAKER 3: Etkö uskalla sanoa. Voit tehdä tämän. Olet tehnyt tätä ennen, voit tehdä tämän tänään, voit tehdä tämän huomenna. Olet tehnyt tätä jo vuosia. Vain mennä sinne ja tehdä tämän. Voit tehdä tämän. [Musiikki soi]