ฉันจะลบอักขระตัวสุดท้ายออกจากสตริง C ++ ได้อย่างไร
ฉันลองแล้วst = substr(st.length()-1);
แต่มันไม่ทำงาน
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
ฉันจะลบอักขระตัวสุดท้ายออกจากสตริง C ++ ได้อย่างไร
ฉันลองแล้วst = substr(st.length()-1);
แต่มันไม่ทำงาน
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
ไม่มีอยู่ใน C ++ 03) และยังเป็นการดัดแปลงแบบแทนที่ (และ OP ไม่เคยชี้แจงว่าเขาต้องการแบบนั้นหรือไม่) ... เป็น เช่นเขามีคำตอบที่ถูกต้อง แต่ไม่ได้เป็นคนไปได้เท่านั้น
วิธีแก้ปัญหาง่ายๆถ้าคุณใช้ C ++ 11 อาจเป็นเวลา O (1) เช่นกัน:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
std :: ลบทางเลือกเป็นสิ่งที่ดี แต่ฉันชอบ "- 1" (ไม่ว่าจะขึ้นอยู่กับขนาดหรือตัวทำซ้ำสุดท้าย) - สำหรับฉันมันช่วยแสดงเจตนา
BTW - ไม่มี std :: string :: pop_back จริง ๆ หรือไม่ - ดูเหมือนแปลก
std::string::pop_back
ใน C ++ 03; มันถูกเพิ่มเข้าไปใน C ++ 0x
resize
เป็นฟังก์ชั่นปรับขนาดและไม่มีฟังก์ชั่นหน่วยความจำอะไรอีกที่อาจเพิ่มหน่วยความจำที่จำเป็น ตัวอย่างเช่นถ้าคุณresize
มีขนาดเล็กลงมันจะไม่ลดหน่วยความจำที่สงวนไว้ ฉันคิดว่าคุณกำลังความคิดของreserve
ซึ่งอย่างน้อยอาจลดการจัดสรรหน่วยความจำถ้าถามไป - ดูปรับขนาดที่นี่และสำรองที่นี่
buf.erase(buf.size() - 1);
สิ่งนี้จะถือว่าคุณรู้ว่าสตริงนั้นไม่ว่างเปล่า ถ้าเป็นเช่นนั้นคุณจะได้รับout_of_range
ข้อยกเว้น
size()
แทนend()
ของคำตอบอื่นได้หรือไม่
str.erase( str.end()-1 )
การอ้างอิง: std :: string :: erase () prototype 2
ไม่จำเป็นต้องใช้ c ++ 11 หรือ c ++ 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]
จึงผิดกฎหมาย
นั่นคือทั้งหมดที่คุณต้องการ:
#include <string> //string::pop_back & string::empty
if (!st.empty())
st.pop_back();
int main () {
string str1="123";
string str2 = str1.substr (0,str1.length()-1);
cout<<str2; // output: 12
return 0;
}
ด้วย C ++ 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
ไม่สามารถแปลงเป็น Normal_iterator
C ++ 11 คือเพื่อนของคุณในกรณีนี้
str.erase(str.end() - 1)
?
หากความยาวไม่ใช่ศูนย์คุณสามารถทำได้เช่นกัน
str[str.length() - 1] = '\0';
\0
ไม่เปลี่ยนความยาวของสตริง str.length()
จะไม่ถูกต้อง