프로젝트 & 과제/3학년

[C언어] 문자열의 마지막 문자 변경

qqlzzb 2022. 2. 8. 18:43

개요

프로그래밍 언어 : C언어

과제 수행 날짜 : 2020.12.04

과제 개요 : 포인터 배열을 이용하여 2차원 배열에 저장된 문자열의 마지막 글자를 *로 변경

 

코드

#include <stdio.h>
#define N 6

int main()
{
	char *p[N], count;
	char str[N][10] = { "가나다","123","wxyz","가나다000","78다", "가나다" };

	count = 0;
	while (1) // 포인터 배열 p가 str을 가리키도록
	{
		if (count > N-1) break;
		p[count] = str[count];
		count++;
	}
	count = 1;

	while (count <= N)
	{
		while (1) // 포인터가 가리키는 값이 널이 될 때까지 다음으로 이동
		{
			*p = *p + 1;
			if (**p == 0) break;
		}
		*p = *p – 1; // 널값 이전의 값을 변경시켜야 하므로 널 바로 앞을 가리킴
		if (**p & 0x80)//한글처리
		{
			*p = *p – 1; // 한글은 2바이트이기 때문에 바로 앞으로 또 이동
			if (**p & 0x80) // 그 바이트도 0x80과 &연산하여 1이라면 한글.
			{
				**p = '*'; // 해당 바이트를 *로
				*p = *p + 1; // 바로 앞에 널 문자를 입력해야  
				**p = 0; // 원하는 결과를 얻을 수 있음
				*p = *p + 1; // 그대로 나가면 널 문자가 *로 바뀌므로
			}
		}
		**p = '*'; // 널 바로 앞 값을 *로 바꾼다
		*p = p[count]; 
		count++;
	}

	for (count = 0; count < N; count++) // 문자열 출력
	{
		printf("%s ", str[count]);
	}
	return 0;
}

결과

- 전체 코드 설명

p = N개의 문자열 전체를 가리킴 (한 번 가면 str 문자열의 시작 주소, 한 번 더 가면 문자)

*p = 첫 번째 문자열을 가리킴 (한 번 가면 문자 = p[0])

**p = 첫 번째 문자열의 첫 번째 문자를 가리킴 (=p[0][0])

 

*p = *p + 1;을 하면서 문자열 내에서 다음 문자를 가리키도록 한다. 그러다가 현재 가리키는 값 **p가 NULL 인지 아닌지를 확인한다. **p는 char 값이기 때문에 변경할 수 있으므로 문자열의 마지막 문자를 *로 바꾼다.

 

- 한글 처리 부분

문자열을 char 형으로 받았기 때문에 영어나 숫자 등은 0~127의 값을 갖고 128 이상의 값을 갖는 한글과 같은 문자들은 음수의 값을 갖게 된다. 즉 영어, 숫자와 같은 문자들은 첫 번째 비트가 0이고, 한글은 1이므로, 문자의 값과 0x80을 & 연산을 했을 때 1이 나오면 한글임을 알 수 있다. 이를 이용해서 NULL 문자 앞의 값이 한글인지 아닌지를 판단한 후, 한글이라면 그 앞의 바이트 또한 첫 번째 비트가 1이므로 if 문으로 한글이 맞는지 2바이트 모두 판단한 후, 2바이트 중 첫 번째 바이트를 *로 변경한다. 그리고 두 번째 바이트는 NULL로 변경한다.