1 00:00:00,000 --> 00:00:02,480 >> [Přehrávání hudby] 2 00:00:02,480 --> 00:00:06,460 3 00:00:06,460 --> 00:00:09,350 >> DOUG LLOYD: Dobře, tak pojďme mluvit o argumenty příkazového řádku. 4 00:00:09,350 --> 00:00:11,800 Tak, tak daleko v průběhu docela hodně všech vašich programů 5 00:00:11,800 --> 00:00:16,360 pravděpodobně zahájena jako tohle-- int main prázdnoty. 6 00:00:16,360 --> 00:00:18,310 Byli jsme sbírání Uživatel vstup, pokud ji potřebujeme 7 00:00:18,310 --> 00:00:21,080 v našich programech, jako je například Program Mario, například, 8 00:00:21,080 --> 00:00:22,990 in-programu výzev. 9 00:00:22,990 --> 00:00:25,190 Ještě jsme potřebovali upravit prohlášení o hlavních, 10 00:00:25,190 --> 00:00:30,684 protože místo uvnitř hlavní my jen říct, můžete volat to dostat int. 11 00:00:30,684 --> 00:00:32,350 Jak velké chcete pyramida být? 12 00:00:32,350 --> 00:00:34,455 Nebo můžete zavolat k získání float-- jak velké změny 13 00:00:34,455 --> 00:00:36,400 měl výstup I pro uživatele? 14 00:00:36,400 --> 00:00:38,630 >> K dispozici je další způsob, i když, a pokud chceme našim uživatelům 15 00:00:38,630 --> 00:00:40,580 aby bylo možné poskytnout data do našeho programu 16 00:00:40,580 --> 00:00:43,320 při běhu namísto chvíli program běží, 17 00:00:43,320 --> 00:00:45,910 jemný rozdíl, ale někdy velmi užitečná jedním, 18 00:00:45,910 --> 00:00:48,120 Potřebujeme novou formu prohlásit hlavní. 19 00:00:48,120 --> 00:00:53,320 Nemůžeme použít int main prázdno, pokud chceme shromažďovat další data na příkazovém řádku 20 00:00:53,320 --> 00:00:57,540 když uživatel spustí program, tím i argumenty příkazového řádku. 21 00:00:57,540 --> 00:00:59,810 >> Sbírat tyto příkazového řádku argumenty od uživatele, 22 00:00:59,810 --> 00:01:03,140 změnit prohlášení Hlavním vypadat jako tohle-- int 23 00:01:03,140 --> 00:01:10,450 Hlavní, otevřené paren, int argc, čárka, string argv, hranaté závorky, 24 00:01:10,450 --> 00:01:12,670 a pak otevřete složená závorka. 25 00:01:12,670 --> 00:01:14,415 Tak co to znamená už? 26 00:01:14,415 --> 00:01:19,410 No, my se kolem ve dvou parametrech, nebo argumenty, nebo vstupy do hlavní. 27 00:01:19,410 --> 00:01:23,800 Jeden z nich, celé číslo s názvem argc, a druhý je co? 28 00:01:23,800 --> 00:01:26,430 29 00:01:26,430 --> 00:01:29,640 Je to pole řetězců, že jo? 30 00:01:29,640 --> 00:01:31,140 Vidíme, že hranaté závorky notace. 31 00:01:31,140 --> 00:01:32,181 Je to pole řetězců. 32 00:01:32,181 --> 00:01:35,110 Není to individuální řetězec, je to pole řetězců. 33 00:01:35,110 --> 00:01:39,640 A tyto dva argumenty, argc a argv, vám umožní vědět, co dat uživatelské 34 00:01:39,640 --> 00:01:42,912 poskytl na příkazovém řádku a jak mnoho 35 00:01:42,912 --> 00:01:44,120 pokud na příkazovém řádku. 36 00:01:44,120 --> 00:01:46,570 Docela užitečné věci s ním pracovat. 37 00:01:46,570 --> 00:01:50,310 >> Argc představuje počet argumentu, a měli byste vědět, mimochodem, 38 00:01:50,310 --> 00:01:52,600 že byste mohli zavolat argc co budete chtít. 39 00:01:52,600 --> 00:01:54,710 Můžete volat argv, co jste chtěli. 40 00:01:54,710 --> 00:01:58,740 To jsou jen konvenční jména že jsme se použít pro them-- počet argumentu, 41 00:01:58,740 --> 00:02:00,907 a jak uvidíme v druhé, Argument vektoru, argv. 42 00:02:00,907 --> 00:02:03,698 Ale nemusíte je nazývat argc a argv, pokud nechcete, 43 00:02:03,698 --> 00:02:05,570 ale konvenčně, to je to, co děláme. 44 00:02:05,570 --> 00:02:07,500 >> Tak jako tak, argc, hrabě argument. 45 00:02:07,500 --> 00:02:11,569 Je to celé číslo typu proměnné, a tak, jak je se dalo očekávat, pokud budeme mít dvě věci 46 00:02:11,569 --> 00:02:13,860 že budeme třeba najít out, co to jsou zadány 47 00:02:13,860 --> 00:02:16,070 a kolik vycpat uživatel napsal, argc je 48 00:02:16,070 --> 00:02:18,559 bude nám říct, jak moc nacpat uživatele zadaný. 49 00:02:18,559 --> 00:02:20,850 Tak to vám dává řadu argumenty příkazového řádku uživatel 50 00:02:20,850 --> 00:02:22,470 zadali, když byl popraven programu. 51 00:02:22,470 --> 00:02:25,780 Takže pokud je váš program spustit tečka lomítko chamtivý, 52 00:02:25,780 --> 00:02:28,670 a uvnitř váš chamtivý naprogramovat hlavní funkce 53 00:02:28,670 --> 00:02:34,800 má prohlášení int main int argc, string argv hranaté závorky, pak 54 00:02:34,800 --> 00:02:37,950 argc v tomto případě je jeden. 55 00:02:37,950 --> 00:02:40,200 Teď si všimnout my ne Spočítejte, kolik věcí 56 00:02:40,200 --> 00:02:42,590 uživatel napsal za jménem programu. 57 00:02:42,590 --> 00:02:46,710 Jméno Samotný program počítá jako argument příkazového řádku. 58 00:02:46,710 --> 00:02:51,770 >> Takže dot lomítko chamtivý, v že případ, argc je jeden. 59 00:02:51,770 --> 00:02:57,910 Pokud uživatel napsal lomítko chamtivý 1024 CS50 na příkazovém řádku, argc v tomto případě 60 00:02:57,910 --> 00:02:59,520 by měly být tři. 61 00:02:59,520 --> 00:03:03,720 A víme, že to proto, že způsob, jakým že rozdíl mezi strunami 62 00:03:03,720 --> 00:03:06,030 se detekuje, zda tam je prostor, nebo karta, 63 00:03:06,030 --> 00:03:08,230 nebo něco podobného, ​​že mezi nimi. 64 00:03:08,230 --> 00:03:13,860 Takže jakékoli množství bílé místo, takzvané, mezi hodnotami zadali příkazového řádku 65 00:03:13,860 --> 00:03:15,720 ukazuje, kolik jich je. 66 00:03:15,720 --> 00:03:24,040 Takže dot lomítko chamtivý prostory v lukrativní 1024 prostor CS50, argc, v tomto případě, je tři. 67 00:03:24,040 --> 00:03:26,600 >> Argv je argument vektor. 68 00:03:26,600 --> 00:03:29,240 Vector, mimochodem, je jen jiné slovo pro pole, 69 00:03:29,240 --> 00:03:31,510 a to je pole která ukládá řetězce. 70 00:03:31,510 --> 00:03:35,540 Jeden řetězec za prvek, který je řetězce, že uživatel skutečně 71 00:03:35,540 --> 00:03:39,230 zadali na příkazovém řádku když se vykonávání programu. 72 00:03:39,230 --> 00:03:40,990 Nyní, stejně jako v případě s jakýmkoliv pole, pokud jste 73 00:03:40,990 --> 00:03:44,380 vzpomínám z naší diskuse o pole, první prvek argv 74 00:03:44,380 --> 00:03:49,150 je vždy bude nalezen na argv hranatých závorkách nulové. 75 00:03:49,150 --> 00:03:51,800 To je první index z argv pole. 76 00:03:51,800 --> 00:03:55,720 Takže will-- a ve skutečnosti, že vůle Vždy být název programu, 77 00:03:55,720 --> 00:03:59,730 bude vždy umístěn na argv hranatou závorku nula. 78 00:03:59,730 --> 00:04:08,590 >> Posledním prvkem argv se vždy našel na argv hranatých závorkách argc mínus jedna. 79 00:04:08,590 --> 00:04:10,300 Vidíte, proč? 80 00:04:10,300 --> 00:04:14,180 Vzpomeňte si, jak mnoho prvků vyskytujících se na tomto poli. 81 00:04:14,180 --> 00:04:16,660 No, víme, že je to that-- argc počet prvků. 82 00:04:16,660 --> 00:04:21,279 Pokud uživatel napsal tři věci na příkazového řádku, argc je tři. 83 00:04:21,279 --> 00:04:27,070 Ale protože v c, když pracujeme s poli, každý prvek pole, 84 00:04:27,070 --> 00:04:30,190 nebo spíše indexy pole, začínají nulou. 85 00:04:30,190 --> 00:04:34,000 Pokud budeme mít tři prvky v naší pole, máme prvek na argv nula, 86 00:04:34,000 --> 00:04:37,930 prvek na argv jednom, a prvek na argv dva. 87 00:04:37,930 --> 00:04:41,700 Neexistuje žádný prvek v argv tři, a řadu velikosti tři. 88 00:04:41,700 --> 00:04:43,990 Takže to je důvod, proč poslední prvek argv může vždy 89 00:04:43,990 --> 00:04:49,510 lze nalézt na argv náměstí držáky argc mínus jedna. 90 00:04:49,510 --> 00:04:52,420 >> Takže pojďme se předpokládat, že Uživatel provede chamtivý programu jako follows-- 91 00:04:52,420 --> 00:04:57,970 pokud zadejte do příkazového řádku dot lomítko chamtivý prostor 1024 prostor CS50, 92 00:04:57,970 --> 00:05:00,720 a z jakéhokoli důvodu máme již připraven náš chamtivý programu 93 00:05:00,720 --> 00:05:04,050 poznat a pracovat s nimi argumenty příkazového řádku. 94 00:05:04,050 --> 00:05:07,030 Udělali jsme to dříve, když jsme pracovali na ní chamtivý problému, 95 00:05:07,030 --> 00:05:09,660 ale řekněme, že jsme nyní upraven to tak, že my proces 96 00:05:09,660 --> 00:05:11,480 příkazového řádku argumenty nějakým způsobem. 97 00:05:11,480 --> 00:05:15,720 V tomto případě, argv nula je tečka lomítko chamtivý. 98 00:05:15,720 --> 00:05:17,042 Co je argv z nich? 99 00:05:17,042 --> 00:05:19,030 No, je to 1024, ne? 100 00:05:19,030 --> 00:05:22,620 Je to 1024, ale tady je to opravdu důležité distinction-- 101 00:05:22,620 --> 00:05:26,410 Vzpomínáte si na datový typ argv? 102 00:05:26,410 --> 00:05:31,020 >> Ukládá řetězců, že jo? 103 00:05:31,020 --> 00:05:34,140 Ale vypadá to, že 1024 je celé číslo. 104 00:05:34,140 --> 00:05:36,530 To je opravdu důležité rozdíl, a je vlastně 105 00:05:36,530 --> 00:05:40,200 stane něco, co vás se mohou vyskytnout v dalších problémů. 106 00:05:40,200 --> 00:05:43,770 Vše v argv je uloženy jako řetězec. 107 00:05:43,770 --> 00:05:48,775 Takže obsah argv něčí jsou string jedním, nula, dvě, čtyři, 108 00:05:48,775 --> 00:05:50,275 skládající se z těchto čtyř znaků. 109 00:05:50,275 --> 00:05:53,870 Je to, jako by zadali uživatel jedním, nula, dvě, čtyři 110 00:05:53,870 --> 00:05:56,680 as jednotlivými písmeny nebo znaky. 111 00:05:56,680 --> 00:06:00,730 Není to celé číslo 1.024, a proto nelze přímo 112 00:06:00,730 --> 00:06:11,580 pracovat s ním tím, že říká int 1000, nebo spíše int x rovná argv jeden minus 24. 113 00:06:11,580 --> 00:06:15,550 >> Intuitivně, možná si myslíte o tom as, OK, no to je 1024 minus 24, 114 00:06:15,550 --> 00:06:17,920 takže x se rovná 1,000. 115 00:06:17,920 --> 00:06:22,020 Ale ve skutečnosti, že to není tento případ, protože argv jeden je řetězec. 116 00:06:22,020 --> 00:06:23,940 Řetězec 1024. 117 00:06:23,940 --> 00:06:28,739 Nyní je funkce, která může být slouží k převodu řetězců na celá čísla. 118 00:06:28,739 --> 00:06:30,780 Nebudu zkazit to pro vás teď, ale jsem si jistý, Zamyla 119 00:06:30,780 --> 00:06:34,380 Bude rád, že ti o tom v návod pro budoucí problém. 120 00:06:34,380 --> 00:06:36,390 Ale můžete také najít Problémy s jako-- výmluva 121 00:06:36,390 --> 00:06:39,921 mi, že by funkce to udělat v odkazu 50, 122 00:06:39,921 --> 00:06:42,462 pokud jdete do referenční příručky najdete funkci, která 123 00:06:42,462 --> 00:06:43,820 bude tento převod za vás. 124 00:06:43,820 --> 00:06:45,980 Ale opět, v průvodci pro budoucí problém, 125 00:06:45,980 --> 00:06:48,290 Zamyla rádi ti, co funkce 126 00:06:48,290 --> 00:06:53,280 to je, že se převádějí string 1024 na celé číslo 1024. 127 00:06:53,280 --> 00:06:54,560 >> Dobře, tak dál. 128 00:06:54,560 --> 00:06:56,726 Jsme probrali naše argv nulu, jsme probrali argv jeden. 129 00:06:56,726 --> 00:06:58,000 Co je v argv dvěma? 130 00:06:58,000 --> 00:06:58,620 CS50. 131 00:06:58,620 --> 00:07:01,350 Že jeden je pravděpodobně docela samo-vysvětlující. 132 00:07:01,350 --> 00:07:02,950 Co je v argv tři? 133 00:07:02,950 --> 00:07:04,970 No opět, my opravdu nevím, že jo? 134 00:07:04,970 --> 00:07:08,060 Máme pole o velikosti tři, to je, jak mnoho prvků uživatele 135 00:07:08,060 --> 00:07:11,610 zadali na příkazovém řádku, takže když jsme šli do argv tři, 136 00:07:11,610 --> 00:07:14,660 Nyní překročení meze naší pole. 137 00:07:14,660 --> 00:07:18,570 Kompilátor bude nám to, není intuitivní problém s tím, 138 00:07:18,570 --> 00:07:22,890 ale pokud jde o skutečně co se děje se tak stalo, jsme opravdu nevím. 139 00:07:22,890 --> 00:07:25,380 Záleží na tom, co je se nachází na paměti, kde 140 00:07:25,380 --> 00:07:28,060 argv tři by se očekávat, že bude. 141 00:07:28,060 --> 00:07:30,716 A tak bychom mohli skončit dostat pryč scot zdarma. 142 00:07:30,716 --> 00:07:33,840 Více než pravděpodobné, zvláště když pracujete s argv jako protiklad 143 00:07:33,840 --> 00:07:35,548 k jinému poli to je v našem programu, 144 00:07:35,548 --> 00:07:38,660 budeme pravděpodobně bude trpět chyba segmentace. Takže znovu, 145 00:07:38,660 --> 00:07:42,756 Dbejte na to, aby nepřekročil meze ze svých polí, zejména argv, 146 00:07:42,756 --> 00:07:47,170 vzhledem k jeho vysokému stupni význam ve svých programech. 147 00:07:47,170 --> 00:07:48,100 >> Jsem Doug Lloyd. 148 00:07:48,100 --> 00:07:50,170 To je CS50. 149 00:07:50,170 --> 00:07:51,457