2013-05-27 5 views
-3

문자열 2의 모든 공통 문자를 삭제하는 다음 프로그램을 작성했습니다.C++ : 함수를 통해 포인터를 사용하여 문자열 조작

#include<iostream> 
#include<string> 
#include<iterator> 

using namespace std; 

void DelCommonChar(char *input, string s2) 
    { 
      string s1(input); 
      string::iterator it1; 
      string::iterator it2; 

      for(it1=s1.begin();it1<s1.end();it1++) 
      { 
        for(it2=s2.begin();it2<s2.end();it2++) 
        { 
          if(*it1==*it2){it1=s1.erase(it1);it1--;} 
        } 
      } 
      cout<<s1<<endl;    // Line Number 20 
    } 


    int main() 
    { 
      char c[32]; 
      strncpy(c,"Life of Pie",32); 
      DelCommonChar(c,"def"); 
      cout<<c<<endl;    //Line Number 29 
    } 

Output:Li o pi ......... printed through line number 20. 

는하지만 지금은 main function에있는 변수 c[32] 자체를 chagne 할 내가 출력을 인쇄 line number 29를 원한다.

함수 내에서만 변수 c[32]을 어떻게 변경할 수 있습니까?

참고 : 함수 반환 데이터 형식 void을 변경하고 싶지 않습니다.

+0

다음과 같은 줄 번호로 코드를 게시하지 마십시오. 독자가 이것을 편집기에 복사하여 붙여 넣을 수 없으며 컴파일 할 수 없습니다. –

+0

@OliCharlesworth 질문에 줄 번호를 언급 했으므로 여기서 줄 번호 만보고 독자를 편하게하고 싶었습니다. 메모장 + +를 사용하여 열을 세로로 선택하고 제거하면 도움이 될 수 있습니다. – CodeCodeCode

+0

@CodeCodeCode : 나는 독자들이 정말로 라인 번호를 필요로하지 않는다고 확신한다. 관심 지점을 주석 또는 무엇인가로 표시하십시오. '// 예를 들어, 줄 끝 부분에 문제가있다. ' – SigTerm

답변

1

기능 서명을 수정할 수없는 경우 "C_str()"을 사용하여 C 문자열을 반환 할 수 있습니다. 권장하지 않습니다.

#include<iostream> 
#include<string> 
#include<iterator> 

using namespace std; 

void DelCommonChar(char *input, string s2) 
{ 
     string s1(input); 
     string::iterator it1; 
     string::iterator it2; 

     for(it1=s1.begin();it1<s1.end();it1++) 
     { 
       for(it2=s2.begin();it2<s2.end();it2++) 
       { 
         if(*it1==*it2){it1=s1.erase(it1);it1--;} 
       } 
     } 
     std::strcpy (input, s1.c_str()); 
} 


int main() 
{ 
     char *c = (char *)malloc(32); 
     strncpy(c,"Life of Pie",32); 
     DelCommonChar(c,"def"); 
     cout<<c<<endl; 
} 
0

당신은 s1을 초기화 할 때 : input

string s1(input); 

이 복사 내용을 내부 버퍼에. s1을 변경해도 원래 버퍼는 변경되지 않습니다. 내용을 입력 내용에 저장하려면 strcpy, strncpy, memcpy - 모두 안전하지 않습니다.) 또는 input에서 직접 작동하십시오.

더 좋은 아이디어는 C 문자열 (char*)을 사용하지 않고 참조와 함께 std :: strings를 사용하는 것입니다.

void DelCommonChar(std::string &input, string s2) 
{ 
     std::string &s1 = input;//you don't need that, you can use input directly. 
     ... 

} 
+0

제안대로 변경하면 오류가 발생합니다. 'DelChar1 (문자열 & 입력, 문자열 s2) {...............}'오류 :'it01.cpp : 28 : 오류 : 유형의 비 const 참조 초기화가 잘못되었습니다. 'void DelChar1 (std :: string &, std :: string)'인수 1을 전달하는 중 'std :: string &'이 (가) 임시 형식 'char *' 에서 발생했습니다. it01.cpp : 7 : 오류 : 'char'를'string' 객체에 전달하려고합니다. 어떤 컴파일러가 받아들이지 않습니다. – CodeCodeCode

+0

@CodeCodeCode :'* char'을 없애고 대신에'std :: string'을 변수로 사용해야한다는 것을 의미합니다. – SigTerm

0

두 개의 포인터를 유지할 수 있습니다. 하나는 검사하고 하나는 쓰는 포인터입니다. 예 :

int check=0,write=0; 
while (input[check]) 
{ 
    if (input[check] is not to be deleted) 
    { 
     input[write++]=input[check]; 
    } 
    ++check; 
} 
input[write]=0; 
+0

당신이 언급하고 싶은 것이 있습니다. 나는 네 논리를 모르겠다. – CodeCodeCode

+0

이 코드는 접근 방식보다 훨씬 ** 더 효율적이며 간단합니다. 우리가 원하는 문자에만 문자열을 "응축"한다는 것은 일어납니다. – Szidor

관련 문제