C Academy · Oppitunti

Valintojen jäsentäminen

Käsittele lippuja.

Oppitunti 2/413 vaihetta

Valintojen jäsentäminen on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

Valitsimet ja sijaintiin perustuvat argumentit

Komentoriviargumentteja on kahdenlaisia. Sijaintiin perustuvat argumentit ovat esimerkiksi tiedostonimiä. Valitsimet (joita kutsutaan myös lipuiksi) alkavat viivalla, kuten -v tai --help.

Tässä oppitunnissa näytetään, miten liput tunnistetaan ja käsitellään manuaalisesti.

#include <stdio.h>

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        if (argv[i][0] == '-')
            printf("option: %s\n", argv[i]);
        else
            printf("value:  %s\n", argv[i]);
    }
    return 0;
}

Lipuntunnistuksen toteuttaminen

Tarkistakaa tietty lippu vertaamalla kutakin argumenttia strcmp-funktiolla.

Tässä asetamme totuusarvon, kun löydämme -v-lipun yksityiskohtaista tulostusta varten.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int verbose = 0;
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-v") == 0)
            verbose = 1;
    }
    printf("verbose = %d\n", verbose);
    return 0;
}

Pitkien valitsimien tukeminen

Monet työkalut hyväksyvät sekä lyhyen muodon (-h) että pitkän muodon (--help).

Tarkistakaa molemmat kirjoitusasut kahdella vertailulla, jotka yhdistetään operaattorilla ||.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-h") == 0 ||
            strcmp(argv[i], "--help") == 0) {
            printf("Usage: prog [options]\n");
            return 0;
        }
    }
    printf("No help requested\n");
    return 0;
}

Arvon vaativat valitsimet

Jotkin liput tarvitsevat argumentin, kuten -o output.txt. Kun löydätte tällaisen lipun, argv:n seuraava alkio on sen arvo.

Kasvattakaa silmukan indeksiä ja tarkistakaa, ettette ylitä loppua.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    const char *output = "default.txt";
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-o") == 0 && i + 1 < argc) {
            output = argv[++i];
        }
    }
    printf("Output file: %s\n", output);
    return 0;
}

Puuttuvan arvon käsitteleminen

Jos -o on viimeinen argumentti, sen jälkeen ei ole arvoa. Arvon argv[i+1] lukeminen ylittäisi taulukon rajat.

Tarkistakaa aina i + 1 < argc ennen seuraavan tokenin käyttämistä ja ilmoittakaa muuten virheestä.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-n") == 0) {
            if (i + 1 >= argc) {
                printf("Error: -n needs a value\n");
                return 1;
            }
            printf("n = %s\n", argv[++i]);
        }
    }
    return 0;
}

Totuusarvolippujen ja arvojen yhdistäminen

Realistinen jäsennin seuraa useita lippuja samanaikaisesti: jotkin ovat totuusarvoja ja jotkin sisältävät arvoja. Käyttäkää kullekin asetukselle omaa muuttujaansa.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int verbose = 0;
    const char *name = "world";
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-v") == 0) verbose = 1;
        else if (strcmp(argv[i], "-name") == 0 && i+1 < argc) name = argv[++i];
    }
    if (verbose) printf("verbose mode\n");
    printf("Hello, %s\n", name);
    return 0;
}

Valitsimien lopun tunnistaminen

Sopimuksen mukaan yksittäinen -- merkitsee valitsimien loppua. Kaikki sen jälkeen käsitellään sijaintiin perustuvina argumentteina, vaikka ne alkaisivat viivalla.

Näin käyttäjät voivat välittää tiedostonimiä, jotka alkavat merkillä -.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int opts_done = 0;
    for (int i = 1; i < argc; i++) {
        if (!opts_done && strcmp(argv[i], "--") == 0) {
            opts_done = 1;
            continue;
        }
        printf("%s: %s\n", opts_done ? "value" : "token", argv[i]);
    }
    return 0;
}

Sijaintiin perustuvien argumenttien kerääminen

Usein tarvitsette lippujen lisäksi luettelon tiedostoista. Ohittakaa tunnistetut valitsimet ja tallentakaa loput sijaintiin perustuviksi argumenteiksi.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        if (argv[i][0] == '-') continue;
        printf("file: %s\n", argv[i]);
    }
    return 0;
}

Tuntemattomien valitsimien käsitteleminen

Hyvä työkalu ilmoittaa tuntemattomista lipuista sen sijaan, että ohittaisi ne hiljaisesti. Verratkaa lippua tunnettuihin valitsimiin ja antakaa muuten varoitus.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        if (argv[i][0] != '-') continue;
        if (strcmp(argv[i], "-v") != 0)
            printf("Unknown option: %s\n", argv[i]);
    }
    return 0;
}

Valitsimien arvojen muuntaminen

Valitsimien arvot saapuvat merkkijonoina. Muuntakaa numeeriset arvot strtol-funktiolla, joka ilmoittaa jäsennysvirheistä myös loppuosoittimen avulla.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int count = 1;
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-c") == 0 && i+1 < argc)
            count = (int) strtol(argv[++i], NULL, 10);
    }
    printf("count = %d\n", count);
    return 0;
}

Miksi oikea jäsennin auttaa

Manuaalinen jäsentäminen toimii, mutta muuttuu helposti sekavaksi yhdistettyjen lyhyiden lippujen (-vf), =-syntaksin (--name=foo) ja järjestyssääntöjen myötä.

Seuraavaksi käsiteltävä standardin getopt-funktio hoitaa nämä käytännöt puolestanne.

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Parsed %d tokens manually\n", argc - 1);
    return 0;
}

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte valitsinten jäsentämisen ongelmakohdat.

Kertaus

Opitte jäsentämään valitsimia manuaalisesti:

  • Liput alkavat merkillä -; verratkaa niitä strcmp-funktiolla.
  • Tukekaa lyhyitä ja pitkiä muotoja operaattorilla ||.
  • Arvon ottavat valitsimet käyttävät seuraavan tokenin — varmistakaa ehdolla i + 1 < argc, että se on olemassa.
  • -- päättää valitsinten jäsentämisen; ilmoittakaa tuntemattomista lipuista ja muuntakaa numeeriset arvot strtol-funktiolla.
Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”Valintojen jäsentäminen” ilmainen?

Kyllä – oppitunnin ”Valintojen jäsentäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Valintojen jäsentäminen”?

Käsittele lippuja. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Valintojen jäsentäminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. argc ja argv
  2. Valintojen jäsentäminen
  3. getopt
  4. CLI-työkalun rakentaminen
← Takaisin: C Academy