كيف يمكنني التعامل مع تعيينات مجموعة أحرف argv؟

StackOverflow https://stackoverflow.com/questions/1214251

  •  06-07-2019
  •  | 
  •  

سؤال

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

int main (int argc, char **argv)
{
  const char *s1 = argv[0];
  char s2[256];
  strcpy(s2, argv[0]);

  printf("s1: %s\ns2: %s\n\n", s1, s2);
}

تم التجميع باستخدام برنامج التحويل البرمجي IBM xlc على إرجاع نظام AIX

[مطالبتي]> ./a.out

ج1:./a.out

س2:./a.out

ما هو التنفيذ (s1 أو s2) الصحيح؟s1 جميل لأن argv[0] يمكن أن يكون بأي طول.يتطلب s2 أن يكون طول argv[0] <256 حرفًا.

لا أفهم كيف/لماذا يجب أن يعمل s1.أنا يفكر يجب أن يكون الجانب الأيمن من s1 مطلوبًا في وقت الترجمة، ولكن أنا يفكر يتم إنشاؤه في وقت التشغيل.

هل كانت مفيدة؟

المحلول

سبب عمل s1 هو نوع argv[0] يكون مؤشر.أنت ببساطة تقوم بتعيين العنوان (وليس القيمة الفعلية)، وهو أمر آمن.أنت لا تقوم بأي نوع من التخصيص أو الإلقاء.

أفضّل عادةً الخيار الأول حيث يجب أن تقرأ فقط من متغيرات الوسيطة.

نصائح أخرى

إذا كنت لا ترغب في تغيير سلسلة ثم s1 وسوف يعمل.

إذا كنت تريد تغيير سلسلة ثم يمكنك جعل نسخة منه. يجب عليك استخدام strnlen أكثر أمانا () وstrncpy () ولو كان النظام الخاص بك يدعم ذلك.

<اقتباس فقرة>   

وأعتقد أن الجانب الأيمن من S1   ينبغي أن يطلب في وقت الترجمة،   ولكن اعتقد انها ولدت في   وقت التشغيل.

لا، بل هو مطلوب في كل مرة واجه البيان. على سبيل المثال:

void f() {
   int x = 1;
   ...
}

وسيتم initialised العدد الصحيح العاشر إلى 1 في كل مرة يتم استدعاء الدالة، وليس في وقت الترجمة.

وS2 لديها ممتلكات لذيذ من كونه عرضة لتجاوز سعة المخزن المؤقت.

الناس

ولقد رأيت تغيير قيمة ARGV [0]. في بعض الحالات، (على بعض أنظمة تشغيل) تغيير ARGV [0] سيجعل البرنامج تظهر في ملاحظة ما أن ما قمت بتغيير ل.

إذا كنت تريد فقط الإشارة إلى الوسيطة دون إجراء أي تغييرات عليها S1 صحيح.

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

واود ان اذهب مع S1، وخاصة بالنسبة ARGV [ن] حيث n> 0. أشياء مثل S2 تفتح لك لهجمات تجاوز سعة المخزن المؤقت الكلاسيكية. في الأساس، يمكن للمستخدم تنسيق حجة ان أكثر من 256 حرفا والكتابة المعلومات على المكدس حتى يتمكنوا من تشغيل أية تعليمات برمجية يريدون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top