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* 형으로 반환을 하는것만 유의해주시면 간단한 소스코드로 인식할 수 있습니다.

댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

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

VISITED

Today :

Total :

SNS

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

Lately Post

Lately Comment