এসটিডি :: স্ট্রিংয়ে নাল টার্মিনেটর রয়েছে?


90

নীচের স্ট্রিংটিতে নাল টার্মিনেটর '\ 0' থাকবে?

std::string temp = "hello whats up";

ধন্যবাদ! :)



4
এটি এখন দাঁড়িয়ে আছে, @ জাজাহাজের গৃহীত উত্তরটি ব্যবহারকারীর উত্তরের সাথে দ্বন্দ্ব বোধ করে 29২৯75৫৮৮, যার উত্তরটি তর্কসাপেক্ষে আরও আপ টু ডেট। অনুমান করার সময়, আমি জেসি গুডের মন্তব্য এড়িয়ে গেছি, সুতরাং এর গুরুত্বকে জোর দেওয়ার জন্য এটি এখানে is
জোনাথন কোমার

উত্তর:


100

না, তবে আপনি যদি বলেন temp.c_str()কোনও নাল টার্মিনেটর এই পদ্ধতি থেকে ফিরে আসবে।

এটি বলার অপেক্ষা রাখে না যে আপনি অন্য কোনও চরিত্রের মতোই কোনও নাল অক্ষরকে স্ট্রিংয়ে অন্তর্ভুক্ত করতে পারেন।

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';

প্রিন্ট

5 5

এবং 5 1নাল অক্ষরের স্ট্রিংগুলির একটি বিশেষ অর্থ থাকলে আপনি আশা করতে পারেন না ।


4
আপনি কল temp.c_str()করলে নাল চরিত্রটি অন্তর্ভুক্ত করা হবে। আপনার যদি সত্যিই স্ট্রিংয়ের প্রয়োজন হয় তবে এটি অন্য কোনও চরিত্রের মতোই যুক্ত করুন। temp.push_back('\0')। এখন দুটি নাল অক্ষর temp.c_str()অন্তর্ভুক্ত করা হবে ।
jahhaj

4
@ ডুপডুপডুপ, উত্তরগুলির মধ্যে কয়েকটি যেমন উল্লেখ করেছে যে আপনার যদি নাল-টার্মিনেটেড স্ট্রিংয়ের প্রয়োজন হয় তবে আপনাকে কনস্ট্রাক্ট্রড অবজেক্টে একটি s.c_str () কল করতে হবে। এটি অক্ষর অ্যারেতে একটি পয়েন্টার ফিরিয়ে দেবে যা শেষে '\ 0' থাকার গ্যারান্টিযুক্ত।
মাকসিম স্কুরিডজিন

@ রিকো, জাহাজ তারপর স্ট্রিংটি কীভাবে শেষ করবেন ate উদাহরণস্বরূপ - আমি স্ট্রিংয়ের সাথে আমার স্ট্রিংয়ে কয়েকটি অক্ষর যুক্ত করেছি [i]। এখন আমি কাউট ব্যবহার করে এটি মুদ্রণ করতে পারছি না।
ভাওয়ুক মাথুর

আপনার বক্তব্যটি যোগ করার জন্য: যেহেতু অপারেটর << ওভারলোড হয়েছে তাই কৌত << s, যদিও পুরো স্ট্রিং চরটি চর দ্বারা মুদ্রণ করবে, তবে, আপনি সি_স্ট্রি () নিলে এবং অপারেটরে রাখলে << এটি মুদ্রিত হবে নাল চর নিম্নলিখিত প্রোগ্রাম এই পয়েন্টটি দেখায়। {স্ট্রিং গুলি ("স্যাম্পল স্ট্রিং"); কোট << s.size () << "\ t" << s << এন্ডল; s [3] = '\ 0'; কোট << "\ n \ n নলের পরে \ n \ n" << এস.সাইজ () << "\ টি" << এস << এন্ডল; cout << "\ n \ n নেওয়া c_str \ n \ n" << s.size () << "\ t" << s.c_str () << এন্ডল; }
ফুও

71

সি ++ 03 এ নয়, এবং এটি সি ++ 11 এর আগে এমনকি গ্যারান্টিযুক্তও নয় যে একটি সি ++ স্টাড :: স্ট্রিং মেমরিতে অবিচ্ছিন্ন। কেবল সি স্ট্রিং (চর অ্যারে যা স্ট্রিংগুলি সংরক্ষণের উদ্দেশ্যে তৈরি করা হয়েছে) এর নਾਲ টার্মিনেটর ছিল।

সি ++ 11 এবং পরে, mystring.c_str()সমতূল্য mystring.data()সমতূল্য &mystring[0], এবং mystring[mystring.size()]হতে নিশ্চিত করা হয় '\0'


4
সি ++ 11 দিয়ে স্ট্রিংগুলি এখন মেমরির সাথে সংলগ্ন হওয়ার গ্যারান্টিযুক্ত।
জিনাক করুন

@ জিন্নাক ধন্যবাদ! আপডেট হয়েছে। তবে আমি সন্দেহ করি যে কমপক্ষে যুক্তিসঙ্গতভাবে সি ++ 11-সংকলক সংকলক রয়েছে ... এমনকি জিসিসিও এর পক্ষে সমর্থন ভঙ্গ করেছে।

4
@ H2CO3: সি ++ 11 একপাশে 2005ডিআর 530 এ সম্বোধন করা হয়েছিল । স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়নের সিংহভাগ কমপক্ষে দীর্ঘকাল ধরে স্ট্রিং ডেটা মজাদার স্মৃতিতে সঞ্চয় করেছে।
iljarn

4
আপনাকে ধন্যবাদ @ ইল্ডজার্ন, আমি ঠিক এটি খুঁজছিলাম এই পদক্ষেপের যুক্তির অংশটি হ'ল কমিটির কেউই এসটিএল বাস্তবায়ন সম্পর্কে জানত না যা ধারাবাহিক স্মৃতি ব্যবহার করে না।
জিনাক করুন

7
@ এইচ 2 সি 3: সত্যই, যদি তা আপনাকে ক্ষতিগ্রস্থ করে, আপনার আরও ঘন ত্বকের প্রয়োজন।
iljarn

9

এটি আপনার 'ধারণাগুলি' এর সংজ্ঞা এখানে নির্ভর করে। ভিতরে

std::string temp = "hello whats up";

এখানে কয়েকটি বিষয় লক্ষণীয়:

  • temp.size()প্রথম hথেকে শেষ পর্যন্ত অক্ষরের সংখ্যা প্রদান করবে p(উভয়ই অন্তর্ভুক্ত)
  • তবে একই সাথে temp.c_str()বা temp.data()কোনও nullটার্মিনেটর নিয়ে ফিরে আসবে
  • অথবা অন্য কথায় int(temp[temp.size()])হবে শূন্য

আমি জানি, আমি উত্তর এখানে কিছু অনুরূপ শব্দ কিন্তু আমি যে বাতলান করতে চান sizeএর std::stringমধ্যে C++হয় আলাদাভাবে পরিচালিত ও এর মত নয়Cযেখানে আপনি কাউন্টিং যদি না আপনি প্রথম এটি রাখা nullটারমিনেটর।

যোগ করতে, গল্পটি string literalএম্বেড থাকলে কিছুটা আলাদা হবে \0। এই ক্ষেত্রে, নিম্নলিখিত চরিত্রটি নির্মাণের কাজ std::stringথামিয়ে দেয় null:

std::string s1 = "ab\0\0cd";   // s1 contains "ab",       using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s;  // s3 contains "ab\0\0cd", using ""s operator

তথ্যসূত্র:


2

হ্যাঁ আপনি যদি কল করেন temp.c_str(), তবে এটি নাল-টার্মিনেটেড সি-স্ট্রিংটি ফিরে আসবে।

যাইহোক, অবজেক্টে সংরক্ষিত প্রকৃত ডেটা tempবাতিল-সমাপ্ত হতে পারে না তবে এটি কোনও ব্যাপার নয় এবং প্রোগ্রামারের কাছে তা বিবেচনা করা উচিত নয়, কারণ যখন প্রোগ্রামার const char*চাইবে তখন সে c_str()সেই বস্তুকে ডেকে ফেলবে , যা নাল ফেরানোর গ্যারান্টিযুক্ত নির্ধারিত স্ট্রিং।


4
অথবা নাল টার্মিনেটর (এটি উপস্থিত থাকলে) এর থেকে ফেরত আসবে না temp.size()
jahhaj

1

সি ++ স্ট্রিংগুলির সাহায্যে আপনার এটি নিয়ে চিন্তা করতে হবে না এবং এটি সম্ভবত বাস্তবায়নের উপর নির্ভরশীল।

temp.c_str()আপনি ব্যবহার করে স্ট্রিংয়ের সি উপস্থাপনা পাবেন যা অবশ্যই চরটি ধারণ করবে \0। এগুলি বাদে, আমি সত্যিই দেখতে পাই না যে এটি সি ++ স্ট্রিংয়ে কীভাবে কার্যকর হবে


1

std::stringঅভ্যন্তরীণভাবে অক্ষরের সংখ্যা গণনা রাখে। অভ্যন্তরীণভাবে এটি এই গণনাটি ব্যবহার করে কাজ করে। অন্যরা যেমন বলেছে, আপনার যখন প্রদর্শনের জন্য স্ট্রিং বা যে কোনও কারণের প্রয়োজন হয়, আপনি তার c_str()পদ্ধতিটি করতে পারেন যা আপনাকে শেষে নাল টার্মিনেটরের সাথে স্ট্রিং দেয়।


আপনি, এই বিবৃতি জন্য কিছু রেফারেন্স দিতে পারি "এসটিডি :: স্ট্রিং অভ্যন্তরীণভাবে অক্ষরের সংখ্যা একটি গণনা রাখে অভ্যন্তরীণভাবে এই গণনা ব্যবহার কাজ করে।"
rimalroshan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.