2012-04-11 1 views
-1

문자열에서 지우기 기능에 문제가 있습니다. 특정 색인에서 한 문자를 삭제할 수 없습니다. 아마도 "int"를 반복자로 사용할 수 없습니까? 일부 문자를 삭제하고 싶습니다.문자열에서 문자를 지우는 방법은 무엇입니까?

#include <cstdlib> 
#include <iostream> 
#include <string> 

using namespace std; 

void deleteChars(string inputText, string inputChars); 

int main(int argc, char *argv[]) 
{ 
    string tekst1 = ("mama fama lilo babo sabo"); 
    string tekst2 = ("mabo"); 

    deleteChars(tekst1, tekst2); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

void deleteChars(string inputText, string inputChars){ 
      int a = inputText.size(); 
      int b = inputChars.size(); 

      string tmp = inputText; 

      for(int i=0; i<a; i++){ 
        for(int j=0; j<b; j++){ 
          if(inputText.at(i)==inputChars.at(j)){ 
           tmp.erase(i,1); //Here is my problem ? 
          }          
        } 
      } 

      inputText = tmp; 

      cout<<"text: "<<inputText<<endl; 

} 

내 오류 : 당신이 5의 위치를 ​​위치 6 변화에 무엇 위치 5 말하자면,에서 문자를 삭제하고, 문자열 길이가 1 씩 감소 후

This application has requested the Runtime to terminate it in an unusual way 
+5

tmp 란 무엇입니까? inputText? inputChars? 샘플 입력, 표시 선언 등을하십시오. –

+2

오류를 나타내는 ** 짧은 **, ** 완료 ** 프로그램을 제공해주십시오. 그 프로그램의 결과물이 무엇이고 실제로 무엇이 될 것이라고 기대하십니까? 자세한 내용은 http://sscce.org를 참조하십시오. –

+0

게시 한 코드에 문제가 없습니다. 그것은 당신의 프로그램에있는 다른 곳입니다. 오류는 프로그램이 비정상적으로 종료되었음을 보여줍니다. 가능한 경우 전체 프로그램을 게시하십시오. –

답변

4

처음에는 tmp 크기가 inputText 크기 인 a과 같습니다.

는하지만 최대한 빨리 tmp에서 문자를 지우로, 그 크기는 1 씩 감소하고, a-1이되고, 당신은 두 번째를 삭제하는 경우, 그 크기 등등 a-2 및 될 것입니다. 따라서 어느 시점에서 tmp 크기 이상의 인덱스를 erase 함수에 전달하면 처리 할 수없는 std::out_of_range 예외가 발생하여 응용 프로그램이 충돌 할 수 있습니다.

+1

* 정의되지 않은 동작 *입니까? http://www.cplusplus.com/reference/string/string/erase/에 따르면 단순히 여기에 잡히지 않은 예외를 throw합니다. – DCoder

+0

@DCoder : 아니, 잘 모르겠습니다. 방금 그렇게 생각 했어. 하지만 이제는'std :: out_of_range' 예외를 던졌습니다. 귀하의 의견에 감사드립니다. – Nawaz

12

. 나중에 tmp의 마지막 문자를 지우려고하면 tmp이 이미 예상보다 1 문자 짧기 때문에 예외가 발생합니다. 이 문제를 방지하려면 문자열 을 역순으로 반복하십시오.