0Pricing
C Academy · Ders

Seçenekleri Ayrıştırma

Bayrakları işleyin

Seçenekleri Ayrıştırma, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. 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.

Seçenekler ve konumsal bağımsız değişkenler

Komut satırı bağımsız değişkenleri iki türdür. Konumsal bağımsız değişkenler dosya adları gibi değerlerdir. Seçenekler (bayraklar da denir) -v veya --help gibi bir tireyle başlar.

Bu derste bayrakların el ile nasıl algılanıp işleneceği gösterilmektedir.

#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;
}

Bir bayrağı algılama

Belirli bir bayrağı denetlemek için her bağımsız değişkeni strcmp ile karşılaştırın.

Burada ayrıntılı kip için -v gördüğümüzde bir mantıksal değer belirliyoruz.

#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;
}

Uzun seçenekleri destekleme

Birçok araç hem kısa biçimi (-h) hem de uzun biçimi (--help) kabul eder.

İki karşılaştırmayı || ile birleştirerek her iki yazımı da denetleyin.

#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;
}

Değer alan seçenekler

Bazı bayrakların -o output.txt gibi bir bağımsız değişkene ihtiyacı vardır. Böyle bir bayrak gördüğünüzde argv'nin sonraki öğesi onun değeridir.

Döngü dizinini ilerletin ve dizinin sonunu aşmadığınızı denetleyin.

#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;
}

Eksik değeri işleme

-o son bağımsız değiş dense, ardından bir değer bulunmaz. argv[i+1] okumak sınırların dışına çıkmak olur.

Sonraki belirteci almadan önce her zaman i + 1 < argc koşulunu sınayın; aksi durumda hata bildirin.

#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;
}

Mantıksal bayrakları ve değerleri birleştirme

Gerçekçi bir ayrıştırıcı aynı anda birkaç bayrağı izler: bazıları mantıksal, bazıları ise değerlidir. Her ayar için ayrı değişkenler kullanın.

#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;
}

Seçeneklerin sonunu tanıma

Geleneksel olarak tek başına kullanılan --, seçeneklerin sonunu belirtir. Ondan sonraki her şey, tireyle başlasa bile konumsal bağımsız değişken olarak değerlendirilir.

Bu sayede kullanıcılar - ile başlayan dosya adlarını geçirebilir.

#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;
}

Konumsal bağımsız değişkenleri toplama

Çoğu zaman bayraklarla birlikte bir dosya listesi istersiniz. Tanınan seçenekleri atlayıp geri kalanları konumsal bağımsız değişken olarak saklayın.

#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;
}

Bilinmeyen seçenekleri işleme

Kullanışlı bir araç, bilinmeyen bayrakları sessizce yok saymak yerine bildirir. Bilinen seçeneklerinizle karşılaştırın ve aksi durumda uyarın.

#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;
}

Seçenek değerlerini dönüştürme

Seçenek değerleri dize olarak gelir. Sayısal olanları, ayrıştırma hatalarını bir bitiş işaretçisi aracılığıyla da bildiren strtol ile dönüştürün.

#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;
}

Gerçek bir ayrıştırıcı neden yararlıdır

El ile ayrıştırma işe yarar; ancak birleştirilmiş kısa bayraklar (-vf), = söz dizimi (--name=foo) ve sıralama kuralları eklendikçe karmaşıklaşır.

Sırada ele alınacak standart getopt işlevi bu kuralları sizin için yönetir.

#include <stdio.h>

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

Kısa Denetim

Seçenek ayrıştırmadaki sorunlar konusundaki anlayışınızı sınayın.

Özet

Seçenekleri el ile ayrıştırmayı öğrendiniz:

  • Bayraklar - ile başlar; bunları strcmp ile karşılaştırın.
  • Kısa ve uzun biçimleri || ile destekleyin.
  • Değer alan seçenekler sonraki belirteci tüketir; bunu i + 1 < argc ile koruyun.
  • -- seçenek ayrıştırmasını sonlandırır; bilinmeyen bayrakları bildirin; sayısal değerleri strtol ile dönüştürün.

Sıkça Sorulan Sorular

“Seçenekleri Ayrıştırma” dersi ücretsiz mi?

Evet — “Seçenekleri Ayrıştırma” 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.

“Seçenekleri Ayrıştırma” dersinde ne öğreneceğim?

Bayrakları işleyin 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 2. dersidir.

“Seçenekleri Ayrıştırma” 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.

Bu kursun tüm dersleri

  1. argc ve argv
  2. Seçenekleri Ayrıştırma
  3. getopt
  4. CLI Aracı Oluşturma
← C Academy Sayfasına Dön