Language/C

C :: 문자열 치환(변환)

VallistA2014. 6. 15. 18:14

0. 개요


c언어에서는 string.h 에서 문자열 관련한 많은 기능들을 제공합니다.

수많은 기능중에서 문자열을 입력해서, 그 대상 문자열중 자신이 바꾸겠다 하는 문자열을 다른 문자열로 치환하는 기능이 없습니다.

c가 아닌 c++에서의 string에도 이런 기능을 지원하지 않습니다. 


string이 무엇일까? :: http://vallista.tistory.com/entry/string-문자열


기능이 존재하지 않으면, 그 기능을 만들어야겠죠? 

이번에는 입력한 문자열을 자신이 원하는 문자열을 찾고, 원하는 문자열로 치환(변환) 시키는 함수를 만들어보겠습니다.


1. 문자열을 치환하는 소스 코드

char *replaceValue(char *strInput, const char *strTarget, const char *strChange) 
{
	char* strResult;
	char* strTemp;
	int i = 0;
	int nCount = 0;
	int nTargetLength = strlen(strTarget); 

	if (nTargetLength < 1) 
		return strInput;

	int nChangeLength = strlen(strChange);

	if (nChangeLength != nTargetLength)
	{
		for (i = 0; strInput[i] != '\0';) 
		{
			if (memcmp(&strInput[i], strTarget, nTargetLength) == 0) 
			{
				nCount++; 
				i += nTargetLength;
			}
			else i++;
		}
	} 
	else 
	{
		i = strlen(strInput); 
	}

	strResult = (char *) malloc(i + 1 + nCount * (nChangeLength - nTargetLength));
	if (strResult == NULL) return NULL;


	strTemp = strResult;
	while (*strInput)
	{
		if (memcmp(strInput, strTarget, nTargetLength) == 0) 
		{
			memcpy(strTemp, strChange, nChangeLength);
			strTemp += nChangeLength;
			strInput  += nTargetLength;
		}
		else 
		{
			*strTemp++ = *strInput++;
		}
	}

	*strTemp = '\0';

	return strResult;
}


위의 소스는 문자열을 치환하는 소스코드입니다.

내부는 따로 설명을 드리진 않겠습니다.


2. 사용법


자 이제 사용법에 대해서 알아 봅시다.

제일 상위단에는 stdio.h , string.h , stdlib.h 를 포함해주시면 되겠습니다.


#define STRMAX 256						//!< 배열의 최대값

int showResult(char * input);			//!< 결과 보여주는 함수
char *replaceValue(char *strInput, const char *strTarget, const char *strChange);

int main()
{
	char strInput[STRMAX];				//!< 입력받을 변수
	char strTarget[STRMAX];				//!< 변경할 이름
	char strChange[STRMAX];				//!< 변경될 이름
	char strResult[STRMAX];				//!< 변경한 값을 저장할 변수
	memset(strInput , NULL , STRMAX);	//!< 초기화
	memset(strResult , NULL , STRMAX);	//!< 초기화

	printf("입력 받을 이름 : ");
	gets(strInput);
	printf("변경할 이름 : ");
	gets(strTarget);
	printf("변경될 이름 : ");
	gets(strChange);

	sprintf(strResult , "%s" , replaceValue(strInput, strTarget, strChange));

	showResult(strResult);
        free(strResult);

	return 0;
}

int showResult(char * input)
{
	if(input == NULL)
		return -1;

	printf("결과 : %s\n" , input);

	return 0;
}

char *replaceValue(char *strInput, const char *strTarget, const char *strChange) 
{
	char* strResult;
	char* strTemp;
	int i = 0;
	int nCount = 0;
	int nTargetLength = strlen(strTarget); 

	if (nTargetLength < 1) 
		return strInput;

	int nChangeLength = strlen(strChange);

	if (nChangeLength != nTargetLength)
	{
		for (i = 0; strInput[i] != '\0';) 
		{
			if (memcmp(&strInput[i], strTarget, nTargetLength) == 0) 
			{
				nCount++; 
				i += nTargetLength;
			}
			else i++;
		}
	} 
	else 
	{
		i = strlen(strInput); 
	}

	strResult = (char *) malloc(i + 1 + nCount * (nChangeLength - nTargetLength));
	if (strResult == NULL) return NULL;


	strTemp = strResult;
	while (*strInput)
	{
		if (memcmp(strInput, strTarget, nTargetLength) == 0) 
		{
			memcpy(strTemp, strChange, nChangeLength);
			strTemp += nChangeLength;
			strInput  += nTargetLength;
		}
		else 
		{
			*strTemp++ = *strInput++;
		}
	}

	*strTemp = '\0';

	return strResult;
}

사용법은 그렇게 어렵지 않습니다. 간단합니다.

char* 형으로 반환을 하는것만 유의해주시면 간단한 소스코드로 인식할 수 있습니다.

'Language > C' 카테고리의 다른 글

C :: 문자열 치환(변환)  (2) 2014.06.15

댓글

  • 테르세라2015.03.16 09:58 문자열 치환 함수 잘 봤는데요
    malloc 이후에 free 코드가 안보이네요
    이 코드를 사용하면 메모리 누수가 발생할 듯 합니다.
    아래와 같이 코드를 수정하면 어떨까요?

    char *strResult = NULL;
    strResult = replaceValue(strInput, strTarget, strChange);
    snprintf(strResult, sizeof(strResult), "%s", strResult);

    showResult(strResult);
    free(strResult);

    return 0;
  • BlogIcon VallistA2015.03.17 11:00 신고 아 ^^ 빠진부분 설명 감사드립니다 ^_^
    수정하겠습니다 좋은 하루 되셨으면 좋겠어요
댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 17

Total : 341,806

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘