การแยกวิเคราะห์ตัวเลือก
จัดการแฟล็ก
การแยกวิเคราะห์ตัวเลือก เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- argc และ argv
- การแยกวิเคราะห์ตัวเลือก
- getopt
- การสร้างเครื่องมือ CLI