문자열 안에서 특정 문자열을 다른 문자열로 바꾸는 replace_all을 만들고 있습니다. 문자열 상수와 동적할당된 포인터구분법은?
_haystack에서 _nedle을 찾아 _substitution으로 바꿔주는 함수입니다. 그런데 아래와 같이 호출할 경우에 전달한 searchterm이 동적할당된 메모리라면 replaced_chars를 반환하기 전에 delete[] _haystack 을 해줘야 합니다. 그런데 그렇게 처리하면 또 문자열 상수를 _haystack에 전달할 때 문제가 생깁니다. 문자열 상수와 동적할당된 포인터를 구분해서 문자열 상수가 아니면 delete[] _haystack를 해주고 싶은데, 방법이 없을까요?
searchterm=replace_all(searchterm,L"<",L"<");
const char* replace_all(const char* _haystack, const char* _needle, const char* _substitution) {
if(_haystack==NULL) { return _haystack; }
if(_haystack[0]=='\0') { return _haystack; }
char* replaced_chars=NULL;
const char* haystack=_haystack;
const char* pos=NULL;
unsigned long long int identifier=0;
while( (pos=strstr(haystack, _needle))!=NULL ) {
size_t length=strlen(haystack)-strlen(pos);
if(identifier==0) {
replaced_chars=(char*)realloc(replaced_chars, ( length+1+strlen(_substitution) )*sizeof(char) );
//memset(replaced_chars,0, (length+1+strlen(_substitution))*sizeof(char));
}
else {
replaced_chars=(char*)realloc(replaced_chars, (strlen(replaced_chars)+length+1+strlen(_substitution))*sizeof(char) );
//memset( (char*)(replaced_chars+strlen(replaced_chars)),0,(length+1+strlen(_substitution))*sizeof(char));
}
strncat(replaced_chars, haystack, length);
strncat(replaced_chars, _substitution, strlen(_substitution));
haystack=pos;
haystack=haystack+strlen(_needle);
identifier++;
}
/*if(replaced_chars==NULL) {
return _haystack;
}*/
if(haystack[0]=='\0') {
return replaced_chars;
}
//더 붙일 문자열이 있는 경우
size_t length=strlen(haystack);
replaced_chars=(char*)realloc(replaced_chars, (length+1)*sizeof(char));
strncat(replaced_chars, haystack, length);
return replaced_chars;
}
C++면 typeid나 template 쓰시면 되겠네요.
C++에서 문자열 상수의 타입은 const char형 배열입니다.
동적 할당된 메모리는 non-const인 char형 배열일 것이므로
typeid나 template등으로 const char * 인 경우와 char * 인 경우를
서로 구분해서 처리하도록 하면 됩니다.
이 두 가지에 대해서는 짧게 설명할 내용이 아니므로
책이나 검색을 통해 찾아보세요.
C에선 문자열 상수가 char형 배열이고,
타입을 알아내거나 구분할 방법이 없으므로
불가능합니다.
1. 그런 방법은 없습니다. 2. 여기서
1. 그런 방법은 없습니다.
2. 여기서 _haystack 은 외부에서 넘겨주는 인자입니다.
이게 동적할당되있다면 그건 호출하는 측에서 동적할당한 것이므로, 일반적으로 해제하는 것도 호출하는 쪽에서 알아서 할 일입니다.
이걸 맘대로 함수안에서 해제하는 것은 오히려 함수 사용법에 한줄 주의점을 추가시키는 게 되어 좋은 디자인이라고 하기 힘듭니다.
3. C++이라면 배열이 아닌 std::string이나 이에 준하는 문자열 클래스를 사용하세요.
여러모로 답변감사드립니다.
개인적으로 사용할 함수라면 상관은 없겠네요. 외부에서 해제하는 방법으로 프로그램을 해야겠군요. 답변감사드립니다.
안개 걷히고 구름 걷히면 빛이 내려 않는다.
댓글 달기