0Pricing
C Academy · Pelajaran

Parsing Opsi

Tangani flag.

Parsing Opsi adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Opsi vs argumen posisi

Argumen baris perintah terdiri dari dua jenis. Argumen posisi adalah nilai seperti nama file. Opsi (juga disebut bendera) diawali tanda hubung, seperti -v atau --help.

Pelajaran ini menunjukkan cara mendeteksi dan menangani bendera secara manual.

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

Mendeteksi bendera

Untuk memeriksa bendera tertentu, bandingkan setiap argumen dengan strcmp.

Di sini kita menetapkan nilai boolean saat menemukan -v untuk mode terperinci.

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

Mendukung opsi panjang

Banyak alat menerima bentuk singkat (-h) dan bentuk panjang (--help).

Periksa kedua penulisan tersebut dengan dua perbandingan yang digabungkan menggunakan ||.

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

Opsi yang menerima nilai

Beberapa bendera memerlukan argumen, seperti -o output.txt. Saat menemukan bendera seperti itu, elemen berikutnya dalam argv adalah nilainya.

Naikkan indeks perulangan dan pastikan Anda tidak melewati akhir.

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

Menangani nilai yang tidak ada

Jika -o merupakan argumen terakhir, tidak ada nilai setelahnya. Membaca argv[i+1] akan mengakses di luar batas.

Selalu uji i + 1 < argc sebelum mengambil token berikutnya, dan laporkan kesalahan jika tidak terpenuhi.

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

Menggabungkan bendera boolean dan nilai

Pengurai yang realistis melacak beberapa bendera sekaligus: sebagian berupa boolean, sebagian lainnya memiliki nilai. Gunakan variabel terpisah untuk setiap pengaturan.

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

Mengenali akhir opsi

Menurut konvensi, -- tunggal menandai akhir opsi. Semua yang muncul setelahnya diperlakukan sebagai argumen posisi, meskipun diawali tanda hubung.

Dengan demikian, pengguna dapat memberikan nama file yang diawali -.

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

Mengumpulkan argumen posisi

Sering kali Anda menginginkan bendera sekaligus daftar file. Lewati opsi yang dikenali dan simpan sisanya sebagai argumen posisi.

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

Penanganan opsi yang tidak dikenal

Alat yang baik melaporkan bendera yang tidak dikenal, bukan mengabaikannya secara diam-diam. Bandingkan dengan opsi yang Anda kenal dan berikan peringatan jika tidak cocok.

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

Mengonversi nilai opsi

Nilai opsi diterima sebagai string. Konversikan nilai numerik dengan strtol, yang juga melaporkan kesalahan penguraian melalui penunjuk akhir.

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

Alasan pengurai sungguhan membantu

Penguraian manual dapat digunakan, tetapi menjadi rumit jika melibatkan bendera singkat gabungan (-vf), sintaks = (--name=foo), dan aturan pengurutan.

Fungsi standar getopt, yang dibahas berikutnya, menangani konvensi ini untuk Anda.

#include <stdio.h>

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

Pemeriksaan Cepat

Uji pemahaman Anda tentang kendala penguraian opsi.

Rangkuman

Anda telah mempelajari penguraian opsi secara manual:

  • Bendera diawali -; bandingkan dengan strcmp.
  • Dukung bentuk singkat dan panjang dengan ||.
  • Opsi yang menerima nilai mengambil token berikutnya — lindungi dengan i + 1 < argc.
  • -- mengakhiri penguraian opsi; laporkan bendera yang tidak dikenal; konversikan nilai numerik dengan strtol.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Parsing Opsi” gratis?

Ya — teks lengkap “Parsing Opsi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Parsing Opsi”?

Tangani flag. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Parsing Opsi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. argc dan argv
  2. Parsing Opsi
  3. getopt
  4. Membangun Alat CLI
← Kembali ke C Academy