0Pricing
C Academy · درس

argc وargv

قراءة معاملات البرنامج

argc وargv درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 واحدًا على الأقل حتى عندما لا يمرّر المستخدم أي وسائط إضافية.

#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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «argc وargv»؟

قراءة معاملات البرنامج تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «argc وargv»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. argc وargv
  2. تحليل الخيارات
  3. getopt
  4. بناء أداة CLI
← العودة إلى C Academy