الحجج الوظيفية الرئيسية ج الاستوديو المرئي. رئيسي () الحجج الوظيفية

الوسائط الاختيارية والمسمية

الحجج الاختيارية

يقدم C # 4.0 ميزة جديدة تعمل على تحسين ملاءمة تحديد الوسائط عند استدعاء طريقة. هذه الأداة تسمى الحجج الاختياريةويسمح لك بتحديد قيمة افتراضية لمعامل الأسلوب. سيتم استخدام هذه القيمة بشكل افتراضي إذا لم يتم تحديد وسيطة مقابلة للمعلمة عند استدعاء الطريقة. لذلك ، ليس من الضروري تحديد وسيطة لمثل هذه المعلمة. تسهل الوسيطات الاختيارية استدعاء الأساليب ، حيث يتم تطبيق الوسيطات الافتراضية على بعض المعلمات. يمكن استخدامها أيضًا كشكل "قصير" من طريقة التحميل الزائد.

كان الدافع الرئيسي لإضافة الحجج الاختيارية هو الحاجة إلى تبسيط التفاعل مع كائنات COM. في العديد من نماذج كائنات Microsoft (على سبيل المثال ، مايكروسوفت أوفيس) يتم توفير الوظيفة من خلال كائنات COM ، وكثير منها تمت كتابته منذ فترة طويلة ومصممة لاستخدام معلمات اختيارية.

فيما يلي مثال على استخدام الوسائط الاختيارية:

باستخدام النظام ؛ باستخدام System.Collections.Generic ؛ باستخدام System.Linq ؛ باستخدام System.Text ؛ namespace ConsoleApplication1 (class Program (// Arguments b and c اختيارية عند استدعاء static int mySum (int a، int b = 5، int c = 10) (return a + b + c؛) static void Main () (int sum1 = mySum (3)؛ int sum2 = mySum (3،12)؛ Console.WriteLine ("Sum1 =" + sum1)؛ Console.WriteLine ("Sum2 =" + sum2)؛ Console.ReadLine () ؛)))

يجب أن يؤخذ في الاعتبار أنه يجب بالضرورة الإشارة إلى جميع الحجج الاختيارية على يمين الحجج المطلوبة. بالإضافة إلى الأساليب ، يمكن استخدام الوسائط الاختيارية في المنشئات والمفهرسات والمفوضين.

تتمثل إحدى ميزات الوسيطات الاختيارية في أنها تسهل على المبرمج التعامل مع الطريقة المعقدة واستدعاءات المُنشئ. بعد كل شيء ، غالبًا ما يكون من الضروري تعيين معلمات بطريقة أكثر مما هو مطلوب عادةً. وفي مثل هذه الحالات ، يمكن جعل بعض هذه المعلمات اختيارية من خلال الاستخدام الدقيق للوسيطات الاختيارية. هذا يعني أنك تحتاج فقط إلى تمرير الحجج المهمة في المعطى حالة محددة، وليس كل الحجج ، التي يجب أن تكون مطلوبة بخلاف ذلك. يسمح لنا هذا النهج بترشيد الطريقة وتبسيط معالجة المبرمج لها.

الحجج المسماة

مرة اخرى وظائف، الذي تمت إضافته إلى C # مع إصدار .NET 4.0 ، هو دعم لما يسمى ب الحجج المسماة. كما تعلم ، عند تمرير الوسيطات إلى طريقة ، يجب أن يتطابق الترتيب الذي تظهر به ، كقاعدة ، مع الترتيب الذي تم تحديد المعلمات به في الطريقة نفسها. بمعنى آخر ، يتم تعيين قيمة الوسيطة للمعلمة من خلال موقعها في قائمة الوسائط.

تم تصميم الحجج المسماة للتغلب على هذا القيد. تسمح لك الوسيطة المسماة بتحديد اسم المعلمة التي تم تعيين قيمتها لها. وفي هذه الحالة ، لم يعد ترتيب الحجج مهمًا. وبالتالي ، فإن الوسائط المسماة تشبه إلى حد ما عوامل تهيئة الكائن المذكورة سابقًا ، على الرغم من اختلافها عنها في تركيبها. لتحديد وسيطة بالاسم ، استخدم الصيغة التالية من بناء الجملة:

اسم_المعامل: القيمة

هنا اسم_المعلمةيشير إلى اسم المعلمة التي يتم تمرير القيمة إليها. بالطبع ، يجب أن يكون اسم المعلمة هو اسم معلمة صالحة للطريقة التي يتم استدعاؤها.

يحدث أن يتم نقل البيانات إلى البرنامج من سطر الأوامر عندما يتم استدعاؤها. تسمى هذه البيانات وسائط سطر الأوامر. يبدو مثل هذا ، على سبيل المثال:

./a.out test.txt ls -lt / home / peter /

هذا يستدعي البرامج a.out (من الدليل الحالي) و ls (من نفس الدليل المحدد في متغير البيئة PATH). يتلقى البرنامج الأول من سطر الأوامر كلمة واحدة - test.txt ، والثاني - اثنان: -lt و / home / peter /.

إذا كان البرنامج مكتوبًا بلغة C ، فعندما يبدأ ، يتم نقل التحكم على الفور إلى الوظيفة الرئيسية () ، وبالتالي ، فهي هي التي تتلقى وسيطات سطر الأوامر التي تم تعيينها لمعلمات المتغير الخاصة بها.

حتى الآن ، قمنا بتعريف الدالة main () كما لو أنها لا تأخذ أي معاملات ولا تُرجع أي شيء. في الواقع ، في لغة C ، تُرجع أي دالة افتراضيًا (إذا لم يتم تعريف أي شيء آخر) عددًا صحيحًا. يمكن التحقق من هذا. إذا كتبت الرمز مثل هذا:

main () (printf ("Hi \ن") ؛ العودة 0 ؛ )

ثم لن يحدث أي تحذير أو خطأ أثناء التجميع. سيحدث نفس الشيء إذا كتبنا int main (). هذا يثبت أن الوظيفة الافتراضية ترجع عددًا صحيحًا وليس شيئًا (باطل). على الرغم من أنه يمكن دائمًا "تجاوز" ما ترجع الدالة ، على سبيل المثال ، voidmain () أو float main ().

عندما يتم استدعاء برنامج من سطر الأوامر ، يتم دائمًا تمرير زوج من البيانات إليه:

  1. عدد صحيح، تشير إلى عدد الكلمات (العناصر مفصولة بمسافات) في سطر الأوامر عند استدعائها ،
  2. مؤشر إلى مجموعة من السلاسل، حيث يكون كل سطر عبارة عن كلمة واحدة من سطر الأوامر.

لاحظ أن اسم البرنامج نفسه يعتبر أيضًا. على سبيل المثال ، إذا كانت المكالمة تبدو كالتالي:

./a.out 12 موضوع 2

ثم الوسيطة الأولى للبرنامج هي 4 ، ويتم تعريف مصفوفة السلاسل على أنها ("./a.out" ، "12" ، "theme" ، "2").

انتبه إلى المصطلحات ، فهناك وسيطتان فقط للبرنامج (رقم ومصفوفة) ، ولكن العديد من وسيطات سطر الأوامر كما تريد. يتم "ترجمة" وسيطات سطر الأوامر إلى وسيطات البرنامج (إلى وسيطات للوظيفة الرئيسية ()).
يتم تمرير هذه البيانات (الرقم والمؤشر) إلى البرنامج حتى عندما يتم استدعاؤها بالاسم دون تمرير أي شيء إليه: ./a.out. في هذه الحالة ، تكون الوسيطة الأولى هي 1 ، وتشير الوسيطة الثانية إلى مصفوفة تتكون من سلسلة واحدة فقط ("" ./a.out ").

حقيقة أن البيانات تمرر إلى البرنامج لا تعني أن الوظيفة الرئيسية () يجب أن تستقبلها. إذا تم تعريف الدالة main () بدون معلمات ، فلا يمكن الوصول إلى وسيطات سطر الأوامر. على الرغم من أنه لا يوجد شيء يمنعك من إرسالها. لن يحدث أي خطأ.

للوصول إلى البيانات التي تم تمريرها إلى البرنامج ، يجب تخصيصها للمتغيرات. نظرًا لأنه يتم تمرير الوسيطات على الفور إلى main () ، يجب أن يبدو رأسها كما يلي:
رئيسي (int n ، char * arr)

يحتوي المتغير الأول (n) على عدد الكلمات ، ويحتوي المتغير الثاني على مؤشر إلى مصفوفة من السلاسل النصية. غالبًا ما تتم كتابة المعلمة الثانية كـ ** arr. ومع ذلك ، هو نفسه. تذكر أن مصفوفة السلاسل نفسها تحتوي على مؤشرات للسلاسل كعناصرها. وفي الدالة نقوم بتمرير المؤشر إلى العنصر الأول من المصفوفة. اتضح أننا نمرر مؤشرًا إلى مؤشر ، أي ** آر.

يمارس
اكتب برنامجًا مثل هذا:

#يشمل int main (int argc، char ** argv) (int i؛ printf ("٪ d \ن"، argc) ؛ لـ (أنا = 0 ؛ أنا< argc; i++ ) puts (argv[ i] ) ; }

يقوم بطباعة عدد الكلمات في سطر الأوامر عندما يتم استدعاؤها ، وكل كلمة بها خط جديد. أطلق عليه بدون وسيطات سطر الأوامر وبالحجج.

في البرنامج ، استخدمنا المعلمات المتغيرة argc و argv. من المعتاد استخدام مثل هذه الأسماء فقط ، لكن في الواقع يمكن أن تكون أي شيء. من الأفضل الالتزام بهذا المعيار حتى تكون برامجك أكثر قابلية للفهم ليس لك فقط ، ولكن أيضًا للمبرمجين الآخرين.

الأهمية العملية لنقل البيانات إلى البرنامج

إذا كانت لديك خبرة في سطر أوامر GNU / Linux ، فأنت تعلم أن معظم الأوامر بها مفاتيح تبديل ووسائط. على سبيل المثال ، عند عرض محتويات الدلائل والنسخ والنقل ، يتم تحديد الكائنات كوسائط نظام الملفاتالذي يتم تنفيذ الأمر عليه. يتم تحديد ميزات تنفيذه باستخدام المفاتيح. على سبيل المثال ، في الأمر

Cp -r ../les_1 ../les_101

cp هو اسم الأمر ، -r هو رمز التبديل ، و ../les_1 و ../les_101 وسيطات الأمر.

بشكل عام ، في أغلب الأحيان ، عندما يتم تشغيل البرامج ، يتم نقل عناوين الملفات و "المعدلات" (هذه مفاتيح) لعملية تنفيذ البرنامج.

لنكتب برنامجًا يفتح الملفات المحددة من قبل المستخدم في سطر الأوامر للكتابة أو الإلحاق ويكتب (يضيف) هناك نفس المعلومات التي يدخلها المستخدم من لوحة المفاتيح أثناء تنفيذ البرنامج:

#يشمل #يشمل main (int argc، char ** argv) (int i، ch؛ FILE * f [5]؛ if (argc< 3 || argc >7) (يضع ( "عدد غير صالح من المعلمات") ؛ العودة 1 ؛ ) إذا (strcmp (argv [1]، "-w")! = 0 && strcmp (argv [1]، "-a")! = 0) (يضع ( "يمكن أن تكون المعلمة الأولى إما -w أو -a") ؛ العودة 2 ؛ ) لـ (أنا = 0 ؛ أنا< argc- 2 ; i++ ) { f[ i] = fopen (argv[ i+ 2 ] , argv[ 1 ] + 1 ) ; if (f[ i] == NULL) { printf ("لا يمكن فتح الملف٪ s \ n"، argv [i + 2]) ؛ العودة 3 ؛ )) بينما ((ch = getchar ())! = EOF) لـ (i = 0 ؛ i< argc- 2 ; i++ ) putc (ch, f[ i] ) ; for (i= 0 ; i < argc- 2 ; i++ ) fclose (f[ i] ) ; return 0 ; }

تفسيرات للكود:

  1. يتم إنشاء مصفوفة من خمسة مؤشرات للملفات. لذلك ، لا يمكن فتح أكثر من خمسة ملفات في نفس الوقت. سيتم تخزين مؤشر الملف للملف الأول في عنصر المصفوفة f ، والثاني - في f ، وهكذا.
  2. يتم فحص عدد وسيطات سطر الأوامر. يجب أن يكون هناك ثلاثة منهم على الأقل ، لأن. الأول هو اسم البرنامج ، والثاني هو وضع فتح الملف ، والثالث هو الملف الأول أو الوحيد الذي تتم الكتابة إليه. نظرًا لأن البرنامج يسمح لك فقط بفتح خمسة ملفات ، فلا يمكن أن يتجاوز العدد الإجمالي لوسائط سطر الأوامر سبعة. لذلك ، إذا كان عدد الوسائط أقل من 3 أو أكثر من 7 ، فسيتم إنهاء البرنامج ، لأن تؤدي تعليمة الإرجاع إلى إنهاء الوظيفة ، حتى لو كان هناك المزيد من التعليمات البرمجية بعد ذلك. يمكن تفسير قيمة إرجاع الدالة التي لا تساوي 0 من خلال العملية الأصلية على أنها رسالة تفيد بإنهاء البرنامج بخطأ.
  3. يتم التحقق من صحة وسيطة سطر الأوامر الثانية. إذا لم يكن "-w" ولا "-a" ، فإن التعبير الشرطي في الثانية إذا أعاد 1 (صواب). تسمح لك الدالة strcmp () بمقارنة السلاسل وإرجاع 0 إذا كانت متساوية.
  4. في لحلقةيتم فتح الملفات على العناوين المحددة التي تبدأ بالعنصر الثالث من مصفوفة argv. هذا هو سبب إضافة 2 إلى i للحصول على عناصر مصفوفة argv ، بدءًا من الصف الثالث. يشير التعبير argc-2 إلى عدد أسماء الملفات التي تم تمريرها ؛ لأن argc يخزن العدد الإجمالي لوسائط سطر الأوامر ، أول اثنتين منها ليستا أسماء ملفات.
  5. يسمح لك التعبير argv + 1 "بقطع" السلسلة الفرعية "w" (أو "a") من السلسلة "-w" (أو "-a") ، لأن argv هو في الأساس مؤشر إلى العنصر الأول من السلسلة. بإضافة واحد إلى المؤشر ، نحوله إلى العنصر التالي في المصفوفة.
  6. إذا تعذر فتح الملف ، ترجع الدالة fopen () القيمة NULL. في هذه الحالة ، ينتهي البرنامج.
  7. تتم كتابة كل حرف يدخله المستخدم من لوحة المفاتيح على جميع الملفات المفتوحة.
  8. في النهاية ، يتم إغلاق الملفات.

عند إنشاء تطبيق وحدة تحكم تلقائيًا بلغة برمجة C ++ ، يتم إنشاء وظيفة رئيسية تلقائيًا مشابهة جدًا لهذه الوظيفة:

int main (int argc، char * argv)
{…}

يحتوي رأس الوظيفة على التوقيع الوظيفة الأساسية main () مع الوسيطات argc و argv.
إذا تم تشغيل البرنامج من خلال سطر الأوامر ، فمن الممكن نقل أي معلومات إلى هذا البرنامج. هناك وسيطات سطر الأوامر argc و argv لهذا الغرض.
المعلمة argc من النوع int ، وتحتوي على عدد المعلمات التي تم تمريرها إلى الوظيفة الرئيسية. علاوة على ذلك ، فإن argc تساوي دائمًا 1 على الأقل ، حتى في حالة عدم تمرير أي معلومات إلى الوظيفة الرئيسية ، نظرًا لأن اسم التطبيق يعتبر المعلمة الأولى.
المعلمة argv هي مجموعة من المؤشرات على السلاسل النصية. يمكن فقط تمرير بيانات نوع السلسلة عبر سطر الأوامر.

عند بدء البرنامج عن طريق الأمر خط ويندوزيمكنك إرسال بعض المعلومات إليه. في هذه الحالة ، سيبدو سطر الأوامر كما يلي:
محرك الأقراص: \ المسار \ name.exe الوسيطة 1 الوسيطة 2 ...

يتم فصل وسيطات سطر الأوامر بمسافة واحدة أو أكثر.

تحتوي الوسيطة argv على اسم التطبيق المؤهل بالكامل:

#يشمل
استخدام اسم للمحطة؛

كوت<< argv << endl;

العودة 0 ؛
}

نتيجة التنفيذ

مثال: حساب حاصل ضرب عددين صحيحين
يستخدم البرنامج السلسلة إلى دالة تحويل عدد صحيح StrToInt () من هنا.

#يشمل
استخدام اسم للمحطة؛
int StrToInt (char * s) (…)
int main (int argc، char * argv) (

كثافة العمليات أ = 0 ، ب = 0 ؛

إذا (argc> 1)

أ = StrToInt (argv) ؛

إذا (argc> 2)

ب = StrToInt (argv) ؛

كوت<< a <<«*» << b << «= « << a*b << endl;

العودة 0 ؛
}

تم إطلاق البرنامج باسم

نتيجة التنفيذ

تصحيح أخطاء برنامج بحجج سطر الأوامر

لتمرير وسيطات سطر الأوامر عند تصحيح أخطاء البرنامج ، تحتاج إلى الوصول إلى القائمة ملكياتمشروع.


في علامة التبويب خصائص التكوين -> التصحيحيختار حجج القيادةوتعيين قيمهم.

عند تشغيل البرنامج في وضع التصحيح ، سيعامل البرنامج الوسائط التي تم إدخالها كوسائط سطر أوامر.


في بعض الأحيان ، عند بدء برنامج ، يكون من المفيد تمرير بعض المعلومات إليه. عادةً ما يتم تمرير هذه المعلومات إلى الدالة main () عبر وسيطات سطر الأوامر. حجة سطر الأوامرهي المعلومات التي يتم إدخالها في سطر أوامر نظام التشغيل بعد اسم البرنامج. على سبيل المثال ، لبدء تجميع برنامج ، تحتاج إلى كتابة ما يلي في سطر الأوامر بعد الموجه:

نسخة إسم البرنامج

إسم البرنامجعبارة عن وسيطة سطر أوامر تحدد اسم البرنامج الذي أنت على وشك تجميعه.

لقبول وسيطات سطر الأوامر ، يتم استخدام وسيطتين مضمنتين خاصتين: argc و argv. تحتوي المعلمة argc على عدد الوسائط في سطر الأوامر وهي عدد صحيح ، وتكون دائمًا 1 على الأقل لأن الوسيطة الأولى هي اسم البرنامج. والمعلمة argv هي مؤشر إلى مجموعة من المؤشرات على السلاسل النصية. في هذه المصفوفة ، يشير كل عنصر إلى بعض وسيطة سطر الأوامر. جميع وسائط سطر الأوامر عبارة عن سلاسل ، لذا يجب توفير تحويل أي أرقام إلى التنسيق الثنائي المطلوب في البرنامج عند تطويره.

فيما يلي مثال بسيط على استخدام وسيطة سطر الأوامر. تعرض الشاشة كلمة مرحبًا واسمك ، والتي يجب تحديدها كوسيطة لسطر الأوامر.

#يشمل #يشمل int main (int argc، char * argv) (if (argc! = 2) (printf ("نسيت إدخال اسمك. \ n") ؛ خروج (1) ؛) printf ("Hello٪ s"، argv) ؛ عودة 0؛)

إذا قمت بتسمية اسم هذا البرنامج (الاسم) واسمك هو توم ، فعندئذ لتشغيل البرنامج ، أدخل اسم توم في سطر الأوامر. نتيجة تشغيل البرنامج ، ستظهر على الشاشة رسالة مرحبًا توم.

في العديد من البيئات ، يجب فصل جميع وسائط سطر الأوامر عن بعضها بواسطة مسافة أو علامة تبويب. لا تعتبر الفواصل والفاصلة المنقوطة والأحرف المماثلة فواصل. على سبيل المثال،

تشغيل بقعة ، تشغيل

يتكون من ثلاثة سلاسل أحرف ، بينما

إريك ، ريك ، فريد

عبارة عن سلسلة ذات حرف واحد - لا تعتبر الفواصل عمومًا محددات.

إذا كانت السلسلة تحتوي على مسافات ، ففي بعض البيئات يمكن وضع السلسلة بين علامتي اقتباس لمنع إنشاء وسيطات متعددة. نتيجة لذلك ، سيتم اعتبار السلسلة بأكملها كوسيطة واحدة. لمعرفة المزيد حول كيفية تعيين خيارات سطر الأوامر في نظام التشغيل لديك ، راجع الوثائق الخاصة بهذا النظام.

من المهم جدًا أن تصرح بشكل صحيح عن argv. إليك كيف يفعلون ذلك في أغلب الأحيان:

شار * أرغف ؛

تشير الأقواس المربعة الفارغة إلى أن طول المصفوفة غير محدد. يمكنك الآن الوصول إلى الوسائط الفردية عن طريق فهرسة المصفوفة argv. على سبيل المثال ، يشير argv إلى سلسلة الحرف الأول ، والتي تكون دائمًا اسم البرنامج ؛ argv يشير إلى الوسيطة الأولى ، وهكذا.

مثال صغير آخر على استخدام وسيطات سطر الأوامر هو برنامج العد التنازلي أدناه. يعد هذا البرنامج تنازليًا من بعض القيم (المحددة في سطر الأوامر) ويصدر صوتًا عندما يصل إلى 0. لاحظ أن الوسيطة الأولى التي تحتوي على القيمة الأولية يتم تحويلها إلى قيمة عدد صحيح باستخدام الدالة القياسية atoi (). إذا كانت الوسيطة الثانية لسطر الأوامر (وإذا أخذنا اسم البرنامج باعتباره الوسيطة الثالثة) هي السلسلة "display" (الإخراج إلى الشاشة) ، فسيتم عرض نتيجة العد التنازلي (بترتيب عكسي) على الشاشة.

/ * برنامج العد التنازلي. */ #يشمل #يشمل #يشمل #يشمل int main (int argc، char * argv) (int disp، count؛ if (argc<2) { printf("В командной строке необходимо ввести число, с которого\n"); printf("начинается отсчет. Попробуйте снова.\n"); exit(1); } if(argc==3 && !strcmp(argv, "display")) disp = 1; else disp = 0; for(count=atoi(argv); count; --count) if(disp) printf("%d\n", count); putchar("\a"); /* здесь подается звуковой сигнал */ printf("Счет закончен"); return 0; }

لاحظ أنه إذا لم يتم تحديد وسيطات سطر الأوامر ، فسيتم عرض رسالة خطأ. غالبًا ما تقوم البرامج التي تحتوي على وسيطات سطر الأوامر بما يلي: عندما يقوم المستخدم بتشغيل هذه البرامج دون إدخال المعلومات المطلوبة ، يتم عرض إرشادات حول كيفية تحديد الوسائط بشكل صحيح.

للوصول إلى حرف واحد في إحدى وسيطات سطر الأوامر ، أدخل الفهرس الثاني في argv. على سبيل المثال ، يقوم البرنامج التالي بطباعة جميع الوسائط التي تم استدعاؤها حرفًا بحرف:

#يشمل int main (int argc، char * argv) (int t، i؛ for (t = 0؛ t

تذكر أن الفهرس الأول لـ argv يوفر الوصول إلى السلسلة ، بينما يوفر الفهرس الثاني الوصول إلى أحرفها الفردية.

عادة ما يتم استخدام argc و argv لتمرير الأوامر الأولية إلى البرنامج الذي سيحتاجه عند بدء تشغيله. على سبيل المثال ، غالبًا ما تحدد وسيطات سطر الأوامر معلومات مثل اسم الملف أو الخيار أو السلوك البديل. يمنح استخدام وسيطات سطر الأوامر برنامجك "مظهرًا احترافيًا" ويجعل من السهل استخدامه في الملفات الدفعية.

الأسماء argc و argv تقليدية ولكنها غير مطلوبة. يمكنك تسمية هاتين المعلمتين في الدالة main () كيفما تشاء. أيضًا ، قد يدعم بعض المترجمين وسيطات إضافية لـ main () ، لذا تأكد من مراجعة وثائق المترجم.

عندما لا يتطلب البرنامج معلمات سطر الأوامر ، فمن الشائع أن تعلن صراحة أن الوظيفة الرئيسية () لا تحتوي على معلمات. في هذه الحالة ، يتم استخدام الكلمة الأساسية void في قائمة المعلمات الخاصة بهذه الوظيفة.

يدعم Borland C ++ ثلاث حجج رئيسية (). الأولين هما argc و argv التقليديان. هذه هي الوسيطات الوحيدة للدالة main () المحددة بواسطة معيار ANSI C. وهي تسمح بتمرير وسيطات سطر الأوامر إلى البرنامج. وسائط سطر الأوامر هي المعلومات التي تتبع اسم البرنامج في سطر أوامر نظام التشغيل. على سبيل المثال ، عندما يتم تجميع برنامج باستخدام مترجم Borland المضمن ، يتم عادةً كتابة bcc إسم البرنامج

أين إسم البرنامجهو البرنامج الذي سيتم تجميعه. يتم تمرير اسم البرنامج إلى المترجم كوسيطة.

تحتوي المعلمة argc على عدد وسيطات سطر الأوامر وهي عدد صحيح. يكون دائمًا 1 على الأقل لأن اسم البرنامج مؤهل ليكون الوسيطة الأولى. المعلمة argv هي مؤشر إلى مصفوفة من مؤشرات الأحرف. يشير كل عنصر من عناصر هذه المصفوفة إلى وسيطة سطر أوامر. جميع وسائط سطر الأوامر عبارة عن سلاسل. يتم تحويل جميع الأرقام بواسطة البرنامج إلى تنسيق داخلي. يقوم البرنامج التالي بطباعة كلمة "Hello" متبوعة باسم المستخدم إذا تمت كتابته مباشرة بعد اسم البرنامج:

#يشمل

{
إذا (argc! = 2)
{
printf ("نسيت كتابة اسمك \ n")؛
العودة 1 ؛
}
printf ("Hello٪ s"، argv) ؛
العودة 0 ؛
}

إذا سميت هذا البرنامج ، واسم المستخدم هو Sergey ، فعندئذٍ لتشغيل البرنامج ، يجب عليك كتابة:
اسم سيرجي.
نتيجة البرنامج سوف تظهر:
مرحبا سيرجي.

يجب فصل وسيطات سطر الأوامر بمسافات أو علامات جدولة. لا تعتبر الفواصل والفاصلة المنقوطة والأحرف المماثلة فواصل. على سبيل المثال:

يتكون من ثلاثة أسطر ، بينما

هيرب ، ريك ، فريد

هذا سطر واحد - الفواصل ليست محددات.

إذا كنت تريد تمرير سلسلة تحتوي على مسافات أو علامات جدولة كوسيطة واحدة ، فقم بتضمينها بين علامتي اقتباس. على سبيل المثال ، هذه حجة واحدة:

"هذا اختبار"

من المهم أن تصرح بشكل صحيح عن argv. الطريقة الأكثر شيوعًا هي:

تشير الأقواس الفارغة إلى أن المصفوفة ليس لها طول ثابت. يمكنك الوصول إلى العناصر الفردية باستخدام فهرسة argv. على سبيل المثال ، يشير argv إلى السطر الأول الذي يحتوي دائمًا على اسم البرنامج. argv يشير إلى السطر التالي ، وهكذا.

يوجد أدناه مثال صغير على استخدام وسيطات سطر الأوامر. يقوم بالعد التنازلي من القيمة المحددة في سطر الأوامر ويصدر إشارة عند الوصول إلى الصفر. لاحظ أن الوسيطة الأولى تحتوي على رقم تم تحويله إلى عدد صحيح باستخدام دالة atoi () القياسية. إذا كانت السلسلة "display" موجودة كوسيطة ثانية ، فسيتم عرض العداد نفسه على الشاشة.

/ * برنامج العد * /

#يشمل
#يشمل
#يشمل
int main (int argc، char * argv)
{
int disp ، عد ؛
إذا (argc<2)
{
printf ("يجب إدخال طول العد \ n")؛
printf ("في سطر الأوامر. حاول مرة أخرى. \ n")؛
العودة 1 ؛
}
إذا (argc == 3 &&! strcmp (argv، "display")) disp = 1 ؛
آخر ديس = 0 ؛
لـ (count = atoi (argv) ؛ count ؛ -count)
if (disp) printf ("٪ d" ، عدد) ؛
printf ("٪ c"، "\ a") ؛ / * على معظم أجهزة الكمبيوتر هذه مكالمة * /
العودة 0 ؛
}

لاحظ أنه إذا لم يتم تحديد وسيطات ، فستظهر رسالة خطأ. هذا هو الأكثر شيوعًا للبرامج التي تستخدم وسيطات سطر الأوامر لإصدار التعليمات إذا جرت محاولة لتشغيل البرنامج بدون المعلومات الصحيحة.

للوصول إلى أحرف سطر الأوامر الفردية ، أضف فهرسًا ثانيًا إلى argv. على سبيل المثال ، يقوم البرنامج التالي بطباعة جميع الوسائط التي تم استدعاؤها بها ، حرفًا واحدًا في كل مرة:

#يشمل
int main (int argc، char * argv)
{
int t ، i ؛
من أجل (ر = 0 ؛ ر {
أنا = 0 ؛
بينما (argv [t] [i])
{
printf ("٪ c"، argv [t] [i]) ؛
}
printf (") ؛
}
العودة 0 ؛
}

يجب أن نتذكر أن الفهرس الأول مخصص للوصول إلى السلسلة ، والثاني للوصول إلى حرف السلسلة.

عادةً ما يتم استخدام argc و argv للحصول على أوامر المصدر. نظريًا ، يمكن أن يكون لديك ما يصل إلى 32767 وسيطة ، لكن معظم أنظمة التشغيل لا تسمح لك بالاقتراب من ذلك. عادةً ما يتم استخدام هذه الوسائط لتحديد اسم الملف أو الخيارات. يمنح استخدام وسيطات سطر الأوامر البرنامج مظهرًا احترافيًا ويسمح باستخدام البرنامج في ملفات دفعية.

إذا قمت بتضمين ملف WILDARGS.OBJ المتوفر مع Borland C ++ ، يمكنك استخدام أحرف البدل في وسيطات نوع * .EXE. (يتعامل Borland C ++ مع الأنماط تلقائيًا ويزيد argc وفقًا لذلك.) على سبيل المثال ، إذا قمت بتوصيل WILDARGS.OBJ بالبرنامج التالي ، فسيتم طباعة عدد الملفات التي تطابق اسم الملف المحدد في سطر الأوامر:

/ * ربط هذا البرنامج بـ WILDARGS.OBJ * /

#يشمل
int main (int argc، char * argv)
{
تسجيل int i؛
printf ("٪ d ملفات تطابق الاسم المحدد \ n"، argc-1)؛
printf ("هم:") ؛
لـ (أنا = 1 ؛ أنا printf ("٪ s"، argv [i]) ؛
العودة 0 ؛
}

إذا أطلقنا على هذا البرنامج WA ، فقم بتشغيله على النحو التالي ، نحصل على عدد الملفات التي لها امتداد EXE ، وقائمة بأسماء هذه الملفات:

بالإضافة إلى argc و argv ، يوفر Borland C ++ أيضًا وسيطة سطر أوامر ثالثة -env. تسمح المعلمة env للبرنامج بالوصول إلى معلومات حول بيئة نظام التشغيل. يجب أن يتبع المعامل env argc و argv ويصرح بهذا الشكل:

كما ترى ، تم التصريح عن env بنفس الطريقة مثل argv. تمامًا مثل argv ، هذا مؤشر لمجموعة من السلاسل النصية. كل سطر عبارة عن سلسلة بيئة كما هو محدد بواسطة نظام التشغيل. ليس للمعامل env أي نظير للمعامل argc ، والذي يخبر عدد سطور البيئة الموجودة. بدلاً من ذلك ، يكون السطر الأخير من البيئة فارغًا. يقوم البرنامج التالي بطباعة جميع سلاسل البيئة المحددة حاليًا في نظام التشغيل:

/ * هذا البرنامج يقوم بطباعة كافة خطوط البيئة * /

#يشمل
int main (int argc، char * argv، char * env)
{
ر int ؛
لـ (t = 0 ؛ env [t] / t ++)
printf ("٪ s \ n"، env [t]) ؛
العودة 0 ؛
}

لاحظ أنه على الرغم من أن argc و argv لا يستخدمهما البرنامج ، إلا أنهما يجب أن يكونا موجودين في قائمة المعلمات. لا يعرف C أسماء المعلمات. بدلاً من ذلك ، يتم تحديد استخدامها بالترتيب الذي يتم فيه الإعلان عن المعلمات. في الواقع ، يمكنك استدعاء المعلمة ما تريد. نظرًا لأن argc و argv و env هي أسماء تقليدية ، فمن الأفضل الاستمرار في استخدامها حتى يتمكن أي شخص يقرأ البرنامج من التعرف على الفور على أنها حجج للدالة main ().

بالنسبة للبرامج ، تتمثل المهمة النموذجية في العثور على القيمة المحددة في سلسلة البيئة. على سبيل المثال ، تسمح محتويات سلسلة PATH للبرامج باستخدام مسارات البحث. يوضح البرنامج التالي كيفية البحث عن السلاسل التي تعلن عن مسارات البحث القياسية. يستخدم دالة المكتبة القياسية strstr () ، والتي لديها النموذج الأولي التالي:

Char * strstr (const char * str1، const char * str2) ؛

تبحث الدالة strstr () عن السلسلة التي يشير إليها str1 في السلسلة التي يشير إليها str2. إذا تم العثور على مثل هذه السلسلة ، فسيتم إرجاع مؤشر إلى الموضع الأول. إذا لم يتم العثور على تطابق ، تقوم الدالة بإرجاع NULL.

/ * يبحث البرنامج في سلاسل البيئة عن سلسلة تحتوي على PATH * /

#يشمل
#يشمل
int main (int argc، char * argv، char * env)
{
ر int ؛
لـ (t = 0 ؛ env [t] ؛ t ++)
{
إذا (strstr (env [t] ، "PATH"))
printf ("٪ s \ n"، env [t]) ؛
}
العودة 0 ؛
}



تحميل...
قمة