C++의 문자열에서 구두점 제거

Jinku Hu 2023년10월12일
  1. std::erasestd::remove_if함수를 사용하여 C++의 문자열에서 구두점 제거
  2. 사용자 지정 함수를 사용하여 C++의 문자열에서 구두점 제거
  3. 반복 방법을 사용하여 C++의 문자열에서 구두점 제거
C++의 문자열에서 구두점 제거

이 기사에서는 C++의 문자열에서 구두점을 제거하는 방법에 대한 몇 가지 방법을 설명합니다.

std::erasestd::remove_if함수를 사용하여 C++의 문자열에서 구두점 제거

std::remove_if는 STL 알고리즘 라이브러리의 일부이며 주어진 조건이 참으로 평가되는 모든 요소를 ​​제거 할 수 있습니다. 조건은 범위의 각 요소에 대해 bool값을 반환해야합니다. 이 경우 ispunct함수를 전달하여 구두점 기호를 확인합니다. std::remove_if는 새로운 범위의 값에 대한 끝 반복기를 반환하므로 구문 분석된 문자열을 생성하는 erase 방법으로 호출을 연결한다. 이 솔루션은erase-remove 관용구와 유사하게 작동합니다.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  text.erase(std::remove_if(text.begin(), text.end(), ispunct), text.end());
  cout << text << endl;

  return EXIT_SUCCESS;
}

출력:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

사용자 지정 함수를 사용하여 C++의 문자열에서 구두점 제거

또는 이전 메서드를 별도의 함수로 이동하여 지정된 문자열의 로컬 복사본을 만들고 파싱 된 값을 호출자 코드로 반환하는 동안 작동 할 수 있습니다. 이 함수는 다른 문자 그룹을 지원하도록 기능을 확장하거나remove_if알고리즘의 세 번째 매개 변수에 대한 사용자 정의 술어 함수를 전달하는 데 사용될 수 있습니다.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

string removeSpaces(const string& s) {
  string tmp(s);
  tmp.erase(std::remove_if(tmp.begin(), tmp.end(), ispunct), tmp.end());
  return tmp;
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  string parsed_text = removeSpaces(text);
  cout << parsed_text << endl;

  return EXIT_SUCCESS;
}

출력:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor

반복 방법을 사용하여 C++의 문자열에서 구두점 제거

또 다른 대안은 문자열의 모든 문자를 반복하는 별도의 함수를 구현하는 것입니다. 이 함수는 참조로 문자열을 가져오고for루프를 사용하여 문자열을 순회합니다. 각 반복에서ispunct가 호출되어 문자가 구두점 기호인지 여부를 확인합니다. 원래 문자열 개체가erase함수에 의해 수정되고 루프가 개수를 갱신해야하기 때문에len변수에는 각 일치 조건에서 문자열의 크기가 할당됩니다.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

void removeSpaces2(string& s) {
  for (int i = 0, len = s.size(); i < len; i++) {
    if (ispunct(s[i])) {
      s.erase(i--, 1);
      len = s.size();
    }
  }
}

int main() {
  string text =
      "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut "
      "porttitor.";

  cout << text << endl;

  removeSpaces2(text);
  cout << text << endl;

  return EXIT_SUCCESS;
}

출력:

Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ String