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

argc และ argv

อ่านอาร์กิวเมนต์ของโปรแกรม

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

โปรแกรมรับอาร์กิวเมนต์

เมื่อคุณเรียกใช้โปรแกรมจากเทอร์มินัล คุณสามารถส่งคำเพิ่มเติมที่เรียกว่าอาร์กิวเมนต์บรรทัดคำสั่งให้โปรแกรมได้

ภาษา C ส่งค่าเหล่านี้ให้ main ผ่านพารามิเตอร์สองตัว ได้แก่ argc (จำนวนอาร์กิวเมนต์) และ argv (เวกเตอร์อาร์กิวเมนต์)

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("This program received %d arguments\n", argc);
    return 0;
}

รูปแบบการประกาศ main

รูปแบบเต็มของ main คือ:

  • int main(int argc, char *argv[])

argc คือจำนวนอาร์กิวเมนต์ ส่วน argv คืออาร์เรย์ของตัวชี้สตริง โดยมีหนึ่งตัวต่อหนึ่งอาร์กิวเมนต์

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("argc = %d\n", argc);
    return 0;
}

argv[0] คือชื่อโปรแกรม

องค์ประกอบแรก argv[0] คือชื่อ (หรือพาธ) ที่ใช้เรียกใช้โปรแกรม

ด้วยเหตุนี้ argc จึงมีค่าอย่างน้อย 1 แม้ผู้ใช้จะไม่ได้ส่งอาร์กิวเมนต์เพิ่มเติมมา

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Program name: %s\n", argv[0]);
    return 0;
}

การพิมพ์อาร์กิวเมนต์ทั้งหมด

คุณสามารถวนลูปตั้งแต่ดัชนี 0 ถึง argc - 1 เพื่อเข้าถึงสตริงอาร์กิวเมนต์ทุกตัวใน argv

#include <stdio.h>

int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

argv ลงท้ายด้วย null

ตามมาตรฐาน C รับประกันว่า argv[argc] เป็นพอยน์เตอร์ NULL

ซึ่งหมายความว่าคุณสามารถวนลูปจนพบ NULL แทนการใช้ argc ได้ แม้ว่าการนับด้วย argc จะเป็นวิธีที่ใช้กันมากกว่า

#include <stdio.h>

int main(int argc, char *argv[]) {
    char **p = argv;
    while (*p != NULL) {
        printf("%s\n", *p);
        p++;
    }
    return 0;
}

อาร์กิวเมนต์เป็นสตริงเสมอ

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

คุณต้องแปลงค่าเองด้วยฟังก์ชันอย่าง atoi หรือ strtol

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int n = atoi(argv[1]);
        printf("Number plus one is %d\n", n + 1);
    } else {
        printf("Pass a number\n");
    }
    return 0;
}

การตรวจสอบจำนวนอาร์กิวเมนต์

ตรวจสอบ argc ก่อนอ่าน argv[i] เสมอ การเข้าถึงดัชนีที่เกินจำนวนอาร์กิวเมนต์ที่ส่งมาเป็นพฤติกรรมที่ไม่ได้กำหนดไว้

โดยทั่วไปจะใช้เงื่อนไขป้องกันเพื่อตรวจว่ามีอาร์กิวเมนต์เพียงพอหรือไม่ และพิมพ์ข้อความวิธีใช้งานหากไม่เพียงพอ

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s <name>\n", argv[0]);
        return 1;
    }
    printf("Hello, %s!\n", argv[1]);
    return 0;
}

การใช้รหัสออกที่ไม่ใช่ศูนย์

เมื่ออาร์กิวเมนต์ไม่ถูกต้อง ให้คืนค่าที่ไม่ใช่ศูนย์จาก main เพื่อส่งสัญญาณความล้มเหลวไปยังเชลล์

ตามธรรมเนียม 0 หมายถึงสำเร็จ และค่าอื่น ๆ หมายถึงเกิดข้อผิดพลาด

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Need exactly 2 arguments\n");
        return 1;
    }
    printf("Got both arguments\n");
    return 0;
}

การหาผลรวมของอาร์กิวเมนต์ตัวเลข

ตัวอย่างที่ใช้ได้จริงคือ การบวกตัวเลขทั้งหมดที่ส่งผ่านบรรทัดคำสั่ง โดยแปลงแต่ละค่าด้วย atoi แล้วสะสมเป็นผลรวม

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int sum = 0;
    for (int i = 1; i < argc; i++) {
        sum += atoi(argv[i]);
    }
    printf("Sum = %d\n", sum);
    return 0;
}

รูปแบบการเขียน argv อีกแบบ

คุณอาจเห็น char **argv แทน char *argv[] ทั้งสองแบบมีความหมายเหมือนกันเมื่อใช้เป็นพารามิเตอร์ของฟังก์ชัน นั่นคือพอยน์เตอร์ไปยังพอยน์เตอร์สตริงตัวแรก

ทั้งสองแบบทำให้คุณใช้ดัชนี argv[i] ได้

#include <stdio.h>

int main(int argc, char **argv) {
    if (argc > 1)
        printf("First arg: %s\n", argv[1]);
    return 0;
}

การพิมพ์อาร์กิวเมนต์กลับออกมา

คำสั่ง echo แบบดั้งเดิมจะพิมพ์อาร์กิวเมนต์ของคำสั่งออกมาอย่างง่าย ๆ ต่อไปนี้คือรุ่นขั้นต่ำที่เชื่อมอาร์กิวเมนต์ด้วยช่องว่าง

#include <stdio.h>

int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        printf("%s", argv[i]);
        if (i < argc - 1) printf(" ");
    }
    printf("\n");
    return 0;
}

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

ทดสอบความเข้าใจของคุณเกี่ยวกับ argc และ argv

สรุปทบทวน

คุณได้เรียนรู้วิธีที่โปรแกรมอ่านข้อมูลเข้าจากบรรทัดคำสั่ง:

  • main(int argc, char *argv[]) รับจำนวนและอาร์เรย์
  • argv[0] คือชื่อโปรแกรม อาร์กิวเมนต์จริงเริ่มที่ดัชนี 1
  • argv[argc] คือ NULL
  • อาร์กิวเมนต์เป็น สตริง เสมอ ให้แปลงตัวเลขด้วย atoi และตรวจสอบ argc ก่อน

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

บทเรียน “argc และ argv” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “argc และ argv”

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

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

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

บทเรียน “argc และ argv” ใช้เวลานานแค่ไหน

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

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

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

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

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