আমার সি প্রোগ্রামগুলিতে আমার প্রায়শই আমার এডিটিগুলির স্ট্রিং উপস্থাপনা করার একটি উপায় প্রয়োজন। এমনকি যদি আমার কোনওভাবেই স্ট্রিংটি স্ক্রিনে মুদ্রণের প্রয়োজন না হয় তবে ডিবাগিংয়ের জন্য এ জাতীয় পদ্ধতি থাকা ঝরঝরে। সুতরাং এই ধরনের ফাংশন প্রায়শই উঠে আসে।
char * mytype_to_string( const mytype_t *t );
আমি আসলে বুঝতে পারি যে স্ট্রিংটি ফিরে আসার জন্য স্মৃতি পরিচালনা করার জন্য আমার কাছে এখানে কমপক্ষে তিনটি বিকল্প রয়েছে (কমপক্ষে))
বিকল্প 1: ফাংশনে স্ট্যাটিক চর অ্যারেতে রিটার্ন স্ট্রিং সংরক্ষণ করে। প্রতিটি কলটিতে স্ট্রিংটি ওভাররাইট করা বাদে আমার বেশি চিন্তাভাবনা করার দরকার নেই। যা কিছু অনুষ্ঠানে সমস্যা হতে পারে।
বিকল্প 2: ফাংশনের অভ্যন্তরে মলোকের সাহায্যে স্তূপে স্ট্রিং বরাদ্দ করুন। সত্যিই ঝরঝরে আমি যেহেতু তখন কোনও বাফারের আকার বা ওভাররাইটিংয়ের কথা ভাবার দরকার নেই। যাইহোক, স্ট্রিংটি সম্পূর্ণ করার সময় আমাকে () স্মরণ করতে হবে এবং তারপরে আমাকে একটি অস্থায়ী পরিবর্তনশীল যেমন আমি মুক্ত করতে পারি তার জন্যও আমাকে নিয়োগ করতে হবে। এবং তারপরে স্তূপ বরাদ্দ স্ট্যাক বরাদ্দের চেয়ে সত্যিই অনেক ধীর, অতএব যদি এটি কোনও লুপে পুনরাবৃত্তি হয় তবে বাধা হোন।
বিকল্প 3: একটি বাফারে পয়েন্টারে পাস করুন, এবং কলারকে সেই বাফার বরাদ্দ দিন। ভালো লেগেছে:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
এটি কলারের আরও প্রচেষ্টা নিয়ে আসে। আমি আরও লক্ষ্য করি যে এই বিকল্পটি আমাকে যুক্তিগুলির ক্রম হিসাবে একটি অন্য বিকল্প দেয়। আমার প্রথম এবং শেষটি কোন যুক্তিযুক্ত হওয়া উচিত? (আসলে ছয়টি সম্ভাবনা)
তাহলে, আমার কোনটি পছন্দ করা উচিত? কেন? সি বিকাশকারীদের মধ্যে কি কোনও ধরনের অলিখিত মান রয়েছে?
sysctlbyname
ওএস এক্স এবং আইওএসে