getopt
การแยกวิเคราะห์ตัวเลือกมาตรฐาน
getopt เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
getopt คืออะไร
getopt เป็นฟังก์ชันของ POSIX ที่แยกวิเคราะห์ออปชันแบบอักขระเดี่ยวให้คุณ โดยปฏิบัติตามธรรมเนียมมาตรฐานของ Unix
ฟังก์ชันนี้อยู่ใน <unistd.h> และช่วยลดโค้ดส่วนซ้ำซ้อนส่วนใหญ่จากการแยกวิเคราะห์ธงด้วยตนเอง
#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;
}ออปต์สตริง
อาร์กิวเมนต์ตัวที่สามของ getopt คือ optstring ซึ่งเป็นรายการตัวอักษรออปชันที่ใช้ได้
"abc" หมายความว่ายอมรับ -a -b และ -c เป็นธงบูลีนทั้งหมด
#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;
}ลูปการแยกวิเคราะห์
getopt จะคืนอักขระออปชันถัดไปในการเรียกแต่ละครั้ง หรือคืนค่า -1 เมื่อทำงานเสร็จ
รูปแบบมาตรฐานคือลูป while ที่มี switch อยู่ภายในเพื่อเลือกการทำงานตามอักขระที่คืนมา
#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;
}ออปชันที่มีอาร์กิวเมนต์
ใส่เครื่องหมายโคลอนหลังตัวอักษรในออปต์สตริงเพื่อระบุว่าออปชันนั้นรับค่า "o:" หมายความว่า -o ต้องมีอาร์กิวเมนต์
ค่าดังกล่าวจะพร้อมใช้งานในตัวแปรส่วนกลาง 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;
}การรวมธงกับออปชันที่รับค่า
คุณสามารถผสมออปชันบูลีนกับออปชันที่รับค่าไว้ในออปต์สตริงเดียวกันได้ ในที่นี้ -v เป็นธง และ -n รับตัวเลข
getopt ยังให้ผู้ใช้รวมธงได้ เช่น -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;
}การจัดการออปชันที่ไม่รู้จัก
เมื่อ getopt พบออปชันที่ไม่มีอยู่ในออปต์สตริง จะคืนค่า '?' และพิมพ์ข้อผิดพลาด (เว้นแต่คุณจะปิดการแจ้งเตือน)
เพิ่ม case '?' เพื่อจัดการข้อมูลเข้าที่ไม่ถูกต้องอย่างเหมาะสม
#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;
}อาร์กิวเมนต์ที่จำเป็นแต่ขาดหาย
หากให้ออปชันที่รับค่าโดยไม่มีค่าของมัน พฤติกรรมของ getopt จะขึ้นอยู่กับออปต์สตริง
การขึ้นต้นออปต์สตริงด้วยโคลอน (":o:") จะทำให้ getopt คืนค่า ':' เมื่ออาร์กิวเมนต์ขาดหายไป คุณจึงรายงานปัญหาได้อย่างแม่นยำ
#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: จุดที่การแยกวิเคราะห์หยุดลง
หลังจบลูป ตัวแปรส่วนกลาง optind จะเก็บดัชนีใน argv ของอาร์กิวเมนต์ที่ไม่ใช่ออปชันตัวแรก
ใช้ค่านี้เพื่อประมวลผลอาร์กิวเมนต์ตามตำแหน่งที่เหลือ เช่น ชื่อไฟล์
#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;
}การปิดข้อความของ getopt
โดยค่าเริ่มต้น getopt จะพิมพ์ข้อความข้อผิดพลาดของตนเองไปยัง stderr กำหนดตัวแปรส่วนกลาง opterr เป็น 0 เพื่อระงับข้อความเหล่านั้น แล้วจัดการข้อผิดพลาดด้วยตนเอง
#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;
}การระบุออปชันที่ไม่ถูกต้อง
เมื่อ getopt คืนค่า '?' ตัวแปรส่วนกลาง optopt จะมีอักขระของออปชันที่ก่อปัญหาอยู่
วิธีนี้ทำให้คุณพิมพ์ข้อความที่เป็นประโยชน์ โดยระบุได้อย่างชัดเจนว่าธงใดไม่ถูกต้อง
#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;
}หมายเหตุเกี่ยวกับออปชันแบบยาว
getopt ธรรมดารองรับเฉพาะออปชันตัวอักษรเดี่ยว สำหรับออปชันแบบยาว เช่น --verbose ระบบ GNU มี getopt_long ใน <getopt.h> ให้ใช้
ฟังก์ชันนี้ใช้ลูปแบบเดียวกัน แต่เพิ่มตารางตัวบอกลักษณะออปชันแบบยาว
#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;
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับไวยากรณ์ออปต์สตริงของ getopt
สรุปทบทวน
คุณได้เรียนรู้การแยกวิเคราะห์ออปชันมาตรฐานด้วย getopt:
- วนลูปขณะที่
getopt(argc, argv, optstring)ไม่เท่ากับ-1แล้วเลือกการทำงานด้วยswitch - โคลอนหลังตัวอักษรหมายความว่าออปชันนั้นรับค่า ซึ่งพบได้ใน
optarg optindชี้ไปยังอาร์กิวเมนต์ตามตำแหน่งตัวแรกหลังจากนั้น- ตัวแปรส่วนกลาง
opterroptoptและโคลอนนำหน้าจะควบคุมการจัดการข้อผิดพลาด
คำถามที่พบบ่อย
บทเรียน “getopt” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “getopt” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “getopt”
การแยกวิเคราะห์ตัวเลือกมาตรฐาน คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “getopt” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ