0Pricing
C Academy · Pelajaran

getopt

Parsing opsi standar.

getopt adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Apa itu getopt?

getopt adalah fungsi POSIX yang menguraikan opsi satu karakter untuk Anda, mengikuti konvensi Unix standar.

Fungsi ini berada dalam <unistd.h> dan menghilangkan sebagian besar kode pendukung dari penguraian bendera manual.

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

String opsi

Argumen ketiga untuk getopt adalah string opsi: daftar huruf opsi yang valid.

"abc" berarti -a, -b, dan -c semuanya diterima sebagai bendera boolean.

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

Perulangan penguraian

getopt mengembalikan karakter opsi berikutnya pada setiap pemanggilan, atau -1 jika sudah selesai.

Pola standarnya adalah perulangan while dengan switch di dalamnya untuk menentukan tindakan berdasarkan karakter yang dikembalikan.

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

Opsi dengan argumen

Tambahkan titik dua setelah sebuah huruf dalam string opsi untuk menyatakan bahwa opsi tersebut menerima nilai. "o:" berarti -o memerlukan argumen.

Nilai tersebut tersedia dalam variabel global optarg.

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

Menggabungkan bendera dan opsi bernilai

Anda dapat mencampur opsi boolean dan opsi yang menerima nilai dalam satu string opsi. Di sini -v adalah bendera dan -n menerima angka.

getopt juga memungkinkan pengguna menggabungkan bendera, seperti -vn 5.

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

Menangani opsi yang tidak dikenal

Saat getopt menemukan opsi yang tidak ada dalam string opsi, fungsi ini mengembalikan '?' dan mencetak kesalahan (kecuali Anda membungkamnya).

Tambahkan case '?' untuk menangani masukan yang salah dengan baik.

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

Argumen wajib yang tidak ada

Jika opsi yang menerima nilai diberikan tanpa nilainya, perilaku getopt bergantung pada string opsi.

Memulai string opsi dengan titik dua (":o:") membuat getopt mengembalikan ':' untuk argumen yang tidak ada, sehingga Anda dapat melaporkannya secara tepat.

#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: tempat penguraian berhenti

Setelah perulangan, optind global menyimpan indeks dalam argv dari argumen non-opsi pertama.

Gunakan untuk memproses argumen posisi yang tersisa, seperti nama file.

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

Membungkam pesan getopt

Secara default, getopt mencetak pesan kesalahannya sendiri ke stderr. Tetapkan opterr global ke 0 untuk menekannya dan menangani kesalahan sendiri.

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

Mengidentifikasi opsi yang salah

Saat getopt mengembalikan '?', optopt global berisi karakter opsi yang bermasalah.

Dengan demikian, Anda dapat mencetak pesan yang membantu dengan menyebutkan bendera mana yang tepatnya salah.

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

Catatan tentang opsi panjang

getopt biasa hanya mendukung opsi satu huruf. Untuk opsi panjang seperti --verbose, sistem GNU menyediakan getopt_long dalam <getopt.h>.

Fungsi ini menggunakan perulangan yang sama, tetapi menambahkan tabel deskriptor opsi panjang.

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

Pemeriksaan Cepat

Uji pemahaman Anda tentang sintaks string opsi getopt.

Rangkuman

Anda telah mempelajari penguraian opsi standar dengan getopt:

  • Lakukan perulangan selama getopt(argc, argv, optstring) bukan -1, lalu tentukan tindakan dengan switch.
  • Titik dua setelah huruf berarti opsi tersebut menerima nilai, yang tersedia dalam optarg.
  • optind menunjuk ke argumen posisi pertama setelahnya.
  • Global opterr, optopt, dan titik dua di awal mengatur penanganan kesalahan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “getopt” gratis?

Ya — teks lengkap “getopt” 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 “getopt”?

Parsing opsi standar. 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 3 dari 4.

Berapa lama pelajaran “getopt” 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