getopt
تحليل الخيارات القياسي
getopt درس مجاني في C Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
ما هي getopt؟
getopt هي دالة POSIX تحلّل الخيارات ذات المحرف الواحد نيابةً عنكم، وفق اصطلاحات Unix القياسية.
توجد في <unistd.h>، وتزيل معظم الشيفرة التمهيدية اللازمة لتحليل الرايات يدويًا.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "v")) != -1) {
if (opt == 'v') printf("verbose on\n");
}
return 0;
}سلسلة الخيارات
الوسيط الثالث للدالة getopt هو optstring: قائمة بأحرف الخيارات الصالحة.
تعني "abc" قبول -a و-b و-c جميعًا كرايات منطقية.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "abc")) != -1) {
printf("saw option -%c\n", opt);
}
return 0;
}حلقة التحليل
تعيد getopt محرف الخيار التالي في كل استدعاء، أو -1 عند الانتهاء.
النمط القياسي هو حلقة while تتضمن switch لتوزيع التنفيذ وفق المحرف المُعاد.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "xy")) != -1) {
switch (opt) {
case 'x': printf("x set\n"); break;
case 'y': printf("y set\n"); break;
}
}
return 0;
}الخيارات ذات الوسائط
ضعوا نقطتين بعد الحرف في سلسلة الخيارات للإشارة إلى أنه يتطلب قيمة. فتعني "o:" أن -o تتطلب وسيطة.
وتصبح القيمة متاحة في المتغير العام optarg.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "o:")) != -1) {
if (opt == 'o') printf("output = %s\n", optarg);
}
return 0;
}الجمع بين الرايات وخيارات القيم
يمكنكم مزج الخيارات المنطقية والخيارات التي تتطلب قيمًا في سلسلة خيارات واحدة. تكون -v هنا راية، بينما تتطلب -n عددًا.
تتيح getopt أيضًا للمستخدمين تجميع الرايات، مثل -vn 5.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt, verbose = 0, n = 0;
while ((opt = getopt(argc, argv, "vn:")) != -1) {
if (opt == 'v') verbose = 1;
else if (opt == 'n') n = atoi(optarg);
}
printf("verbose=%d n=%d\n", verbose, n);
return 0;
}معالجة الخيارات غير المعروفة
عندما تصادف getopt خيارًا غير موجود في سلسلة الخيارات، فإنها تعيد '?' وتطبع خطأً (ما لم تكتموا ذلك).
أضيفوا case '?' لمعالجة الإدخال غير الصحيح بسلاسة.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
switch (opt) {
case 'a': printf("a\n"); break;
case '?': printf("unknown option\n"); break;
}
}
return 0;
}الوسائط المطلوبة المفقودة
إذا أُعطي خيار يتطلب قيمة دون قيمته، فإن سلوك getopt يعتمد على سلسلة الخيارات.
تؤدي بداية سلسلة الخيارات بنقطتين (":o:") إلى إعادة getopt للقيمة ':' عند فقدان الوسيطة، ما يتيح لكم الإبلاغ عن ذلك بدقة.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, ":f:")) != -1) {
if (opt == 'f') printf("file=%s\n", optarg);
else if (opt == ':') printf("option needs a value\n");
}
return 0;
}optind: موضع توقف التحليل
بعد انتهاء الحلقة، يحتفظ المتغير العام optind بفهرس أول وساطة غير خيارية في argv.
استخدموه لمعالجة الوسائط الموضعية المتبقية، مثل أسماء الملفات.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "v")) != -1) { }
for (int i = optind; i < argc; i++)
printf("positional: %s\n", argv[i]);
return 0;
}كتم رسائل getopt
تطبع getopt رسائل الخطأ الخاصة بها إلى stderr افتراضيًا. اضبطوا المتغير العام opterr على 0 لكتمها ومعالجة الأخطاء بأنفسكم.
#include <stdio.h>
#include <unistd.h>
extern int opterr;
int main(int argc, char *argv[]) {
opterr = 0;
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
if (opt == '?') printf("bad option, handled quietly\n");
}
return 0;
}تحديد الخيار غير الصحيح
عندما تعيد getopt القيمة '?'، يحتوي المتغير العام optopt على محرف الخيار المتسبب في الخطأ.
يتيح لكم ذلك طباعة رسالة مفيدة تحدد بالضبط الراية غير الصحيحة.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "a")) != -1) {
if (opt == '?')
printf("Unrecognized option: -%c\n", optopt);
}
return 0;
}ملاحظة حول الخيارات الطويلة
لا تدعم getopt العادية سوى الخيارات ذات الحرف الواحد. أما الخيارات الطويلة مثل --verbose، فتوفّر أنظمة GNU لها الدالة getopt_long في <getopt.h>.
وتستخدم الحلقة نفسها، لكنها تضيف جدولًا من واصفات الخيارات الطويلة.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
printf("getopt parses %d short options\n", argc > 1 ? argc - 1 : 0);
return 0;
}تحقق سريع
اختبروا مدى فهمكم لبنية سلسلة خيارات getopt.
مراجعة
تعلّمتم تحليل الخيارات القياسي باستخدام getopt:
- كرّروا ما دام
getopt(argc, argv, optstring)لا يساوي-1، ووزّعوا التنفيذ باستخدامswitch. - تعني النقطتان بعد الحرف أن الخيار يتطلب قيمة، وتوجد هذه القيمة في
optarg. - يشير
optindإلى أول وساطة موضعية بعد ذلك. - تتحكم المتغيرات العامة
opterrوoptoptوالنقطتان في البداية في معالجة الأخطاء.
الأسئلة الشائعة
هل درس «getopt» مجاني؟
نعم — نص درس «getopt» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «getopt»؟
تحليل الخيارات القياسي تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «getopt»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.