আমি কীভাবে একটি সি ++ স্ট্রিং থেকে শেষ চরিত্রটি সরিয়ে ফেলতে পারি?
আমি চেষ্টা করেছি st = substr(st.length()-1);
কিন্তু কাজ হয়নি didn't
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
আমি কীভাবে একটি সি ++ স্ট্রিং থেকে শেষ চরিত্রটি সরিয়ে ফেলতে পারি?
আমি চেষ্টা করেছি st = substr(st.length()-1);
কিন্তু কাজ হয়নি didn't
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
উত্তর:
অ-পরিবর্তনীয় সংস্করণের জন্য:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
। কিন্তু এটি এখনও সঠিক ভাবে হচ্ছে না, আমি মনে করি যে সঠিক পথ, এটা বলা মুছে ফেলুন () যে এই কাজের জন্য দেয়ার উদ্দেশ্যে করা ফাংশন ব্যবহার করতে হয় এবং কোড হল: st.erase(st.size()-1)
। এটিকে একটি "পরিবর্তনীয় সংস্করণ" বলা হবে।
pop_back
সি ++ 03 তে বিদ্যমান ছিল না) এবং এটি একটি স্থান-স্থান পরিবর্তনও (এবং ওপি সে জায়গাটিতে চেয়েছিল কি না তা স্পষ্ট করে দেয় না) ... হিসাবে যেমন, তার একটি সঠিক উত্তর আছে, তবে কেবলমাত্র এটিই সম্ভব নয়।
আপনি যদি সি ++ 11 ব্যবহার করেন তবে সাধারণ সমাধান। সম্ভবত ও (1) সময়ও:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
একটি স্ট্যান্ড :: মুছে ফেলা বিকল্প ভাল, তবে আমি "- 1" পছন্দ করি (কোনও আকার বা শেষ-পুনরুক্তির উপর ভিত্তি করে) - এটি আমার উদ্দেশ্যটি প্রকাশ করতে সহায়তা করে।
বিটিডাব্লু - আসলেই কোনও স্টাড :: স্ট্রিং :: পপব্যাক নেই? - অদ্ভুত লাগছে।
std::string::pop_back
সি ++ 03 মধ্যে; যদিও এটি সি ++ 0x এ যুক্ত করা হয়েছে।
resize
এটি একটি আকার পরিবর্তনকারী ফাংশন, এবং মেমরির আর কোনও কার্যকারিতা নেই যা মেমোরির প্রয়োজনীয়তা বাড়িয়ে তুলতে পারে এমন অন্য কিছু। উদাহরণস্বরূপ, আপনি যদি আরও resize
ছোট আকারে যান তবে এটি সংরক্ষিত মেমরিটিকে হ্রাস করবে না । আমি মনে করি আপনি ভাবছেন reserve
, যা কমপক্ষে বরাদ্দকৃত স্মৃতি হ্রাস করতে পারে যদি জিজ্ঞাসা করা হয় - পুনরায় আকার দেখুন এবং এখানে সংরক্ষণ করুন ।
buf.erase(buf.size() - 1);
এটি ধরে নেয় আপনি জানেন যে স্ট্রিংটি খালি নেই। যদি তা হয় তবে আপনি একটি out_of_range
ব্যতিক্রম পাবেন।
size()
পরিবর্তে এর end()
থেকে আরও ভাল কী ?
str.erase( str.end()-1 )
তথ্যসূত্র: স্ট্যান্ড :: স্ট্রিং :: মুছুন () প্রোটোটাইপ 2
কোন সি ++ 11 বা সি ++ 0x দরকার নেই।
string s("abc");
, এটা কাজ মনে মুছে ফেলুন পরে: cout<<s; // prints "ab"
যাইহোক, শেষ অক্ষর এখনও আছে: cout<<s[2]; // still prints 'c'
।
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
অবৈধ।
সি ++ 11 এর সাথে আপনার দৈর্ঘ্য / আকারও লাগবে না। স্ট্রিংটি খালি না হওয়া পর্যন্ত আপনি নিম্নলিখিতগুলি করতে পারেন:
if (!st.empty())
st.erase(std::prev(st.end())); // Erase element referred to by iterator one
// before the end
str.erase(str.begin() + str.size() - 1)
str.erase(str.rbegin())
দুর্ভাগ্যক্রমে সংকলিত হয় না, যেহেতু reverse_iterator
সাধারণ_আরেটারে রূপান্তর করা যায় না।
সি ++ 11 এই ক্ষেত্রে আপনার বন্ধু।
str.erase(str.end() - 1)
?
দৈর্ঘ্য যদি শূন্য নয়, আপনি এটিও করতে পারেন
str[str.length() - 1] = '\0';
\0
স্ট্রিংয়ের দৈর্ঘ্য পরিবর্তন করে না। str.length()
ভুল হবে।