Mitä sinun tulee tietää .htaccessista. MAIN()-funktion argumentit

Tapahtuu, että tiedot siirretään ohjelmaan komentoriviltä, ​​kun sitä kutsutaan. Tällaisia ​​tietoja kutsutaan komentoriviargumenteiksi. Se näyttää esimerkiksi tältä:

./a.out test.txt ls -lt /home/peter/

Täällä kutsutaan ohjelmia a.out (alkaen nykyinen hakemisto) ja ls (samasta hakemistosta, joka on määritetty kohdassa ympäristömuuttuja PATH). Ensimmäinen ohjelma komentoriviltä saa yhden sanan - testi.txt, toinen - kaksi: -lt ja /home/peter/.

Jos ohjelma on kirjoitettu C-kielellä, ohjaus siirtyy heti sen käynnistyessä päätoiminto() , joten se on se, joka vastaanottaa sen parametrimuuttujille määritetyt komentoriviargumentit.

Aiemmin määritimme main()-funktion ikään kuin se ei ota parametreja eikä palauta mitään. Itse asiassa C-kielessä mikä tahansa funktio oletusarvoisesti (jos mitään muuta ei ole määritetty) palauttaa kokonaisluvun. Voit olla varma tästä. Jos kirjoitat koodin näin:

main() ( printf ("Hei \n") ; paluu 0; )

Tällöin käännöksen aikana ei tapahdu varoitusta tai virhettä. Sama tapahtuu, jos kirjoitat in main() . Tämä todistaa, että funktio palauttaa oletuksena kokonaisluvun eikä mitään (tyhjä). Vaikka se, mitä funktio palauttaa, voidaan aina "ohittaa", esimerkiksi voidmain() tai float main() .

Kun ohjelmaa kutsutaan komentoriviltä, ​​siihen välitetään aina seuraava tietopari:

  1. kokonaisluku, joka ilmaisee sanojen määrän (välilyönneillä eroteltuja elementtejä) komentorivillä kutsuttaessa,
  2. osoitin merkkijonojonoon, jossa jokainen rivi on erillinen sana komentoriviltä.

Muista, että myös itse ohjelman nimi ratkaisee. Jos puhelu näyttää esimerkiksi tältä:

./a.out 12 teema 2

Tällöin ohjelman ensimmäisellä argumentilla on arvo 4 ja merkkijonotaulukko määritellään muodossa (./a.out", "12", "theme", "2").

Huomaa terminologia, ohjelman argumentteja on vain kaksi (luku ja taulukko), mutta niin monta komentoriviargumenttia kuin haluat. Komentoriviargumentit "muunnetaan" ohjelman argumenteiksi (main()-funktion argumenteiksi).
Nämä tiedot (numero ja osoitin) välitetään ohjelmalle, vaikka sitä kutsutaan vain nimellä välittämättä sille mitään: ./a.out. Tässä tapauksessa ensimmäisen argumentin arvo on 1, ja toinen osoittaa taulukkoon, joka koostuu vain yhdestä rivistä (./a.out").

Se, että tiedot välitetään ohjelmaan, ei tarkoita, että main()-funktion on hyväksyttävä se. Jos main()-funktio on määritelty ilman parametreja, komentorivin argumentteja ei ole mahdollista käyttää. Vaikka mikään ei estä sinua välittämästä niitä. Virhettä ei tule.

Ohjelmalle siirrettyjen tietojen käyttö edellyttää, että se on liitetty muuttujiin. Koska argumentit välitetään välittömästi main() : lle, sen otsikon pitäisi näyttää tältä:
main (int n, char *arr)

Ensimmäinen muuttuja (n) sisältää sanojen määrän ja toinen muuttuja sisältää osoittimen merkkijonojonoon. Usein toinen parametri kirjoitetaan muodossa **arr . Se on kuitenkin sama asia. Muista, että merkkijonosarja itsessään sisältää osoittimia merkkijonoihin sen elementteinä. Ja välitämme funktiolle taulukon ensimmäiseen elementtiin osoittavan osoittimen. Osoittautuu, että välitämme osoittimen osoittimelle, ts. **sov.

Harjoittele
Kirjoita tällainen ohjelma:

#sisältää int main(int argc, char ** argv) ( int i; printf ("%d \n", argc) ; for (i = 0; i< argc; i++ ) puts (argv[ i] ) ; }

Se näyttää sanojen määrän komentorivillä, kun sitä kutsutaan, ja jokaisen sanan kanssa uusi rivi. Kutsu sitä ilman komentoriviargumentteja ja argumenteilla.

Ohjelmassa käytimme parametrimuuttujia argc ja argv. Näitä nimiä on tapana käyttää, mutta itse asiassa ne voivat olla mitä tahansa. On parempi noudattaa tätä standardia, jotta ohjelmasi ovat ymmärrettävämpiä paitsi sinulle, myös muille ohjelmoijille.

Tietojen siirtämisen käytännön merkitys ohjelmaan

Jos sinulla on kokemusta GNU/Linux-komentoriviltä, ​​tiedät, että useimmilla komennoilla on kytkimiä ja argumentteja. Esimerkiksi hakemistojen sisältöä tarkasteltaessa, kopioitaessa, siirrettäessä objektit määritetään argumenteiksi tiedostojärjestelmä, jossa komento suoritetaan. Sen toteutuksen ominaisuudet määritetään avainten avulla. Esimerkiksi joukkueessa

Cp -r ../les_1 ../les_101

cp on komennon nimi, -r on kytkin ja ../les_1 ja ../les_101 ovat komennon argumentit.

Yleisesti ottaen ohjelman suoritusprosessin tiedostoosoitteet ja "muuntajat" (nämä ovat avaimia) siirretään useimmiten ohjelmiin, kun ne käynnistetään.

Kirjoitetaan ohjelma, joka avautuu käyttäjän määrittelemä komentorivillä kirjoitettavat tai lisättävät tiedostot ja kirjoittavat (lisäävät) sinne samat tiedot, jotka käyttäjä syöttää näppäimistöltä ohjelman suorituksen aikana:

#sisältää #sisältää main (int argc, char ** argv) ( int i, ch; FILE * f[ 5 ] ; if (argc< 3 || argc >7) (laittaa ( "Virheellinen parametrien määrä") ; paluu 1; ) if (strcmp (argv[ 1 ] , "-w" ) != 0 && strcmp (argv[ 1 ] , "-a" ) != 0 ) ( laittaa ( "Ensimmäinen parametri voi olla joko -w tai -a") ; paluu 2; ) arvolle (i = 0; i< argc- 2 ; i++ ) { f[ i] = fopen (argv[ i+ 2 ] , argv[ 1 ] + 1 ) ; if (f[ i] == NULL) { printf ("Tiedostoa %s ei voi avata\n", argv[ i+ 2 ] ); paluu 3; ) ) while ((ch = getchar () ) != EOF) for (i= 0 ; i< argc- 2 ; i++ ) putc (ch, f[ i] ) ; for (i= 0 ; i < argc- 2 ; i++ ) fclose (f[ i] ) ; return 0 ; }

Selitykset koodille:

  1. Luodaan viiden tiedostoosoittimen joukko. Siksi voit avata enintään viisi tiedostoa samanaikaisesti. Ensimmäisen tiedoston tiedostoosoitin tallennetaan taulukkoelementtiin f, toisen - kohtaan f jne.
  2. Komentoriviargumenttien määrä tarkistetaan. Niitä pitäisi olla vähintään kolme, koska... ensimmäinen on ohjelman nimi, toinen on tiedoston avaustila, kolmas on ensimmäinen tai ainoa tiedosto, johon kirjoitetaan. Koska ohjelman avulla voit avata vain viisi tiedostoa, komentoriviargumenttien kokonaismäärä ei voi olla enempää kuin seitsemän. Siksi, jos argumenttien määrä on alle 3 tai enemmän kuin 7, ohjelma päättyy, koska Return-käsky saa funktion poistumaan, vaikka sen jälkeen olisi enemmän koodia. Funktiosta palautetun arvon, joka ei ole yhtä suuri kuin 0, pääprosessi voi tulkita sanomaksi, että ohjelma lopetti virheen.
  3. Tarkistaa toisen komentoriviargumentin kelvollisuuden. Jos se ei ole "-w" eikä "-a", niin ehdollinen ilmaus toisessa if palauttaa 1 (tosi). Strcmp()-funktion avulla voit verrata merkkijonoja ja palauttaa 0, jos ne ovat yhtä suuret.
  4. SISÄÄN silmukalle tiedostot avaa määrätyt osoitteet, jotka alkavat argv-taulukon kolmannesta elementistä. Tästä syystä i:ään lisätään 2 saadakseen argv-taulukon elementit kolmannesta alkaen. Argc-2-lauseke osoittaa välitettyjen tiedostonimien määrän; koska argc tallentaa komentoriviargumenttien kokonaismäärän, joista kaksi ensimmäistä eivät ole tiedostonimiä.
  5. Lausekkeen argv+1 avulla voit "leikata" alimerkkijonon "w" (tai "a") merkkijonosta "-w" (tai "-a"), koska argv on pohjimmiltaan osoitin merkkijonon ensimmäiseen elementtiin. Lisäämällä yhden osoittimeen siirrämme sen kohtaan seuraava elementti joukko.
  6. Jos tiedostoa ei voida avata, fopen()-funktio palauttaa NULL-arvon. Tässä tapauksessa ohjelma päättyy.
  7. Jokainen käyttäjän näppäimistöllä kirjoittama merkki kirjoitetaan kaikkiin avoimiin tiedostoihin.
  8. Lopussa tiedostot suljetaan.

Kun luot konsolisovellusta C++-ohjelmointikielellä, luodaan automaattisesti tämän kaltainen rivi:

Int main(int argc, char* argv) // main()-funktion parametrit

Tämä rivi on pääfunktion main() otsikko, parametrit argс ja argv ilmoitetaan suluissa. Joten, jos ohjelma käynnistetään kautta komentorivi, silloin on mahdollista välittää jotain tietoa tälle ohjelmalle, siksi argc- ja argv-parametrit ovat olemassa. Argc-parametrilla on int-tietotyyppi, ja se sisältää pääfunktiolle välitettyjen parametrien määrän. Lisäksi argc on aina vähintään 1, vaikka emme välitä mitään tietoa, koska ensimmäinen parametri on funktion nimi. Argv-parametri on joukko osoittimia merkkijonoihin. Vain merkkijonotiedot voidaan siirtää komentorivin kautta. Osoittimet ja merkkijonot ovat kaksi suurta aihetta, joille on luotu erilliset osiot. Joten kaikki tiedot lähetetään argv-parametrin kautta. Kehitetään ohjelma, jonka käynnistämme komentorivin kautta Windows-merkkijono ja anna hänelle tietoja.

// argc_argv.cpp: Määrittää konsolisovelluksen aloituspisteen. #include "stdafx.h" #include käyttäen nimiavaruutta std; int main(int argc, char* argv) ( if (argc ><< argv<

// koodi Code::Blocks

// Dev-C++-koodi

// argc_argv.cpp: Määrittää konsolisovelluksen aloituspisteen. #sisältää käyttäen nimiavaruutta std; int main(int argc, char* argv) ( jos (argc > 1) // jos välitämme argumentteja, niin argc on suurempi kuin 1 (riippuen argumenttien määrästä) ( cout<< argv<

Kun olemme tehneet ohjelman virheenkorjauksen, avaa Windowsin komentorivi ja vedä ohjelmamme suoritettava tiedosto komentoriviikkunaan. Ohjelman koko polku näkyy komentorivillä (mutta voit syöttää ohjelman polun manuaalisesti ), jonka jälkeen voit napsauttaa TULLA SISÄÄN ja ohjelma käynnistyy (katso kuva 1).

Kuva 1 - Päätoimintoparametrit

Koska me yksinkertaisesti suoritimme ohjelman emmekä välittäneet sille argumentteja, näkyviin tuli Not arguments -viesti. Kuvassa 2 näkyy saman ohjelman käynnistäminen komentorivin kautta, mutta välitetään Open-argumentti.

Kuva 2 - Päätoimintoparametrit

Argumentti on sana Open, kuten kuvasta voidaan nähdä, tämä sana ilmestyi näytölle. Voit välittää useita parametreja kerralla erottamalla ne pilkulla. Jos sinun on välitettävä useista sanoista koostuva parametri, ne on suljettava lainausmerkeillä, jolloin näitä sanoja pidetään yhtenä parametrina. Esimerkiksi kuvassa näkyy ohjelman käynnistäminen ja välitetään sille kahdesta sanasta koostuva argumentti - Se toimii.

Kuva 3 - Päätoimintoparametrit

Ja jos lainausmerkit poistetaan. Sitten näemme vain sanan Se. Jos et aio välittää tietoja ohjelmaa suoritettaessa, voit poistaa argumentit main()-funktiosta ja voit myös muuttaa näiden argumenttien nimiä. Joskus argc- ja argv-parametreihin tulee muutoksia, mutta tämä kaikki riippuu luotavan sovelluksen tyypistä tai kehitysympäristöstä.

Htaccess on ylimääräinen Apache-määritystiedosto, jonka avulla voit määrittää verkkopalvelimen hakemistokohtaisesti vaikuttamatta yleisiin Apachen asetuksiin. Paikallinen analogia httpd.conf. Tyypillisesti hän on vastuussa uudelleenohjauksista ja hakemistojen käytön hallinnasta.

Nimi alkaa pisteellä. Voimme sanoa, että tämä on nimetön tiedosto htaccess-tunnisteella.

.htaccess-asetukset vaikuttavat hakemistoon, jossa se sijaitsee, ja kaikkiin alihakemistoihin. Luo tiedosto ja aseta se tarvitsemaasi hakemistoon. Esimerkiksi projektin juurelle.

Nyt sinun on täytettävä se. Katsotaanpa, mitä .htaccess voi tehdä, mutta ensin tutkitaan esimerkkiä yksinkertaisesta uudelleenohjauksesta.

mod_rewrite ja uudelleenohjaukset

Varmista se Apache-asetustiedostossasi httpd.conf aktivoitu mod_rewrite. Eli vastaava rivi on kommentoimaton:

LoadModule rewrite_module modules/mod_rewrite.so

Tai jos et halua avata tiedostoa tekstieditorissa, voit käyttää komentoa terminaalissa:

Sudo a2enmod uudelleenkirjoitus

mod_rewrite on Apache-moduuli, joka on suunniteltu kirjoittamaan uudelleen URL-osoitteita. Katsotaanpa esimerkkiä sen toiminnasta. Oletetaan, että käyttäjä kirjoittaa seuraavan osoitteen:

Käyttämällä mod_rewriteä voit lähettää sisältöä eri URL-osoitteesta, kuten tämä:

Http://www.example.com/public/src/view/page.html

Miksi me tarvitsemme tätä? On helppo arvata, että koko sivun polun kirjoittaminen on pitkää ja yksinkertaisesti hankalaa. Sivuston kävijöiden ei tarvitse miettiä sivuston sisäistä rakennetta – heille on tärkeää päästä etsimälleen sivulle mahdollisimman nopeasti.

Osoitepalkissa käyttäjä näkee silti kirjoittamansa:

http://www.example.com/page.html

Tämä on esimerkki yksinkertaisimmasta uudelleenohjauksesta.

Suoraan harjoitteluun

Analysoidaan yhdessä projektissamme käytetty konfiguraatiotiedosto. Näin ymmärrämme, mitä riviä tulee muokata, jos ongelmia ilmenee.

Php_value short_open_tag 1 php_value upload_max_file size 10M php_value post_max_size 10M RewriteEngine On RewriteBase / RewriteRule ^(sovellus|moduulit|järjestelmä) - RewriteCond %(REQUEST_FILENAME) Rewrite_NAME) Rewrite_NAME. * index.php/$0

  • php_value merkkijono- ja numeroarvojen asettaminen
  • php_lippu asettaa loogiset arvot (kyllä/ei)

Yleinen ohjesyntaksi

Php_arvo/php_lippu direktiivin_nimi php lippu/arvo

Direktiivi short_open_tag mahdollistaa lyhyen syntaksin käytön PHP-koodin muotoiluun:

Php_value short_open_tag 1

upload_max_fisize määrittää ladatun tiedoston enimmäiskoon.

Php_value upload_max_filesize 10M

A post_max_size määrittää POST-menetelmällä lähetettävien tietojen suurimman sallitun koon.

Php_value post_max_size 10M

RewriteEngine

Kytkee mekanismin päälle/pois mod_rewrite.

RewriteEngine päällä

RewriteRule

RewriteRule yksinkertaisesti muuttaa merkkijonon säännöllisten lausekkeiden mukaan.

Syntaksi: RewriteRule säännöllinen_lauseke

# Syötä RewriteRule "index.php" RewriteRule ^index.php main.php [R] # Tulostus: "index.php" -> "main.php"

Muunsimme index.php:n main.php:ksi ja suoritimme uudelleenohjauksen.

Tärkeä: RewriteRule sisältää yleensä kaksi argumenttia: Mitä on vaihdettava ja minkä vuoksi täytyy vaihtaa. Jos meidän ei tarvitse suorittaa vaihtoa, voimme kirjoittaa sen muodossa:

Symboli "-" tarkoittaa "älä muunna"

RewriteBase

Kaikkien RewriteRules-asetusten jälkeen RewriteBase tulee voimaan. Jos tuloksena saatu kysely muunnosten jälkeen on suhteellinen ja erilainen kuin alkuperäinen, RewriteBase palauttaa sen tehden siitä absoluuttisen. RewriteBase yksinkertaisesti liittää itsensä vasemmalla olevaan pyyntöön. Koska RewriteBase-arvo on polku sivuston juuresta .htaccess-tiedostoon. Meidän tapauksessamme .htaccess sijaitsee aivan juuressa, joten:

Syntaksi: RewriteBase URL-path-from-.htaccess-file-to-site-root

Esimerkiksi:

# .htaccess sijaitsee kansiossa /dir/ # Polku sivuston juuresta .htaccess-hakemistoon /dir/ RewriteBase /dir/ # Pyyntö http://example.com/dir/logo.gif # RewriteRule-syöte on "logo.gif" RewriteRule ^ logo.gif$ logo-orange.gif # RewriteRule:n jälkeen: "logo.gif" -> "logo-orange.gif" # RewriteBase jälkeen: "logo-orange.gif" -> "/dir/logo-orange. gif"

Säännölliset lausekkeet

Säännölliset lausekkeet, joita saatat kohdata .htaccessissa.

Symboli Merkitys Esimerkki
. Kuka tahansa symboli c.t on kissa, pinnasänky, leikkaus jne.
+ Yksi tai useampi identtinen hahmoja a+ on a, aa, aaa jne.
* Nolla tai useita identtinen hahmoja a* toimii samalla tavalla kuin a+, mutta a*:n tapauksessa tyhjä merkkijono täyttää ehdon
? Ottelu valinnainen colou?r sopii sekä väriin että väriin.
^ Symboli, josta alkaa linja ^a vastaa merkkijonoa, joka alkaa a:lla
$ Symboli joka päättyy linja a$ vastaa merkkijonoa, jonka lopussa on .
() Löytää ja muistaa ottelut ryhmiä hahmoja.

Voidaan käyttää myös Takaisin-viittaus(katso esimerkki)

(ab)+ tyydyttää abababin

Takaisinviiteesimerkki:

Uudelleenkirjoitussääntö ^/ (+) /(.*) $ /home?page= $1 &id= $2

/album/123 → /home?page= albumi&id= 123

Yksi mahdollisia hahmoja ct on sopiva leikkaus, pinnasänky tai kissa.

Lisää säännöllisiä lausekkeita

Liput

Syntaksi: RewriteRule regular_expression [lippu1,lippu2,lippu3]

Lippu Kuvaus
[F] Kielletty- palauttaa virheen 403 Kielletty.
[L] Kestää- Pysäytä muunnosprosessi tässä vaiheessa äläkä käytä enää muunnossääntöjä.
Kyselymerkkijono Liitä- tämä lippu osoittaa muunnosmekanismille lisätä, ei korvata,kyselymerkkijonoja URL-osoitteesta olemassa olevaan korvausmerkkijonoon.
Kulkea läpi- pysäyttää muunnosprosessin ja siirtää tuloksena olevan uuden lenkin eteenpäin ketjua pitkin.
[R] Uudelleenohjaus- pysäyttää muunnosprosessin ja palauttaa tuloksen asiakasselaimeen uudelleenohjauksena uudelle sivulle.
[S] Ohita- ohittaa seuraavan säännön, jos nykyinen sääntö käynnistyy. Voit määrittää ohitettavien myöhempien sääntöjen määrän.

Borland C++ tukee kolmea argumenttia main(:lle). Kaksi ensimmäistä ovat perinteinen argc ja argv. Nämä ovat ainoat ANSI C -standardin määrittämät argumentit main():lle. Ne sallivat komentoriviargumenttien välittämisen ohjelmalle. Komentoriviargumentit ovat tietoja, jotka seuraavat ohjelman nimeä käyttöjärjestelmän komentorivillä. Esimerkiksi kun ohjelma käännetään Borlandin rivikääntäjällä, se kirjoitetaan tavallisesti bcc. ohjelman_nimi

Missä ohjelman_nimi on ohjelma, joka on käännettävä. Ohjelman nimi välitetään kääntäjälle argumenttina.

Argc-parametri sisältää komentoriviargumenttien määrän ja on kokonaisluku. Se on aina vähintään 1, koska ohjelman nimi on ensimmäinen argumentti. Argv-parametri on osoitin merkkiosoittimien joukkoon. Tämän taulukon jokainen elementti osoittaa komentoriviargumentin. Kaikki komentorivin argumentit ovat merkkijonoja. Ohjelma muuntaa kaikki luvut sisäiseen muotoon. Seuraava ohjelma tulostaa "Hei" ja käyttäjänimen, kun se kirjoitetaan suoraan ohjelman nimen jälkeen:

#sisältää

{
if(argc!=2)
{
printf("Unohdit kirjoittaa nimesi\n");
paluu 1;
}
printf("Hei %s", argv);
paluu 0;
}

Jos kutsut tätä ohjelman nimeä ja käyttäjänimi on Sergey, ohjelman käynnistämiseksi sinun tulee kirjoittaa:
nimi Sergei.
Ohjelman tuloksena ilmestyy seuraavaa:
"Hei Sergey."

Komentoriviargumentit on erotettava välilyönneillä tai sarkaimilla. Pilkuja, puolipisteitä ja vastaavia merkkejä ei pidetä erottimina. Esimerkiksi:

Koostuu kolmesta rivistä, kun

Herb, Rick, Fred

Tämä on yksi rivi - pilkut eivät ole erottimia.

Jos sinun on välitettävä välilyöntejä tai sarkaimia sisältävä merkkijono yhtenä argumenttina, se on suljettava lainausmerkeillä. Esimerkiksi tämä on yksi argumentti:

"Tämä on testi"

On tärkeää ilmoittaa argv oikein. Tyypillisin menetelmä on:

Tyhjät sulut osoittavat, että taulukolla ei ole kiinteää pituutta. Voit käyttää yksittäisiä elementtejä käyttämällä argv-indeksointia. Esimerkiksi argv osoittaa ensimmäiselle riville, joka sisältää aina ohjelman nimen. argv osoittaa seuraavalle riville ja niin edelleen.

Alla on pieni esimerkki komentoriviargumenttien käytöstä. Se laskee alaspäin komentorivillä määritetystä arvosta ja lähettää signaalin, kun se saavuttaa nollan. Huomaa, että ensimmäinen argumentti sisältää luvun, joka on muutettu kokonaisluvuksi käyttämällä standardia atoi()-funktiota. Jos merkkijono "näyttö" on läsnä toisena argumenttina, itse laskuri näytetään näytöllä.

/* laskentaohjelma */

#sisältää
#sisältää
#sisältää
int main(int argc, char *argv)
{
int disp, count;
if(argc<2)
{
printf("Sinun täytyy syöttää laskun pituus\n");
printf("komentorivillä. Yritä uudelleen.\n");
paluu 1;
}
if (argc==3 && !strcmp(argv,"näyttö")) disp = 1;
muu disp = 0;
for(count=atoi(argv); count; -count)
if (disp) printf("%d ", count);
printf("%c", "\a"); /* useimmissa tietokoneissa tämä on kutsu */
paluu 0;
}

Huomaa, että jos argumentteja ei ole määritetty, näkyviin tulee virheilmoitus. Tämä on tyypillisintä ohjelmille, jotka käyttävät komentoriviargumentteja ohjeiden antamiseen, jos ohjelmaa yritettiin ajaa ilman oikeita tietoja.

Jos haluat käyttää yksittäisiä komentorivin merkkejä, lisää toinen hakemisto argv:hen. Esimerkiksi seuraava ohjelma tulostaa kaikki argumentit, joilla sitä kutsuttiin, yksi merkki kerrallaan:

#sisältää
int main(int argc, char *argv)
{
int t, i;
for(t=0; t {
i = 0;
while(argv[t][i])
{
printf("%c", argv[t][i]);
}
printf(" ");
}
paluu 0;
}

Meidän on muistettava, että ensimmäinen indeksi on merkkijonoon pääsyä varten ja toinen merkkijonon merkin saamiseksi.

Tyypillisesti argc:tä ja argv:tä käytetään lähdekomentojen hankkimiseen. Teoriassa on mahdollista saada jopa 32767 argumenttia, mutta useimmat käyttöjärjestelmät eivät edes anna sinun päästä lähelle sitä. Yleensä näitä argumentteja käytetään määrittämään tiedoston nimi tai asetukset. Komentoriviargumenttien käyttäminen antaa ohjelmalle ammattimaisen ilmeen ja mahdollistaa ohjelman käytön erätiedostoissa.

Jos sisällytät Borland C++:n mukana toimitetun WILDARGS.OBJ-tiedoston, voit käyttää malleja *.EXE-tyyppisissä argumenteissa. (Borland C++ käsittelee automaattisesti jokerimerkkejä ja lisää argc:tä vastaavasti.) Jos esimerkiksi yhdistät WILDARGS.OBJ:n seuraavaan ohjelmaan, se kertoo kuinka monta tiedostoa vastaa komentorivillä määritettyä tiedostonimeä:

/* Linkitä tämä ohjelma tiedostoon WILDARGS.OBJ */

#sisältää
int main(int argc, char *argv)
{
rekisteröidy int i;
printf("%d tiedostoa vastaa määritettyä nimeä\n", argc-1);
printf("Ne ovat: ");
for(i=1; i printf("%s ", argv[i]);
paluu 0;
}

Jos kutsumme tätä ohjelmaa WA:ksi, suorita se seuraavasti, saamme tiedostojen määrän EXE-tunnisteella ja luettelon näiden tiedostojen nimistä:

Argc:n ja argv:n lisäksi Borland C++ tarjoaa myös kolmannen komentoriviargumentin -env. env-parametri antaa ohjelman käyttää tietoja käyttöjärjestelmäympäristöstä. env-parametrin on seurattava argc- ja argv-parametreja, ja se ilmoitetaan seuraavasti:

Kuten näet, env ilmoitetaan samalla tavalla kuin argv. Aivan kuten argv, se on osoitin merkkijonojonoon. Jokainen rivi on käyttöjärjestelmän määrittelemä ympäristömerkkijono. env-parametrilla ei ole vastaavaa argc-parametria, joka kertoo kuinka monta ympäristöriviä on. Sen sijaan ympäristön viimeinen rivi on tyhjä. Seuraava ohjelma tulostaa kaikki käyttöjärjestelmässä tällä hetkellä määritetyt ympäristömerkkijonot:

/* tämä ohjelma näyttää kaikki ympäristörivit */

#sisältää
int main(int argc, char *argv, char *env)
{
int;
for(t=0; env[t]/t++)
printf("%s\n", env[t]);
paluu 0;
}

Huomaa, että vaikka ohjelma ei käytä argc:tä ja argv:tä, niiden on oltava parametriluettelossa. C ei tiedä parametrien nimiä. Sen sijaan niiden käyttö määräytyy sen mukaan, missä järjestyksessä parametrit ilmoitetaan. Itse asiassa voit kutsua parametria miksi haluat. Koska argc, argv ja env ovat perinteisiä nimiä, on parasta jatkaa niiden käyttöä, jotta jokainen ohjelmaa lukeva ymmärtää välittömästi, että nämä ovat argumentteja main()-funktiolle.

Tyypillinen ohjelmien tehtävä on etsiä ympäristömerkkijonossa määritetty arvo. Esimerkiksi PATH-rivin sisältö sallii ohjelmien käyttää hakupolkuja. Seuraava ohjelma näyttää kuinka löytää merkkijonoja, jotka ilmoittavat vakiohakupolut. Se käyttää standardikirjastofunktiota strstr(), jolla on seuraava prototyyppi:

Merkki *strstr(vakiomerkki *str1, vakiomerkki *str2);

Strstr()-funktio etsii merkkijonoa, johon str1 osoittaa str2:n osoittamasta merkkijonosta. Jos tällainen merkkijono löytyy, palautetaan osoitin ensimmäiseen kohtaan. Jos osumia ei löydy, funktio palauttaa NULL-arvon.

/* ohjelma etsii ympäristömerkkijonojen joukosta riviä, joka sisältää polun */

#sisältää
#sisältää
int main (int argc, char *argv, char *env)
{
int;
for(t=0; env[t]; t++)
{
if(strstr(env[t], "PATH"))
printf("%s\n", env[t]);
}
paluu 0;
}