getopt
Penghuraian pilihan standard
getopt ialah pelajaran C Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C Academy merangkumi sejumlah 4 pelajaran.
Apakah getopt?
getopt ialah fungsi POSIX yang menghuraikan pilihan aksara tunggal untuk anda, mengikut konvensyen Unix piawai.
Fungsi ini terdapat dalam <unistd.h> dan menghapuskan sebahagian besar kod berulang daripada penghuraian 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;
}Rentetan pilihan
Argumen ketiga kepada getopt ialah rentetan pilihan: senarai huruf pilihan yang sah.
"abc" bermaksud -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;
}Gelung penghuraian
getopt mengembalikan aksara pilihan seterusnya pada setiap panggilan, atau -1 apabila selesai.
Corak piawai ialah gelung while dengan switch di dalamnya untuk menentukan tindakan berdasarkan aksara 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;
}Pilihan dengan argumen
Letakkan tanda titik bertindih selepas huruf dalam rentetan pilihan untuk menyatakan bahawa pilihan itu menerima nilai. "o:" bermaksud -o memerlukan argumen.
Nilai tersebut tersedia dalam pemboleh ubah 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 pilihan bernilai
Anda boleh mencampurkan pilihan boolean dan pilihan yang menerima nilai dalam satu rentetan pilihan. Di sini -v ialah bendera dan -n menerima nombor.
getopt juga membolehkan 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;
}Mengendalikan pilihan yang tidak diketahui
Apabila getopt menemui pilihan yang tiada dalam rentetan pilihan, ia mengembalikan '?' dan mencetak ralat (melainkan anda menyenyapkannya).
Tambahkan case '?' untuk mengendalikan input yang tidak betul 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 tiada
Jika pilihan yang menerima nilai diberikan tanpa nilainya, tingkah laku getopt bergantung pada rentetan pilihan.
Memulakan rentetan pilihan dengan tanda titik bertindih (":o:") menyebabkan getopt mengembalikan ':' untuk argumen yang tiada, supaya anda boleh melaporkannya dengan 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 penghuraian berhenti
Selepas gelung, optind global menyimpan indeks dalam argv bagi argumen bukan pilihan yang pertama.
Gunakannya untuk memproses argumen kedudukan yang selebihnya seperti nama fail.
#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;
}Menyenyapkan mesej getopt
Secara lalai, getopt mencetak mesej ralatnya sendiri ke stderr. Tetapkan opterr global kepada 0 untuk menyekatnya dan mengendalikan ralat 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;
}Mengenal pasti pilihan yang tidak betul
Apabila getopt mengembalikan '?', optopt global mengandungi aksara pilihan yang menyebabkan masalah.
Ini membolehkan anda mencetak mesej yang membantu dengan menamakan bendera yang tepat dan tidak betul.
#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;
}Nota tentang pilihan panjang
getopt biasa hanya menyokong pilihan satu huruf. Untuk pilihan panjang seperti --verbose, sistem GNU menyediakan getopt_long dalam <getopt.h>.
Fungsi ini menggunakan gelung yang sama tetapi menambah jadual penerang pilihan 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;
}Semakan Pantas
Uji pemahaman anda tentang sintaks rentetan pilihan getopt.
Imbas Kembali
Anda telah mempelajari penghuraian pilihan piawai dengan getopt:
- Gelung selagi
getopt(argc, argv, optstring)bukan-1, dan tentukan tindakan menggunakanswitch. - Tanda titik bertindih selepas huruf bermaksud pilihan itu menerima nilai, yang terdapat dalam
optarg. optindmenunjuk kepada argumen kedudukan pertama selepas itu.- Pemboleh ubah global
opterr,optopt, dan tanda titik bertindih pada permulaan mengawal pengendalian ralat.
Pelajari C dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 39
- Pelajaran
- 144
Soalan Lazim
Adakah pelajaran “getopt” percuma?
Ya — teks penuh “getopt” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus C Academy, tingkat taraf kepada CoddyKit PRO. Kursus C Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “getopt”?
Penghuraian pilihan standard Anda berlatih C Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “getopt” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C Academy ini?
Ya. Setiap pelajaran C Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.