개요
프로그래밍 언어 : 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로 변경한다.
'프로젝트 & 과제 > 3학년' 카테고리의 다른 글
[데이터베이스] DB 연동 웹사이트 (0) | 2022.02.10 |
---|---|
[C언어] 구조체 출력 (0) | 2022.02.09 |
[C언어] 문자열 배열의 순서를 바꾸는 함수 (0) | 2022.02.07 |
[C언어] 포인터로 값 복사 (0) | 2022.02.06 |
[C언어] 포인터로 문자열 복사 (0) | 2022.02.05 |