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

การแยกวิเคราะห์ตัวเลือก

จัดการแฟล็ก

การแยกวิเคราะห์ตัวเลือก เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

ออปชันกับอาร์กิวเมนต์ตามตำแหน่ง

อาร์กิวเมนต์บรรทัดคำสั่งมีอยู่สองประเภท อาร์กิวเมนต์ ตามตำแหน่ง คือค่าอย่างชื่อไฟล์ ส่วน ออปชัน (หรือเรียกว่าธง) จะขึ้นต้นด้วยเครื่องหมายขีด เช่น -v หรือ --help

บทเรียนนี้จะแสดงวิธีตรวจหาและจัดการธงด้วยตนเอง

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

การตรวจหาธง

หากต้องการตรวจหาธงเฉพาะ ให้เปรียบเทียบอาร์กิวเมนต์แต่ละตัวด้วย strcmp

ในที่นี้เราจะกำหนดค่าบูลีนเมื่อพบ -v สำหรับโหมดแสดงรายละเอียด

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

การรองรับออปชันแบบยาว

เครื่องมือจำนวนมากรองรับทั้งรูปแบบสั้น (-h) และรูปแบบยาว (--help)

ตรวจสอบทั้งสองรูปแบบด้วยการเปรียบเทียบสองครั้งที่เชื่อมด้วย ||

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

ออปชันที่รับค่า

ธงบางตัวต้องรับอาร์กิวเมนต์ เช่น -o output.txt เมื่อพบธงดังกล่าว องค์ประกอบ ถัดไปของ argv คือค่าของธงนั้น

เลื่อนดัชนีของลูปไปข้างหน้า แล้วตรวจสอบว่าคุณยังไม่เลยจุดสิ้นสุด

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

จัดการกรณีไม่มีค่า

หาก -o เป็นอาร์กิวเมนต์สุดท้าย ก็จะไม่มีค่าต่อจากมัน การอ่าน argv[i+1] จะอยู่นอกขอบเขต

ตรวจสอบ i + 1 < argc ก่อนใช้โทเคนถัดไปเสมอ และรายงานข้อผิดพลาดหากไม่เป็นจริง

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

การรวมธงบูลีนกับค่า

ตัวแยกวิเคราะห์ที่ใช้งานจริงจะติดตามธงหลายตัวพร้อมกัน โดยบางตัวเป็นค่าบูลีนและบางตัวรับค่า ให้ใช้ตัวแปรแยกกันสำหรับการตั้งค่าแต่ละรายการ

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

การตรวจหาจุดสิ้นสุดของออปชัน

ตามธรรมเนียม -- เพียงตัวเดียวจะทำเครื่องหมายจุดสิ้นสุดของออปชัน ทุกสิ่งหลังจากนั้นจะถือเป็นอาร์กิวเมนต์ตามตำแหน่ง แม้จะขึ้นต้นด้วยเครื่องหมายขีดก็ตาม

วิธีนี้ทำให้ผู้ใช้ส่งชื่อไฟล์ที่ขึ้นต้นด้วย - ได้

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

การรวบรวมอาร์กิวเมนต์ตามตำแหน่ง

บ่อยครั้งคุณต้องการทั้งธงและรายการไฟล์ ให้ข้ามออปชันที่รู้จัก แล้วจัดเก็บส่วนที่เหลือเป็นอาร์กิวเมนต์ตามตำแหน่ง

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

การจัดการออปชันที่ไม่รู้จัก

เครื่องมือที่เป็นมิตรต่อผู้ใช้จะแจ้งธงที่ไม่รู้จัก แทนที่จะเพิกเฉยอย่างเงียบ ๆ ให้ตรวจสอบกับออปชันที่รู้จัก และแจ้งเตือนในกรณีอื่น

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

การแปลงค่าออปชัน

ค่าออปชันจะมาในรูปสตริง ให้แปลงค่าตัวเลขด้วย strtol ซึ่งสามารถรายงานข้อผิดพลาดในการแยกวิเคราะห์ผ่านพอยน์เตอร์จุดสิ้นสุดได้ด้วย

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

เหตุผลที่ตัวแยกวิเคราะห์จริงช่วยได้

การแยกวิเคราะห์ด้วยตนเองใช้ได้ แต่จะซับซ้อนและยุ่งเหยิงขึ้นเมื่อมีธงสั้นรวมกัน (-vf) รูปแบบ = (--name=foo) และกฎเกี่ยวกับลำดับ

ฟังก์ชันมาตรฐาน getopt ที่จะกล่าวถึงถัดไปจะจัดการธรรมเนียมเหล่านี้ให้คุณ

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Parsed %d tokens manually\n", argc - 1);
    return 0;
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับข้อผิดพลาดที่อาจเกิดขึ้นในการแยกวิเคราะห์ออปชัน

สรุปทบทวน

คุณได้เรียนรู้การแยกวิเคราะห์ออปชันด้วยตนเอง:

  • ธงขึ้นต้นด้วย - ให้เปรียบเทียบด้วย strcmp
  • รองรับรูปแบบสั้นและยาวด้วย ||
  • ออปชันที่รับค่าจะใช้โทเคน ถัดไป โดยต้องป้องกันด้วย i + 1 < argc
  • -- จะสิ้นสุดการแยกวิเคราะห์ออปชัน ให้รายงานธงที่ไม่รู้จัก และแปลงค่าตัวเลขด้วย strtol

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

บทเรียน “การแยกวิเคราะห์ตัวเลือก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแยกวิเคราะห์ตัวเลือก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแยกวิเคราะห์ตัวเลือก”

จัดการแฟล็ก คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแยกวิเคราะห์ตัวเลือก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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