2016-07-08 6 views
-4

질문은 문자열에 포함 된 공백을 "% 20"으로 바꾸는 것입니다. 그래서 기본적으로 공백이 있으면 문자열에 삽입해야합니다. 따라서 모든 공백을 % 20으로 바꾸고 싶지만 부분 문자열 만 대체됩니다. 바꾸기 기능에서 올바른 o/p를 볼 수 있습니다.아래 코드의 문제점은 무엇입니까?

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

int spaces(char* s,int size) /*calculate number of spaces*/ 
{ 
    int nspace=0; 
    for(int i=0;i<size;i++) 
    { 
     if(s[i]==' ') 
     { 
      nspace++; 
     } 
    } 
    return nspace; 
} 

int len_new_string(char* inp,int l) /*calculate the length of the new string*/ 
{ 
    int new_length=l+spaces(inp,l)*2; 
    return new_length; 
} 

char* replace(char* s,int length) /*function to replace the spaces within a string*/ 
{ 
    int len=len_new_string(s,length); 
    char new_string[len]; 
    int j=0; 
    for(int i=0;i<length;i++) 
    { 
     if(s[i]==' ')  /*code to insert %20 if space is found*/ 
     { 
     new_string[j]='%'; 
     new_string[j+1]='2'; 
     new_string[j+2]='0'; 
     j=j+3; 
     } 
     else /*copy the original string if no space*/ 
     { 
     new_string[j]=s[i]; 
     j++; 
     } 
    } 
cout<<"Replaced String: "<<new_string<<endl; 
return s=new_string; 
} 


int main() 
{ 
    char str[]="abc def ghi "; 
    int length=sizeof(str)/sizeof(str[0]); 
    cout<<"String is: "<<str<<endl; 
    char *new_str=replace(str,length); 
    cout<<"Replaced String is: "<<new_str<<endl; 
} 
+2

_ 디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. 참고 : [MCVE]를 만드는 방법 ._ –

+0

로컬 배열에 대한 포인터를 반환하고 있습니다. 'new_string'을 표시하려고하면 이미 사라졌습니다. –

답변

1

문자 배열이 범위를 벗어나서 해제되어야합니다. 당신이 segfault를 얻지 못하는 유일한 이유는 다른 프로그램이 아직 그 자리에 메모리를 예약하지 않았다는 것입니다. 이를 방지하려면, 참조 또는 포인터를 넘겨 제자리에 작성, 패딩 char 배열을 사용해보십시오 : (뒤, 나중에 delete[]로 기억)

는 또 다른 옵션은 new[]이다
void replace(char *in, char *out, size_t length) 
{ 
    /* copy as-is for non-spaces, insert replacement for spaces */ 
} 

int main() 
{ 
    char str[]="abc def ghi"; 
    size_t buflen(strlen(str)+2*spaces(str, strlen(str))); 
    char output[buflen+1]; 
    memset(output, 0, buflen+1); 
    replace(str, output, strlen(str)); 
} 

반환 배열 또는 당신이 이유가 없어 졌다고 생각하는 경우 배열 문제를 피하기 위해 std::string을 사용하십시오.

+1

_ "segfault를 얻지 못한 유일한 이유는 분명히 다른 프로그램이 그 자리에서 메모리를 예약하지 못했기 때문입니다."_ 아니요, 이유는 정의되지 않은 동작이므로 아무 것도 발생할 수 없습니다. –

+0

고마워요. 지금 일하고있다. – Vallabh

관련 문제