[c++] C ++의 문자열에서 특정 문자를 제거하는 방법은 무엇입니까?

예를 들어 사용자가 전화 번호를 입력했습니다.

cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;

문자열에서 “(“, “)”및 “-“문자를 제거하고 싶습니다. 문자열 제거, 찾기 및 바꾸기 기능을 살펴 보았지만 위치에 따라 작동한다는 것만 알 수 있습니다.

예를 들어 “(“문자를 전달하고 문자열 내의 모든 인스턴스를 제거하는 데 사용할 수있는 문자열 함수가 있습니까?



답변

   string str("(555) 555-5555");

   char chars[] = "()-";

   for (unsigned int i = 0; i < strlen(chars); ++i)
   {
      // you need include <algorithm> to use general algorithms like std::remove()
      str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());
   }

   // output: 555 5555555
   cout << str << endl;

기능으로 사용하려면 :

void removeCharsFromString( string &str, char* charsToRemove ) {
   for ( unsigned int i = 0; i < strlen(charsToRemove); ++i ) {
      str.erase( remove(str.begin(), str.end(), charsToRemove[i]), str.end() );
   }
}
//example of usage:
removeCharsFromString( str, "()-" );


답변

문자열에서 “(“, “)”및 “-“문자를 제거하고 싶습니다.

std::remove_if()알고리즘을 사용하여 지정한 문자 만 제거 할 수 있습니다 .

#include <iostream>
#include <algorithm>
#include <string>

bool IsParenthesesOrDash(char c)
{
    switch(c)
    {
    case '(':
    case ')':
    case '-':
        return true;
    default:
        return false;
    }
}

int main()
{
    std::string str("(555) 555-5555");
    str.erase(std::remove_if(str.begin(), str.end(), &IsParenthesesOrDash), str.end());
    std::cout << str << std::endl; // Expected output: 555 5555555
}

std::remove_if()알고리즘은 위의 조각 같은 함수 포인터가 될 수있는 조건이라는 것을 필요로한다.

함수 객체 (함수 호출 ()연산자 를 오버로드하는 객체)를 전달할 수도 있습니다 . 이를 통해 훨씬 더 일반적인 솔루션을 만들 수 있습니다.

#include <iostream>
#include <algorithm>
#include <string>

class IsChars
{
public:
    IsChars(const char* charsToRemove) : chars(charsToRemove) {};

    bool operator()(char c)
    {
        for(const char* testChar = chars; *testChar != 0; ++testChar)
        {
            if(*testChar == c) { return true; }
        }
        return false;
    }

private:
    const char* chars;
};

int main()
{
    std::string str("(555) 555-5555");
    str.erase(std::remove_if(str.begin(), str.end(), IsChars("()- ")), str.end());
    std::cout << str << std::endl; // Expected output: 5555555555
}

"()- "문자열 로 제거 할 문자를 지정할 수 있습니다 . 위의 예에서는 괄호와 대시뿐만 아니라 공백도 제거되도록 공백을 추가했습니다.


답변

remove_if ()는 이미 언급되었습니다. 그러나 C ++ 0x에서는 대신 람다를 사용하여 조건자를 지정할 수 있습니다.

다음은 필터링을 수행하는 3 가지 방법의 예입니다. const로 작업하거나 원본을 수정하지 않으려는 경우를 위해 함수의 “복사”버전도 포함됩니다.

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;

string& remove_chars(string& s, const string& chars) {
    s.erase(remove_if(s.begin(), s.end(), [&chars](const char& c) {
        return chars.find(c) != string::npos;
    }), s.end());
    return s;
}
string remove_chars_copy(string s, const string& chars) {
    return remove_chars(s, chars);
}

string& remove_nondigit(string& s) {
    s.erase(remove_if(s.begin(), s.end(), [](const char& c) {
        return !isdigit(c);
    }), s.end());
    return s;
}
string remove_nondigit_copy(string s) {
    return remove_nondigit(s);
}

string& remove_chars_if_not(string& s, const string& allowed) {
    s.erase(remove_if(s.begin(), s.end(), [&allowed](const char& c) {
        return allowed.find(c) == string::npos;
    }), s.end());
    return s;
}
string remove_chars_if_not_copy(string s, const string& allowed) {
    return remove_chars_if_not(s, allowed);
}

int main() {
    const string test1("(555) 555-5555");
    string test2(test1);
    string test3(test1);
    string test4(test1);
    cout << remove_chars_copy(test1, "()- ") << endl;
    cout << remove_chars(test2, "()- ") << endl;
    cout << remove_nondigit_copy(test1) << endl;
    cout << remove_nondigit(test3) << endl;
    cout << remove_chars_if_not_copy(test1, "0123456789") << endl;
    cout << remove_chars_if_not(test4, "0123456789") << endl;
}


답변

관심있는 사람을위한 다른 솔루션이 있습니다. C ++ 11에서 새로운 For 범위를 사용합니다.

string str("(555) 555-5555");
string str2="";

for (const auto c: str){

    if(!ispunct(c)){

        str2.push_back(c);
    }
}

str = str2;
//output: 555 5555555
cout<<str<<endl;


답변

std :: string에 대한 그러한 멤버가없는 것이 두렵습니다.하지만 이러한 종류의 함수를 쉽게 프로그래밍 할 수 있습니다. 가장 빠른 솔루션은 아니지만 이것으로 충분합니다.

std::string RemoveChars(const std::string& source, const std::string& chars) {
   std::string result="";
   for (unsigned int i=0; i<source.length(); i++) {
      bool foundany=false;
      for (unsigned int j=0; j<chars.length() && !foundany; j++) {
         foundany=(source[i]==chars[j]);
      }
      if (!foundany) {
         result+=source[i];
      }
   }
   return result;
}

편집 : 아래 답변을 읽으면서 숫자를 감지하는 것뿐만 아니라 더 일반적으로 이해했습니다. 위의 솔루션은 두 번째 인수 문자열에 전달 된 모든 문자를 생략합니다. 예를 들면 :

std::string result=RemoveChars("(999)99-8765-43.87", "()-");

결과는

99999876543.87


답변

using namespace std;


// c++03
string s = "(555) 555-5555";
s.erase(remove_if(s.begin(), s.end(), not1(ptr_fun(::isdigit))), s.end());

// c++11
s.erase(remove_if(s.begin(), s.end(), ptr_fun(::ispunct)), s.end());

참고 :ptr_fun<int, int> 간단하지 않고 쓰기 가 필요할 수 있습니다.ptr_fun


답변

예, isdigit () 함수를 사용하여 숫자를 확인할 수 있습니다. 🙂

여기 있습니다 :

#include <iostream>
#include <cctype>
#include <string.h>

using namespace std;

int main(){

  char *str = "(555) 555-5555";
  int len = strlen(str);

  for (int i=0; i<len; i++){
      if (isdigit(*(str+i))){
        cout << *(str+i);
      }
  }

  cout << endl;


return 0;
}

도움이되기를 바랍니다 🙂