본문 바로가기

아무거나 코딩

[C] 문자열 뒤집기

영어로 이루어진 문자열 뒤집기

void reverseEng(char str[])
{
	int length = strlen(str);
	char cTemp = '\0';

	for (int i = 0, j = (length - 1); i < j; i++, j--)
	{
		cTemp = str[i];
		str[i] = str[j];
		str[j] = cTemp;
	}
}

 

 첫번째와 마지막 문자부터 문자를 교환하면서 점점 중앙으로 다가간다. 만약 문자열의 길이가 홀수이면 중앙의 글자는 뒤집을 필요가 없으므로 종료. 짝수일 경우에는 교환한 인덱스가 서로 연속한 인덱스이면 종료하면 된다. 

 

[0] 번째 인덱스와 값과 [4] 번째 인덱스값 교환 

[0] [1] [2] [3] [4]
'H' 'E' 'L' 'L' 'O'

 

[1] 번째 인덱스와 값과 [3] 번째 인덱스값 교환 

[0] [1] [2] [3] [4]
'O' 'E' 'L' 'L' 'H'

 

결과

[0] [1] [2] [3] [4]
'O' 'L' 'L' 'E' 'H'

 

 

실행 결과


한글로 이루어진 문자열 뒤집기

void reverseKor(char str[])
{
	int length = strlen(str);
	char cTemp = '\0';

	for (int i = 0, j = (length - 1); i < j; i+=2, j-=2)
	{
		cTemp = str[i];
		str[i] = str[j - 1];
		str[j - 1] = cTemp;
		cTemp = str[i + 1];
		str[i + 1] = str[j];
		str[j] = cTemp;
	}

 

 한글은 영어와 달리 2bit로 이루어져 있고 두 인덱스 안에 하나의 한글이 저장되어 있다. 만약 [0] [1] 안에 "가"라는 값이 있을때. [1][0] 순서로 저장되면 한글이 아닌 다른 글자가 출력되므로 이를 조심해서 교환해준다.

 

[0]과 [8]에 인덱스의 값 교환, [1]과 [9]에 인덱스의 값 교환

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'안' '녕' '하' '세' '요'

 

 

[2]과 [6]에 인덱스의 값 교환, [3]과 [7]에 인덱스의 값 교환

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'요' '녕' '하' '세' '안'

 

결과

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'요' '세' '하' '' '안'

실행 결과


한글과 영어로 이루어진 문자열 뒤집기

void reverse(char str[])
{
	char sTemp[MAX_STR] = "\0";
	strcpy(sTemp, str);

	int length = strlen(str);

	int i = 0;
	while (i < length)
	{
		if (sTemp[i] > 0)
		{
			str[length - i - 1] = sTemp[i];
			i++;
		}
		else
		{
			str[length - i - 2] = sTemp[i];
			str[length - i - 1] = sTemp[i + 1];
			i += 2;
		}
	}


 한글과 영어의 비트 차이로 인해 위와 같은 방법으로 문자를 뒤집는 방법은 복잡하다. 그래서 받은 문자열과 똑같은 임의의 문자열을 생성한다. 그리고 임의의 문자열 뒤 인덱스값부터 원래 문자열의 앞 인덱스값에 저장하는 방식으로 문자열을 뒤집는다. 

 

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'안' 'H' 'L' '녕' 'L' 'O' 'N' 'G'

 

sTemp

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'안' 'H' 'L' '녕' 'L' 'O' 'N' 'G'

 

 

sTemp[9]의 값을 str[0]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' '안' 'H' 'L' '녕' 'L' 'O' 'N' 'G'

 

sTemp[8]의 값을 str[1]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' 'N' 'H' 'L' '녕' 'L' 'O' 'N' 'G'

 

sTemp[7]의 값을 str[2]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' 'N' 'O' 'L' '녕' 'L' 'O' 'N' 'G'

 

sTemp[6]의 값을 str[3]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' 'N' 'O' 'L' '녕' 'L' 'O' 'N' 'G'

 

sTemp[5]의 값을 str[5]에 복사, sTemp[4]의 값을 str[4]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' 'N' 'O' 'L' '녕' 'L' 'O' 'N' 'G'

 

sTemp[3]의 값을 str[6]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' 'N' 'O' 'L' '녕' 'L' 'O' 'N' 'G'

 

sTemp[2]의 값을 str[7]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' 'N' 'O' 'L' '녕' 'L' 'H' 'N' 'G'

 

sTemp[1]의 값을 str[9]에 복사, sTemp[0]의 값을 str[8]에 복사

str

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
'G' 'N' 'O' 'L' '녕' 'L' 'H' '안'

 

실행 결과