تحليل الخيارات
معالجة الأعلام
تحليل الخيارات درس مجاني في C Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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.
الأسئلة الشائعة
هل درس «تحليل الخيارات» مجاني؟
نعم — نص درس «تحليل الخيارات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحليل الخيارات»؟
معالجة الأعلام تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تحليل الخيارات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- argc وargv
- تحليل الخيارات
- getopt
- بناء أداة CLI