সি ++ স্ট্রিং থেকে শেষ অক্ষরটি সরান


210

আমি কীভাবে একটি সি ++ স্ট্রিং থেকে শেষ চরিত্রটি সরিয়ে ফেলতে পারি?

আমি চেষ্টা করেছি st = substr(st.length()-1);কিন্তু কাজ হয়নি didn't


6
আপনি কি সর্বশেষ অক্ষরটি বাদ দিয়ে একটি নতুন স্ট্রিং চান বা শেষ অক্ষর ছাড়াই একই স্ট্রিং চান?
ম্যাথিউ এম।

এমএফসি ভিজ্যুয়াল সি ++ সিএসট্রিংয়ের জন্য: CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
সার্জিওল

উত্তর:


193

অ-পরিবর্তনীয় সংস্করণের জন্য:

st = myString.substr(0, myString.size()-1);

20
@MatthieuM। আপনার উদাহরণটি বিভ্রান্তিকর, আমি মনে করি যে প্রশ্নের মূল উপাদানটি মূল স্ট্রিংটি সংশোধন করা, উদাহরণস্বরূপ আপনি মূল স্ট্রিংটি সংশোধন করছেন না কারণ আপনার উদাহরণে মূল স্ট্রিংটিকে "মাইস্ট্রিং" বলা হয় যা বিভ্রান্তি দেয়, প্রশ্নে এটি "স্ট্যান্ড"। আপনার কোড হওয়া উচিত: st = st.substr(0, st.size()-1)। কিন্তু এটি এখনও সঠিক ভাবে হচ্ছে না, আমি মনে করি যে সঠিক পথ, এটা বলা মুছে ফেলুন () যে এই কাজের জন্য দেয়ার উদ্দেশ্যে করা ফাংশন ব্যবহার করতে হয় এবং কোড হল: st.erase(st.size()-1)। এটিকে একটি "পরিবর্তনীয় সংস্করণ" বলা হবে।
জারেক টমস্কাক

1
@ কেজারেকটমকজাক: আমি বুঝতে পারি যে এটি ঠিক যা চাওয়া হয়েছিল তা নয়, এভাবে প্রকৃত ইস্টের আগে দাবি অস্বীকার করা।
ম্যাথিউ মিঃ

2
@ ম্যাটফিলিপস: তার সমাধানটি সি ++ ১১ সুনির্দিষ্ট যদিও ( pop_backসি ++ 03 তে বিদ্যমান ছিল না) এবং এটি একটি স্থান-স্থান পরিবর্তনও (এবং ওপি সে জায়গাটিতে চেয়েছিল কি না তা স্পষ্ট করে দেয় না) ... হিসাবে যেমন, তার একটি সঠিক উত্তর আছে, তবে কেবলমাত্র এটিই সম্ভব নয়।
ম্যাথিউ এম।

404

আপনি যদি সি ++ 11 ব্যবহার করেন তবে সাধারণ সমাধান। সম্ভবত ও (1) সময়ও:

st.pop_back();

49
এটি সি ++ 11 এর জন্য!
আমির

1
এফওয়াইআই হিসাবে - এটি কেবল জিসিসি ৪.7 থেকে সমর্থনযোগ্য (ডাব্লু / দ্য-স্টাড = সি ++ ১১ সংকলন স্যুইচ বরাবর)
শামিল দ্য ক্যাট

20
চেক করতে ভুলবেন না length()

হ্যাঁ, এটি পৃষ্ঠার নিচে খুব উপস্থিত রয়েছে ..!
জেমস বেডফোর্ড

1
The behavior is undefined if the string is empty. থেকে এখানে
Raffi

24
if (str.size () > 0)  str.resize (str.size () - 1);

একটি স্ট্যান্ড :: মুছে ফেলা বিকল্প ভাল, তবে আমি "- 1" পছন্দ করি (কোনও আকার বা শেষ-পুনরুক্তির উপর ভিত্তি করে) - এটি আমার উদ্দেশ্যটি প্রকাশ করতে সহায়তা করে।

বিটিডাব্লু - আসলেই কোনও স্টাড :: স্ট্রিং :: পপব্যাক নেই? - অদ্ভুত লাগছে।


11
সেখানে নেই std::string::pop_backসি ++ 03 মধ্যে; যদিও এটি সি ++ 0x এ যুক্ত করা হয়েছে।
জেমস ম্যাকনেলিস

ঠিক আছে ধন্যবাদ. এটি কিছুটা বিভ্রান্তির কারণ হয়েছিল - আমি শপথ করতে পারি যে আমি এটি ব্যবহার করেছি, তবুও এটি নেই it's হয়তো আমার কোথাও কোনও সংকলকটিতে একটি মানহীন গ্রন্থাগার রয়েছে (ভিসি ++ 2003, ভিসি ++ ২০০৮, মিনজিডাব্লু জিসিসি 3 মিনজিডাব্লু জিসিসি 4 এবং লিনাক্স জিসিসি 4 এর মধ্যে আপনি কিছু পার্থক্য পাবেন)। আরও সম্ভবত, আমি কেবল অন্য ধরণের সাথে বিভ্রান্ত হয়ে যাচ্ছি।
স্টিভ 314

আকার পরিবর্তন () সম্ভবত এই জাতীয় ব্যবহারের জন্য নয়, এটি একটি মেমরি সম্পর্কিত ফাংশন, মুছে ফেলুন () অক্ষর মুছার জন্য।
জারেক টমকজাক

3
@ কেজারেক টমকজাক - অযৌক্তিকভাবে দেরি করা জবাবের জন্য দুঃখিত, তবে resizeএটি একটি আকার পরিবর্তনকারী ফাংশন, এবং মেমরির আর কোনও কার্যকারিতা নেই যা মেমোরির প্রয়োজনীয়তা বাড়িয়ে তুলতে পারে এমন অন্য কিছু। উদাহরণস্বরূপ, আপনি যদি আরও resizeছোট আকারে যান তবে এটি সংরক্ষিত মেমরিটিকে হ্রাস করবে না । আমি মনে করি আপনি ভাবছেন reserve, যা কমপক্ষে বরাদ্দকৃত স্মৃতি হ্রাস করতে পারে যদি জিজ্ঞাসা করা হয় - পুনরায় আকার দেখুন এবং এখানে সংরক্ষণ করুন
স্টিভ 314

3
যদি (! str.empty ()) আকারের চেয়ে বেশি পছন্দ হয়
এরিক্কার্টিন

19
buf.erase(buf.size() - 1);

এটি ধরে নেয় আপনি জানেন যে স্ট্রিংটি খালি নেই। যদি তা হয় তবে আপনি একটি out_of_rangeব্যতিক্রম পাবেন।


8
বুফ [buf.size () - 1] = '\ 0'; কোনও কিছুই সরিয়ে দেয় না - এটি কেবলমাত্র শূন্যের মানটির জন্য যে চরিত্রটি ছিল তা পরিবর্তন করে। স্ট্যান্ড:; স্ট্রিংগুলিতে আনন্দের সাথে এমন অক্ষর থাকতে পারে।

নীল ঠিক আছে। আমার উত্তরটিতে আমার সম্ভবত এটি স্পষ্ট করা উচিত ছিল। দ্বিতীয় বিকল্পটি কার্যকরভাবে শেষ অক্ষরের মান পরিবর্তন করবে যাতে এটি মুদ্রণ করবে না, তবে স্ট্রিংয়ের দৈর্ঘ্য একই থাকবে। মুছা ব্যবহার করা আসলে শেষ চরিত্রটিকে "মুছে ফেলে" এবং স্ট্রিংয়ের আকার পরিবর্তন করবে।
আরসি।

@ আরসি এটি মুদ্রণ করবে, ধরেই নেওয়া হচ্ছে আপনি কাউট << বুফের মতো কিছু ব্যবহার করছেন। এটি কীভাবে প্রদর্শিত হবে তা আপনার প্ল্যাটফর্মের উপর নির্ভর করবে। এবং আপনি সর্বদা আপনার উত্তর সম্পাদনা করে স্পষ্ট করতে পারেন।

অন্য উত্তরের size() পরিবর্তে এর end()থেকে আরও ভাল কী ?
ribamar

17

str.erase( str.end()-1 )

তথ্যসূত্র: স্ট্যান্ড :: স্ট্রিং :: মুছুন () প্রোটোটাইপ 2

কোন সি ++ 11 বা সি ++ 0x দরকার নেই।


1
এটি অদ্ভুত পরিস্থিতির দিকে নিয়ে যেতে পারে: স্ট্রিংয়ের আকার হ্রাস করা হয়েছিল তবে শেষ চরিত্রটি '\ 0' তে সেট করা হয়নি।
Deqing

1
@ ডিকিং আপনি এই জাতীয় ক্ষেত্রে কী ঘটে তার আরও বিশদ দিতে পারেন?
ribamar

উদাহরণস্বরূপ, যদি আপনি করেছেন string s("abc");, এটা কাজ মনে মুছে ফেলুন পরে: cout<<s; // prints "ab"যাইহোক, শেষ অক্ষর এখনও আছে: cout<<s[2]; // still prints 'c'
Deqing

1
সহজেই ঠিক করা হয়েছে: str[str.length()-1] = 0; str.erase(str.end()-1);
21:25:25 এ

5
@ অনুসন্ধান: আপনার উদাহরণটি অবৈধ। মোছা স্ট্রিংয়ের আকার হ্রাস করে, তাই এতে অ্যাক্সেস s[2]অবৈধ।
EML

11

আপনার যা প্রয়োজন তা হ'ল:

#include <string>  //string::pop_back & string::empty

if (!st.empty())
    st.pop_back();

9
int main () {

  string str1="123";
  string str2 = str1.substr (0,str1.length()-1);

  cout<<str2; // output: 12

  return 0;
}

2

সি ++ 11 এর সাথে আপনার দৈর্ঘ্য / আকারও লাগবে না। স্ট্রিংটি খালি না হওয়া পর্যন্ত আপনি নিম্নলিখিতগুলি করতে পারেন:

if (!st.empty())
  st.erase(std::prev(st.end())); // Erase element referred to by iterator one
                                 // before the end

2

str.erase(str.begin() + str.size() - 1)

str.erase(str.rbegin()) দুর্ভাগ্যক্রমে সংকলিত হয় না, যেহেতু reverse_iterator সাধারণ_আরেটারে রূপান্তর করা যায় না।

সি ++ 11 এই ক্ষেত্রে আপনার বন্ধু।


এই পদ্ধতিতেও সমস্যা রয়েছে, শেষ অক্ষরটি '\ 0' তে সেট করা হয়নি।
Deqing

1
না করার কোন বিশেষ কারণ str.erase(str.end() - 1)?
ভালেন্টিন

-4

দৈর্ঘ্য যদি শূন্য নয়, আপনি এটিও করতে পারেন

str[str.length() - 1] = '\0';

4
শেষ অক্ষরটি সেট করা \0স্ট্রিংয়ের দৈর্ঘ্য পরিবর্তন করে না। str.length()ভুল হবে।
jww

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