getopt
Standart seçenek ayrıştırma
getopt, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
getopt nedir
getopt, standart Unix kurallarını izleyerek tek karakterli seçenekleri sizin için ayrıştıran bir POSIX işlevidir.
<unistd.h> içinde bulunur ve el ile bayrak ayrıştırmanın gerektirdiği kalıp kodların çoğunu ortadan kaldırır.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "v")) != -1) {
if (opt == 'v') printf("verbose on\n");
}
return 0;
}optstring
getopt işlevinin üçüncü bağımsız değişkeni, geçerli seçenek harflerinin listesi olan optstring'dir.
"abc", -a, -b ve -c seçeneklerinin tümünün mantıksal bayrak olarak kabul edildiği anlamına gelir.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "abc")) != -1) {
printf("saw option -%c\n", opt);
}
return 0;
}Ayrıştırma döngüsü
getopt her çağrıda sonraki seçenek karakterini, işlem tamamlandığında ise -1 değerini döndürür.
Standart kalıp, döndürülen karaktere göre işlem yapmak için içinde switch bulunan bir while döngüsüdür.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "xy")) != -1) {
switch (opt) {
case 'x': printf("x set\n"); break;
case 'y': printf("y set\n"); break;
}
}
return 0;
}Bağımsız değişken alan seçenekler
Bir harfin optstring içinde değer aldığını belirtmek için harfin arkasına iki nokta koyun. "o:", -o seçeneğinin bir bağımsız değişken gerektirdiği anlamına gelir.
Değer, genel optarg değişkeninde kullanılabilir hale gelir.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "o:")) != -1) {
if (opt == 'o') printf("output = %s\n", optarg);
}
return 0;
}Bayrakları ve değer alan seçenekleri birleştirme
Mantıksal ve değer alan seçenekleri tek bir optstring içinde karıştırabilirsiniz. Burada -v bir bayraktır, -n ise bir sayı alır.
getopt, kullanıcıların -vn 5 gibi bayrakları bir arada kullanmasına da olanak tanır.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt, verbose = 0, n = 0;
while ((opt = getopt(argc, argv, "vn:")) != -1) {
if (opt == 'v') verbose = 1;
else if (opt == 'n') n = atoi(optarg);
}
printf("verbose=%d n=%d\n", verbose, n);
return 0;
}Bilinmeyen seçenekleri işleme
getopt, optstring içinde bulunmayan bir seçenekle karşılaştığında '?' döndürür ve siz susturmadıkça bir hata yazdırır.
Hatalı girdiyi düzgün biçimde işlemek için bir case '?' ekleyin.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
switch (opt) {
case 'a': printf("a\n"); break;
case '?': printf("unknown option\n"); break;
}
}
return 0;
}Gerekli bağımsız değişkenlerin eksik olması
Değer alan bir seçenek değeri olmadan verilirse getopt'un davranışı optstring'e bağlıdır.
Optstring'i iki noktayla (":o:") başlatmak, eksik bağımsız değişken için getopt'un ':' döndürmesini sağlar; böylece durumu kesin olarak bildirebilirsiniz.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, ":f:")) != -1) {
if (opt == 'f') printf("file=%s\n", optarg);
else if (opt == ':') printf("option needs a value\n");
}
return 0;
}optind: ayrıştırmanın durduğu yer
Döngüden sonra genel optind, argv içinde ilk seçenek olmayan bağımsız değişkenin dizinini tutar.
Bunu dosya adları gibi kalan konumsal bağımsız değişkenleri işlemek için kullanın.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "v")) != -1) { }
for (int i = optind; i < argc; i++)
printf("positional: %s\n", argv[i]);
return 0;
}getopt iletilerini susturma
getopt, varsayılan olarak kendi hata iletilerini stderr'e yazdırır. Bunları bastırmak ve hataları kendiniz işlemek için genel opterr değerini 0 yapın.
#include <stdio.h>
#include <unistd.h>
extern int opterr;
int main(int argc, char *argv[]) {
opterr = 0;
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
if (opt == '?') printf("bad option, handled quietly\n");
}
return 0;
}Hatalı seçeneği belirleme
getopt '?' döndürdüğünde genel optopt, soruna neden olan seçenek karakterini içerir.
Bu, tam olarak hangi bayrağın hatalı olduğunu belirten yararlı bir ileti yazdırmanızı sağlar.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
if (opt == '?')
printf("Unrecognized option: -%c\n", optopt);
}
return 0;
}Uzun seçenekler hakkında not
Normal getopt yalnızca tek harfli seçenekleri destekler. --verbose gibi uzun seçenekler için GNU sistemleri <getopt.h> içinde getopt_long sağlar.
Aynı döngüyü kullanır; buna uzun seçenek tanımlayıcılarından oluşan bir tablo ekler.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
printf("getopt parses %d short options\n", argc > 1 ? argc - 1 : 0);
return 0;
}Kısa Denetim
getopt'un optstring söz dizimi konusundaki anlayışınızı sınayın.
Özet
getopt ile standart seçenek ayrıştırmayı öğrendiniz:
getopt(argc, argv, optstring)değeri-1olmadığı sürece döngüyü sürdürün veswitchile işlem yapın.- Bir harfin arkasındaki iki nokta, o harfin
optargiçinde bulunan bir değer aldığını belirtir. optind, bundan sonraki ilk konumsal bağımsız değişkeni gösterir.opterr,optoptgenel değişkenleri ve baştaki iki nokta hata işlemeyi denetler.
Sıkça Sorulan Sorular
“getopt” dersi ücretsiz mi?
Evet — “getopt” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“getopt” dersinde ne öğreneceğim?
Standart seçenek ayrıştırma C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“getopt” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.