>> [MUSIK SPELA]
>> DOUG LLOYD: Okej, så låt oss tala om kommandoradsargument.
Så hittills under ganska mycket alla dina program
har troligen börjat som this-- int main tomrum.
Vi har samlat användarens input om vi behöver det
i våra program, t.ex. Mario-programmet, till exempel,
av i-program uppmaningarna.
Vi har inte behövt för att modifiera försäkran om huvud,
eftersom i stället inne i huvud vi bara säga, du kan kalla det för att få int.
Hur stor vill du pyramiden vara?
Eller du kan kalla det för att få float-- hur mycket förändring
ska jag utdata till användaren?
>> Det finns ett annat sätt men, och om vi vill att våra användare
för att kunna tillhandahålla data till vårt program
vid körning i stället för samtidigt programmet körs,
en subtil skillnad, men ibland en mycket användbar en,
Vi behöver en ny form av att förklara huvud.
Vi kan inte använda int main ogiltigt om vi vill samla andra uppgifter på kommandoraden
när användaren kör programmet, därmed kommandoradsargument.
>> Att samla dessa kommandoraden argument från användaren,
ändra din deklaration av huvud att se ut this-- int
huvudsakliga, öppna Paren, int argc, kommatecken, sträng argv, hakparenteser,
och sedan öppna klammerparentes.
Så vad betyder det redan?
Tja, vi passerar två parametrar, eller argument, eller ingångarna till huvud.
En, ett heltal kallas argc, och den andra är vad?
Det är en samling av strängar, eller hur?
Vi ser att klammer notation.
Det är en samling av strängar.
Det är inte en enskild sträng, det är en array med strängar.
Och dessa två argument, argc och argv, göra det möjligt för dig att veta vilka uppgifter användaren
har gett vid kommandoraden och hur många saker de
anordnad vid kommandoraden.
Ganska användbara saker att arbeta med.
>> Argc står för argument räkna, och du bör veta, förresten,
att man kan kalla argc vad du vill ha det.
Du kan ringa argv vad du ville.
Dessa är bara vanliga namn som vi använder för them-- argument räkna,
och som vi kommer att se i en andra, argumentet vektor, argv.
Men du behöver inte kalla dem argc och argv om du inte vill,
men konventionellt, det är vad vi gör.
>> Så hur som helst, argc argumentet räknas.
Det är ett heltal av typen variabel och så, som du kanske tror, ​​om vi har två saker
att vi kommer att vara att hitta reda på vad dessa skrivs
och hur mycket grejer användaren har skrivit, är argc
kommer att tala om för oss hur mycket grejer användaren har skrivit.
Så det ger dig ett antal kommandoradsargument användare
skrev när programmet genomfördes.
Så om ditt program är köra dot slash giriga,
och insidan av din giriga programmera din huvuduppgift
har deklarationen int main int argc, sträng argv hakparenteser, sedan
argc i det fallet är en.
Nu märker vi inte räkna hur många saker
användaren har skrivit efter programnamnet.
Programnamnet själv räknar som en kommandoraden argument.
>> Så dot slash giriga, i så fall är argc en.
Om användaren skrivit snedstreck giriga 1024 CS50 på kommandoraden, argc i så fall
skulle vara tre.
Och vi vet detta eftersom vägen att uppdelningen mellan strängarna
detekteras är om finns ett utrymme eller en flik
eller nåt sånt mellan dem.
Så någon mängd vitt utrymme, så kallade, mellan värdena skrivit kommandoraden
anger hur många det finns.
Så dot slash girig utrymme 1024 utrymme CS50, argc, i så fall, är tre.
>> Argv är argumentet vektorn.
Vector, förresten, är bara ett annat ord för en array,
och detta är en matris som lagrar strängar.
En sträng per element, som är strängarna som användaren faktiskt
skrivs på kommandoraden när programmet genomfördes.
Nu, såsom är fallet med någon array, om du
minns från vår diskussion om arrayer, det första elementet i argv
kommer alltid att finnas vid argv hakparentes noll.
Det är det första indexet av argv arrayen.
Så att will-- och i själva verket kommer att alltid vara namnet på programmet,
kommer alltid att ligga på argv hakparentes noll.
>> Det sista elementet i argv finns alltid vid argv Hakparenteser argc minus ett.
Ser du varför?
Kom ihåg hur många element finns i denna matris.
Tja, vi vet that-- det är argc antal element.
Om användaren har skrivit tre saker kommandoraden, är argc tre.
Men eftersom det i c, när vi jobbar med arrayer, varvid varje element i gruppen,
eller snarare indexen arrayen, börjar på noll.
Om vi ​​har tre element i vår array, har vi en del på argv noll,
ett element vid argv en, och ett element på argv två.
Det finns ingen del i argv tre, och en matris med storleken tre.
Så det är därför det sista element i argv kan alltid
hittas på argv square parentes argc minus ett.
>> Så låt oss anta att användaren kör giriga programmet follows--
om de skriver i kommandoraden dot slash girig utrymme 1024 utrymme CS50,
och av någon anledning som vi har redan förberett vårt giriga program
att känna och arbeta med dessa kommandoradsargument.
Vi gjorde inte tidigare när vi arbetade på den för giriga problemet,
men låt oss säga att vi har nu ändrat det så att vi gör processen
de kommandoradsargument på något sätt.
I detta fall, argv noll är dot slash girig.
Vad är argv en?
Tja, det är 1024, eller hur?
Det är 1024, men här är en verkligen viktigt distinction--
minns du datatyp argv?
>> Den lagrar strängar, eller hur?
Men det ser ut som 1024 är ett heltalsvärde.
Detta är en mycket viktig åtskillnad, och är faktiskt
kommer att bli något som du kan stöta på senare problem.
Allt i argv är lagras som en sträng.
Så argv ens innehåll är string ett, noll, två, fyra,
bestående av dessa fyra tecken.
Det är som om användaren skrivit ett, noll, två, fyra
som enskilda bokstäver eller tecken.
Det är inte tal 1024, och så kan du inte direkt
arbeta med det genom att säga int 1000, eller snarare int x lika argv ett minus 24.
>> Intuitivt, kanske du tänker på att som, OK, ja det är 1024 minus 24,
så x är lika med 1000.
Men i själva verket, det är inte fallet, eftersom argv en är en sträng.
Strängen 1024.
Nu finns det en funktion som kan vara används för att omvandla strängar till heltal.
Jag kommer inte att förstöra det för dig nu, men jag är säker på Zamyla
kommer att vara glada att berätta om det i walkthrough för en framtida problem.
Men du kan också hitta problem like-- ursäkt
mig, funktioner som skulle gör detta med hänvisning 50,
Om du går till referenshandbok du kan hitta en funktion som
kommer att göra denna konvertering för dig.
Men återigen, i genomgången för en framtida problem,
Zamyla kommer gärna berätta vilken funktion
det är som kommer att konvertera den string 1024 till heltal 1024.
>> Okej, så vi går vidare.
Vi har täckt vår argv noll, Vi har täckt argv en.
Vad finns i argv två?
CS50.
Att man är nog ganska självförklarande.
Vad finns i argv tre?
Bra igen, vi vet inte riktigt, eller hur?
Vi har en matris av storlek tre, det är hur många element användaren
skrivs på kommandoraden, så om vi går till argv tre,
vi nu överskrida gränserna för vår samling.
Kompilatorn kommer att låta oss göra detta, det finns inga intuitiv problem med det,
men när det gäller faktiskt vad som händer hända, vet vi inte riktigt vet.
Det beror på vad som är belägen vid minnet där
argv tre skulle förväntas vara.
Och så vi kan hamna komma bort scot gratis.
Mer troligt än inte, i synnerhet när du arbetar med argv i motsats
till någon annan matris det är i vårt program,
vi förmodligen kommer att lida en segmentering fel. Så återigen,
vara noga med att inte överskrida gränserna dina arrayer, särskilt argv,
med tanke på dess höga grad av betydelse i dina program.
>> Jag är Doug Lloyd.
Detta är CS50.