আরগভের শেষে সর্বদা নাল থাকাকালীন কেন আমাদের আরগসি দরকার?


117

মনে হয় argv[argc]এটি সর্বদা রয়েছে NULL, সুতরাং আমি মনে করি আমরা যুক্তি তালিকাকে ছাড়াই পার করতে পারি argc। একটি whileলুপ এটি করবে।

যদি সবসময় NULLশেষে থাকে তবে আমাদের argvকেন দরকার argc?


17
এটি সম্ভবত সুবিধার বিষয়। লুপিং ছাড়াই পর্যাপ্ত যুক্তি না থাকলে তাড়াতাড়ি জামিনে আটকানোর একটি সহজ উপায় প্রোগ্রামারকে দেয়। অন্যথায় আমাদের অবশ্যই এটি করা int argc(char *argv[])ঠিক
হ'ল ফাংশনগুলি হবে

5
কেবল পরিষ্কার করে "\0"বলা উচিত NULL পয়েন্টারটির মতো নয় ( 0সি ++ তে NULL এর সমতুল্য)
ম্যাটস পিটারসন

31
আমাদের আরগসি থাকলে NUL হওয়ার জন্য আমাদের আরগভি [আরগসি] দরকার কেন?
আম্বোজ বিজ্জাক

7
অবিচ্ছিন্ন সময়ে আপনি কীভাবে আর্গুমেন্টের সংখ্যা নির্ধারণ করবেন?
অবাকর

4
লিনাক্স / ইউনিক্স ট্যাগগুলি এখানে উপযুক্ত বলে মনে করবেন না, কারণ এই আচরণটি সমস্ত অপারেটিং সিস্টেমে সমস্ত সংস্থাগুলির ক্ষেত্রে সত্য হওয়া উচিত।
ড্যারেল হফম্যান

উত্তর:


106

হ্যাঁ, argv[argc]==NULLগ্যারান্টিযুক্ত দেখুন C11 5.1.2.2.1 প্রোগ্রাম প্রারম্ভে (আমার জোর)

যদি সেগুলি ঘোষিত হয় তবে মূল ফাংশনের প্যারামিটারগুলি নিম্নলিখিত সীমাবদ্ধতাগুলি মেনে চলবে:

আর্গকের মান ননজেটিভ হবে। আরজিভি [আরজিসি] একটি নাল পয়েন্টার হবে।

প্রদান argcসেইজন্য অত্যাবশ্যক নয় কিন্তু এখনও দরকারী। অন্যান্য বিষয়গুলির মধ্যে এটি দ্রুত পরীক্ষা করার অনুমতি দেয় যে আর্গুমেন্টের সঠিক সংখ্যাটি পাস হয়েছে।

সম্পাদনা: প্রশ্নটি সি ++ অন্তর্ভুক্ত করার জন্য সংশোধন করা হয়েছে। n3337 খসড়া 3.6.1 মূল ফাংশন বলে

2 ... আরজিসি হ'ল প্রোগ্রামটি যে পরিবেশে চালিত হয় সেখান থেকে প্রোগ্রামটিতে আর্গুমেন্টের সংখ্যা। .... আরগকের মান অ-নেতিবাচক হবে। আরগভি [আরগসি] এর মান 0 হবে


36
আর argcবেশ বড় হতে পারে, কারণ শেল সম্প্রসারণ করছে (তাই আগে শেল দ্বারা প্রসারিত হয় এর এক্সিকিউটেবল)। আমার সিস্টেমে আমার কয়েকশো হাজার লোক থাকতে পারে । ls **execve/bin/lsargc
বেসাইল স্টারিঙ্কেভিচ

এটি বেশ দুর্দান্ত, যেহেতু আমি সর্বদা যথেষ্ট বিবেচনা করি তা আমার কাছে কখনই ঘটে না argc, তবে আমি অবশ্যই এমন পরিস্থিতিতে ভাবতে পারি যেখানে এই গ্যারান্টিটি প্রাসঙ্গিক এবং এমনকি প্রয়োজনীয় হবে। +1
টমাস

6
@ বেসাইলস্টারিঙ্কেভিচ পয়েন্টারের মানচিত্রের অ্যারে দিয়ে কেবল পদক্ষেপ নেওয়ার সময়টি NUL অবধি একটি অতিরিক্ত সময় নির্ধারণ করে, গণনাটি অর্জনের জন্য, ইতিমধ্যে পয়েন্টার অ্যারে তৈরি করতে ব্যয় করা সময়ের সাথে তুলনামূলকভাবে কম, এবং প্রোগ্রামের প্রতিটি যুক্তির মান ব্যবহার করার তুলনায় আরও বেশি অপ্রাসঙ্গিক। এবং যদি কেবল আর্গুমেন্ট গণনাটি এন এর চেয়ে বেশি হয় কিনা তা পরীক্ষা করে দেখানো হয় তবে পুরো অ্যারে দিয়ে যাওয়ার দরকার নেই। তবুও, আমি পুরোপুরি একমত, এটি argcছিল একটি ভাল জিনিস।
হাইড

43

হ্যাঁ, argv[argc]নাল পয়েন্টার হওয়ার নিশ্চয়তা রয়েছে। argcসুবিধার জন্য ব্যবহৃত হয়।

সি 99 রেশনাল থেকে সরকারী ব্যাখ্যা উদ্ধৃত করে, রিডানড্যান্ট চেক শব্দটি নোট করুন :

আন্তর্জাতিক মানের জন্য প্রোগ্রামিং - প্রোগ্রামিং ভাষা - সি .15.1.2.2.1 প্রোগ্রাম শুরু

বিস্তৃত পূর্ব চর্চা স্বীকৃতি হিসাবে যুক্তিগুলির স্পেসিফিকেশন argcএবং argvহিসাবে mainargv[argc]সাধারণ অনুশীলনের ভিত্তিতে তালিকার শেষের জন্য অপ্রয়োজনীয় চেক সরবরাহের জন্য নাল পয়েন্টার হওয়া প্রয়োজন।


19

এটি historicalতিহাসিক কারণে, এবং পুরানো কোডের সাথে সামঞ্জস্য। মূলত, আরগভি অ্যারের শেষ উপাদান হিসাবে নাল পয়েন্টার থাকার কোনও নিশ্চয়তা ছিল না। কিন্তু আরগসি সবসময়ই আছে ।


... যা একরকম লজ্জাজনক। আমাদের যদি থাকে int main(char *argv[], int argc, ...)তবে কিছু প্রোগ্রাম কেবল এটি বাদ দিতে পারে argcকারণ তাদের এটির প্রয়োজন নেই। বিপরীতে (প্রয়োজন argcতবে নয় argv) সম্ভবত কোনও আসল প্রোগ্রামে কার্যকর হয় না।
হাইড

@ হাইড: বেসাইল স্টারিনকিভিচ
জেন্টারুনিক্স

6

আমাদের এটি "প্রয়োজন", কারণ এটি বিভিন্ন স্ট্যান্ডার্ড দ্বারা প্রয়োজনীয়।

আমরা মানটিকে সম্পূর্ণ উপেক্ষা করতে পারি, তবে এটি যেহেতু এটি প্রথম প্যারামিটার main, তাই আমাদের অবশ্যই এটি প্যারামিটার তালিকায় থাকা উচিত। সি ++ (এবং সম্ভবত অ-মানক সি ডায়ালিকস) এ আপনি এই সি ++ স্নিপেট (সি রূপান্তর করতে সহজ) এর মতো প্যারামিটারের নামটি বাদ দিতে পারেন:

#include <stdio.h> // C-compatible include, guarantees puts in global namespace

// program will print contents of argv, one item per line, starting from argv[0]

int main(int /*argc*/, char *argv[]) { // uncomment argc for C

    //(void)argc; // uncomment statement for C

    for (int i=0; argv[i]; ++i) {
        puts(argv[i]);
    }

    return 0;
}

সাধারণ সিটিতে, সাধারণ সতর্কতা সেটিংস সহ, অব্যবহৃত প্যারামিটার সতর্কতা উত্পন্ন করে, যা কোনও বিবৃতি দিয়ে স্থির করা যেতে পারে (void)argc;যার ফলে কোনও কোড উত্পন্ন না করেই নামটি ব্যবহৃত হয়।

argcভাল লাগছে, কারণ অন্যথায় অনেকগুলি প্রোগ্রামের গণনা পাওয়ার জন্য পরামিতিগুলি বজায় রাখতে হবে। এছাড়াও, অনেকগুলি প্রোগ্রামিং ভাষায় অ্যারেগুলির দৈর্ঘ্য রয়েছে এমন কোনও argcপ্যারামিটার নেই, আইটেমগুলির সাথে কেবল একটি অ্যারে রয়েছে।


প্রশ্ন সি এবং সি ++ উভয়েরই। সি তে, প্যারামিটারের নামটি প্রয়োজন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.