আপনার কেবল কখন পঠনযোগ্য দৃশ্যে নাল টার্মিনেটেড স্ট্রিং দরকার?


10

আমি std::string_viewলাইব্রেরির সাথে ঘুরে বেড়াচ্ছি এবং আমি std::string_viewযতটা সম্ভব সম্ভব ব্যবহার করার জন্য একটি কোড বেস পরিবর্তন করার বিষয়ে চিন্তাভাবনা করছি । যাইহোক, আমি যে থ্রেড পড়েছি তার মধ্যে কখন এবং কোথায় std::string_viewপরিবর্তে ব্যবহার করতে হবে সে বিষয়ে পড়েছি const std::string &। আমি অনেক উত্তর দেখেছি বলেছি, "যখন আপনার নাল টার্মিনেটেড স্ট্রিংয়ের প্রয়োজন হবে না।" সুতরাং যখন আমি ওয়েবে চারপাশে অনুসন্ধান শুরু করি, "আপনার কখন নাল টার্মিনেটেড স্ট্রিং দরকার?" আমি সত্যিই বিষয়টিতে কোনও সহায়ক উত্তর পাই নি।

আমি একটি বহিস্থিত গ্রন্থাগার একটি উদাহরণ এর মনে করেন আপনি লিঙ্ক করবে যে একটি প্রয়োজন পারবেন std::string। এবং সেই ক্ষেত্রে আপনার একটি নাল টার্মিনেটেড স্ট্রিং প্রয়োজন যেহেতু সেই লাইব্রেরির এটির প্রয়োজন। আমি অনুমান করি যে অন্য একটি উদাহরণটি হ'ল যদি আপনার নিজের স্ট্রিংটি নিজেই সংশোধন করতে হয় const &তবে আমাদের যদি এটি সংশোধন করার প্রয়োজন হয় তবে আমরা এটি পাস করব না।

সুতরাং কখন আপনাকে নাল টার্মিনেটেড স্ট্রিং ব্যবহার করতে হবে?

আমি যে লিঙ্কগুলি দেখেছি:

  1. স্ট্যান্ড :: স্ট্রিং ভিউ ঠিক কীভাবে কনস্ট স্ট্যান্ড :: স্ট্রিং ও এর চেয়ে দ্রুত?
  2. আমি কখন স্ট্যান্ড :: স্ট্রিং_ভিউয়ের পরিবর্তে কনস্ট্যান্ড এবং স্ট্যান্ড :: স্ট্রিং পাস করব?
  3. কেন কেবল স্ট্রিং ভিউ?
  4. সি ++ 17 তে কনস্ট স্ট্যান্ড :: স্ট্রিং এবং আর্গুমেন্টগুলি ব্যবহার করার কোনও ধারণা আছে?

5
বেশিরভাগ ক্ষেত্রে সি এপিআই সহ ইন্টারফেস করতে।
আখরোট

@uneven_mark আপনি একটি উদাহরণ প্রদান করতে পারেন?
সায়লনারমো

আপনার লিঙ্ক করা চতুর্থ প্রশ্নের উত্তর গৃহীত হয়েছে বলে মনে হচ্ছে এটি এই প্রশ্নের উত্তর দেয়।
ফ্রান্সোইস অ্যান্ড্রিক্স

1
@ সাইলনারমো বেশিরভাগ ফাংশন যেমন পসিক্স বা অন্য কোনও সি লাইব্রেরি const char*যুক্তি গ্রহণ করে। এরেরিকার অ্যাওয়ারের উদাহরণ রয়েছে।
আখরোট

1
@ ফ্রানসোয়াআন্ড্রিয়াক্স তাই সত্যিই উত্তরটি হল, "যতক্ষণ না এপিআই নাল টার্মিনেটেড স্ট্রিংয়ের ডাক দেয় না?"
সাইলানর্মো

উত্তর:


10

আপনার কখন নাল টার্মিনেটেড স্ট্রিং দরকার?

আপনি যে এপিআই ব্যবহার করেন তা যখনই আপনার প্রয়োজন তখন আপনাকে নাল টার্মিনেটেড স্ট্রিং দরকার। এই প্রয়োজনীয়তা সি ইন্টারফেসে সর্বব্যাপী এবং কিছু ডকুমেন্টেশনে সুস্পষ্টভাবে বলা হয়নি। যদি কোনও ফাংশন আর্গুমেন্ট হ'ল char*(সম্ভবত কনস্টেড), এবং কোনও দৈর্ঘ্যের যুক্তি না থাকে তবে ডকুমেন্টেশন অন্যথায় না বলে আপনার প্রয়োজনীয়তাটি ধরে নেওয়া উচিত।

execveউদাহরণস্বরূপ ফাংশনটি (পসিক্স মান থেকে) নেওয়া যাক :

int execve(const char *pathname, char *const argv[], char *const envp[]);

আপনি যদি নন-নাল টার্মিনেটেড আর্গুমেন্ট হিসাবে পাস করেন pathnameতবে আপনার প্রোগ্রামের আচরণটি সংজ্ঞায়িত হবে।


সুতরাং এক্ষেত্রে, পথের নামটি কি এটির std::stringমতো হবে execve(pathname.c_str(),...,...)?
সায়লনারমো

6

এটি আসলে জানা খুব সহজ। আপনি যদি এমন কোনও ফাংশন কল করছেন যা কেবল সি-স্ট্রিং ( char*/ const char*) নেয়, তবে আপনার নাল টার্মিনেটেড স্ট্রিং দরকার কারণ স্ট্রিংটির শেষে কোথায় তা জানার একমাত্র উপায়।

এর পরিবর্তে যদি আপনার কোনও ফাংশন থাকে যা একটি char*/ const char*প্লাস আকার গ্রহণ করে, বা কেবলমাত্র দুটি পয়েন্টার যা উপাত্তের শুরু এবং শেষ চিহ্নিত করে, তবে আপনার কাছে একটি নাল টার্মিনেটেড স্ট্রিং দরকার নেই যেহেতু আপনার কাছে স্ট্রিংয়ের আকারটি পুনরাবৃত্তি না করেই পেতে পারে / করতে পারে নাল টার্মিনেটর

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