Valintojen jäsentäminen
Käsittele lippuja.
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 arvotstrtol-funktiolla.
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
- argc ja argv
- Valintojen jäsentäminen
- getopt
- CLI-työkalun rakentaminen