C ++ स्ट्रिंग से अंतिम वर्ण निकालें


210

मैं अंतिम चरित्र को C ++ स्ट्रिंग से कैसे निकाल सकता हूं?

मैंने कोशिश की, st = substr(st.length()-1);लेकिन यह काम नहीं किया।


6
क्या आप पिछले चरित्र के साथ हटाए गए एक ही स्ट्रिंग या पिछले चरित्र के बिना एक ही स्ट्रिंग चाहते हैं?
मैथ्यू एम।

एक MFC विज़ुअल C ++ CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
CString के लिए

जवाबों:


193

नॉन-म्यूटिंग संस्करण के लिए:

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

20
@MatthieuM। आपका उदाहरण भ्रमित कर रहा है, मुझे लगता है कि प्रश्न का सार मूल स्ट्रिंग को संशोधित करना है, आपके उदाहरण में आप मूल स्ट्रिंग को संशोधित नहीं कर रहे हैं, क्योंकि आपके उदाहरण में मूल स्ट्रिंग को "myString" कहा जाता है जो भ्रम की स्थिति देता है, प्रश्न में यह "सेंट" है। आपका कोड होना चाहिए: st = st.substr(0, st.size()-1)। लेकिन यह अभी भी सही तरीके से नहीं लगती है, मुझे लगता है कि उचित तरीके से, यह कहा जाता है मिटा () कि इस कार्य के लिए करना है फ़ंक्शन का उपयोग करने के लिए है और कोड है: st.erase(st.size()-1)। इसे "म्यूटिंग संस्करण" कहा जाएगा।
Czarek Tomczak

1
@CzarekTomczak: मुझे समझ में नहीं आया कि वास्तव में क्या पूछा गया था, इस प्रकार वास्तविक उल्लास से पहले अस्वीकरण।
मैथ्यू एम।

2
@MattPhillips: उसका समाधान C ++ 11 विशिष्ट है (हालांकि pop_backC ++ 03 में मौजूद नहीं था) और यह एक इन-प्लेस संशोधन भी है (और ओपी ने कभी स्पष्ट नहीं किया कि वह अंदर जगह चाहता था या नहीं) ... as इस तरह, उसके पास एक सही उत्तर है, लेकिन केवल एक ही संभव नहीं है।
मैथ्यू एम।

404

यदि आप C ++ 11 का उपयोग कर रहे हैं तो सरल समाधान। शायद O (1) समय भी:

st.pop_back();

49
यह c ++ 11 के लिए है!
आमिर

1
FYI के रूप में - इसका समर्थन केवल GCC 4.7 से किया जा रहा है (w / -std = c ++ 11 संकलन स्विच के साथ ऑफ कोर्स)
Shmil The Cat

20
जांच करना न भूलें length()

हाँ, यह पृष्ठ के बहुत नीचे दिखाई देता है ..!
जेम्स बेडफोर्ड

1
The behavior is undefined if the string is empty. से यहाँ
Raffi

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

एक std :: मिटा विकल्प अच्छा है, लेकिन मुझे "- 1" पसंद है (चाहे आकार या एंड-इटरेटर पर आधारित हो) - मेरे लिए, यह इरादे को व्यक्त करने में मदद करता है।

BTW - क्या वास्तव में कोई std :: string :: pop_back नहीं है? - अजीब लगता है।


11
std::string::pop_backC ++ 03 में कोई भी नहीं है; यह C ++ 0x में जोड़ा गया है, हालांकि।
जेम्स मैकनेलिस

ठीक है धन्यवाद। यह थोड़ा भ्रम का कारण बना - मैं कसम खा सकता हूं कि मैंने इसका उपयोग किया है, फिर भी यह नहीं है। हो सकता है कि मेरे पास कुछ संकलक में एक गैर-मानक पुस्तकालय है कहीं (वीसी ++ 2003 के बीच, वीसी ++ 2008, मिनगव जीसीसी 3 मिनगॉव जीसीसी 4 और लिनक्स जीसीसी 4, आपको कुछ अंतर मिलते हैं)। अधिक संभावना है, मैं सिर्फ अन्य प्रकारों के साथ भ्रमित हो रहा हूं।
स्टीव314

आकार () शायद इस तरह के उपयोग के लिए अभिप्रेत नहीं है, यह स्मृति से संबंधित कार्य है, मिटा () पात्रों को हटाने के लिए है।
Czarek Tomczak

3
@Czarek Tomczak - बेतुके देर से जवाब के लिए खेद है, लेकिन resizeएक आकार देने वाला फ़ंक्शन है, और कोई मेमोरी फ़ंक्शन नहीं है जो कि आवश्यक मेमोरी को बढ़ा सकता है। उदाहरण के लिए, यदि आप resizeछोटे आकार के हैं, तो यह आरक्षित मेमोरी को कम नहीं करेगा । मैं आपको लगता है की सोच रहे हैं reserve, जो कम से कम हो सकता है आबंटित स्मृति को कम करता है, तो करने के लिए कहा - देख यहां का आकार बदलने और रिजर्व यहाँ
स्टीव ३१

3
if (! str.empty ()) को आकार में पसंद किया जाता है
ericcurtin

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

यह मानता है कि स्ट्रिंग खाली नहीं है। यदि हां, तो आपको एक out_of_rangeअपवाद मिलेगा ।


8
buf [buf.size () - 1] = '\ 0'; कुछ भी नहीं हटाता है - यह सिर्फ उस चरित्र को बदलता है जिसमें मूल्य शून्य था। std:; स्ट्रिंग्स में खुशी से ऐसे अक्षर हो सकते हैं।

नील सही है। मुझे शायद अपने जवाब में यह स्पष्ट करना चाहिए था। दूसरा विकल्प प्रभावी रूप से अंतिम वर्ण के मूल्य को बदल देगा इसलिए यह प्रिंट नहीं करेगा, लेकिन स्ट्रिंग की लंबाई समान रहेगी। इरेज़ का उपयोग करना वास्तव में अंतिम चरित्र को "हटा" देता है और स्ट्रिंग के आकार को बदल देगा।
आरसी।

@ आरसी यह प्रिंट करेगा, यह मानते हुए कि आप किसी चीज़ का उपयोग करते हैं << बफ़। यह कैसे प्रकट होता है यह आपके प्लेटफॉर्म पर निर्भर करेगा। और आप हमेशा अपने उत्तर को संपादित करके स्पष्ट कर सकते हैं।

दूसरे उत्तर के size() बजाय इसके बारे में क्या बेहतर है end()?
रिबामार

17

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

संदर्भ: std :: string :: erase () प्रोटोटाइप २

कोई c ++ 11 या c ++ 0x की आवश्यकता है।


1
यह अजीब स्थिति पैदा कर सकता है: स्ट्रिंग का आकार कम हो गया था लेकिन अंतिम चरित्र '\ 0' पर सेट नहीं है।
देक्विंग

1
@Deqing आप इस तरह के मामले में क्या होता है के अधिक विवरण दे सकते हैं?
रिबमार

उदाहरण के लिए यदि आपके पास है string s("abc");, तो मिटाने के बाद यह काम करने लगता है: cout<<s; // prints "ab"हालांकि, अंतिम चरित्र अभी भी है cout<<s[2]; // still prints 'c':।
दीकिंग

1
आसानी से तय: सिर्फstr[str.length()-1] = 0; str.erase(str.end()-1);
21

5
@Dequing: आपका उदाहरण अमान्य है। मिटा स्ट्रिंग के आकार को कम करता है, इसलिए पहुंच s[2]अवैध है।
ईएमएल

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

C ++ 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एक normal_iterator में परिवर्तित नहीं किया जा सकता है।

C ++ 11 इस मामले में आपका मित्र है।


इस पद्धति में भी समस्या है, अंतिम वर्ण '\ 0' पर सेट नहीं है।
डेक्किंग

1
न करने का कोई विशेष कारण str.erase(str.end() - 1)?
vallentin

-4

यदि लंबाई गैर शून्य है, तो आप भी कर सकते हैं

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

4
अंतिम वर्ण सेट करने \0से स्ट्रिंग की लंबाई नहीं बदलती है। str.length()गलत होगा।
jww

हां, मैं इसे अभी देखूंगा। हम C ++ पर विचार कर रहे हैं। आप सही हैं, यह स्ट्रिंग की लंबाई नहीं बदलता है
Jan Glaser
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.