C ++ 문자열에서 마지막 문자 제거


210

C ++ 문자열에서 마지막 문자를 제거하려면 어떻게해야합니까?

시도했지만 st = substr(st.length()-1);작동하지 않았습니다.


6
마지막 문자가 제거 된 새 문자열이나 마지막 문자가없는 같은 문자열을 원하십니까?
Matthieu M.

MFC Visual C ++ CString의 경우 : CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
sergiol

답변:


193

변경되지 않는 버전의 경우 :

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

20
@MatthieuM. 귀하의 예가 혼란 스럽습니다. 질문의 본질은 원래 문자열을 수정하는 것이라고 생각합니다.이 예제에서는 원래 문자열을 수정하지 않고 예를 들어 원래 문자열은 "myString"이라고하기 때문에 혼란, 문제에서 그것은 "st"입니다. 코드는 다음과 같아야합니다 st = st.substr(0, st.size()-1). 그러나 여전히 올바른 방식으로 보이지는 않습니다. 올바른 방법은이 작업을위한 함수를 사용하는 것입니다. 그것은 지우기 ()라고하며 코드는 다음과 같습니다 st.erase(st.size()-1). 이를 "돌연변이 버전"이라고합니다.
Czarek Tomczak

1
@CzarekTomczak : 나는 이것이 정확히 요구 된 것이 아니므로 실제 요지 전에 면책 조항을 이해합니다.
Matthieu M.

2
@MattPhillips : 그의 솔루션은 C ++ 11에 따라 다르지만 ( pop_backC ++ 03에는 존재하지 않았 음) 또한 내부 수정이기도합니다 (그리고 OP는 그가 원 하던지 여부를 명확하게 밝히지 않았습니다 ...) 그런 그는이 하지만 유일하게 가능한 하나의 정답을.
Matthieu M.

404

C ++ 11을 사용하는 경우 간단한 솔루션. 아마 O (1) 시간 :

st.pop_back();

49
이것은 C ++ 11입니다!
Amir

1
참고로-GCC 4.7에서만 지원됩니다 (-std = c ++ 11 컴파일 스위치와 함께
제공됨

20
확인하는 것을 잊지 마십시오 length().

예, 페이지 아래쪽에 너무 많이 나타납니다 ..!
James Bedford

1
The behavior is undefined if the string is empty. 에서 여기
라피

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

std :: erase 대안은 좋지만 "-1"(크기 또는 종료 반복자를 기반으로 함)을 좋아합니다. 의도를 표현하는 데 도움이됩니다.

BTW-실제로 std :: string :: pop_back이 없습니까? -이상해 보인다.


11
std::string::pop_backC ++ 03 에는 없습니다 . 그러나 C ++ 0x에 추가되었습니다.
James McNellis

알았어 고마워. 그것은 약간의 혼란을 초래했습니다-나는 그것을 사용했다고 맹세 할 수는 있지만 거기에 없습니다. 어쩌면 일부 컴파일러에 비표준 라이브러리가있을 수 있습니다 (VC ++ 2003, VC ++ 2008, MinGW GCC3 MinGW GCC 4 및 Linux GCC 4 사이에는 약간의 차이가 있습니다). 아마도 다른 유형과 혼동되고 있습니다.
Steve314

resize ()는 아마도 그러한 용도로 사용되지 않을 것입니다. 메모리 관련 함수이며, erase ()는 문자를 삭제하기위한 것입니다.
Czarek Tomczak

3
@Czarek Tomczak-터무니없이 늦은 답변에 대해 죄송하지만 resize크기 조정 기능이며 메모리를 늘리는 다른 기능은 더 이상 필요하지 않습니다. 예를 들어, resize더 작은 크기로 예약하면 예약 된 메모리가 줄어들지 않습니다 . 나는 당신의있는 거 생각 생각 reserve적어도, 에 요구한다면, 할당 된 메모리를 줄일를 -보고 여기에 크기를 조정 하고 여기에 예약 .
Steve314

3
if (! str.empty ())가 크기보다 선호되는 경우
ericcurtin

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

이것은 문자열이 비어 있지 않다는 것을 알고 있다고 가정합니다. 그렇다면 out_of_range예외 가 발생합니다.


8
buf [buf.size ()-1] = '\ 0'; 아무것도 제거하지 않습니다-값이 0이되도록 문자를 변경합니다. std :; strings는 그러한 문자를 행복하게 포함 할 수 있습니다.

닐이 맞습니다. 아마 내 대답에서 이것을 분명히해야했을 것입니다. 두 번째 옵션은 마지막 문자의 값을 효과적으로 변경하여 인쇄되지 않지만 문자열 길이는 동일하게 유지됩니다. 삭제를 사용하면 실제로 마지막 문자가 "제거"되고 문자열의 크기가 변경됩니다.
RC.

@RC cout << buf와 같은 것을 사용한다고 가정하면 인쇄됩니다. 표시 방법은 플랫폼에 따라 다릅니다. 그리고 당신은 항상 답변을 편집하여 명확하게 할 수 있습니다.

다른 대답 size() 대신에 무엇이 더 낫 end()습니까?
ribamar

17

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

참조 : std :: string :: erase () 프로토 타입 2

c ++ 11 또는 c ++ 0x가 필요하지 않습니다.


1
이로 인해 이상한 상황이 발생할 수 있습니다. 문자열의 크기는 줄어들었지만 마지막 문자는 '\ 0'으로 설정되지 않았습니다.
Deqing

1
@Deqing 당신은 그러한 경우에 무슨 일이 일어나는지 더 자세히 설명해 줄 수 있습니까?
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);

5
@Dequing : 예제가 유효하지 않습니다. 지우기는 문자열의 크기를 줄이므로 액세스 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

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'으로 설정되어 있지 않습니다.
Deqing

1
하지 않는 특별한 이유는 str.erase(str.end() - 1)무엇입니까?
vallentin

-4

길이가 0이 아닌 경우에도

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

4
마지막 문자를 \0설정해도 문자열 길이는 변경되지 않습니다. str.length()정확하지 않습니다.
jww

예, 지금 봅니다. 우리는 C ++을 고려하고 있습니다. 당신은 맞습니다, 그것은 줄의 길이를 바꾸지 않습니다
Jan Glaser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.