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 denganstrcmp. - 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 denganstrtol.
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
- argc dan argv
- Parsing Opsi
- getopt
- Membangun Alat CLI