0Pricing
C Academy · บทเรียน

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 ชี้ไปยังอาร์กิวเมนต์ตามตำแหน่งตัวแรกหลังจากนั้น
  • ตัวแปรส่วนกลาง opterr optopt และโคลอนนำหน้าจะควบคุมการจัดการข้อผิดพลาด

คำถามที่พบบ่อย

บทเรียน “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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. argc และ argv
  2. การแยกวิเคราะห์ตัวเลือก
  3. getopt
  4. การสร้างเครื่องมือ CLI
← กลับไปที่ C Academy