기록하는 공부
[C/Algorithm] 문자열 거꾸로 출력하기/문자열 역순으로 출력하기/포인터활용/포인터예제 본문
예제코드
#include <stdio.h>
#include <string.h>
main() {
int k, n;
char st[] = "I am Baki";
char temp;
n = strlen(st); //st 문자열의 길이인 9를 변수 n에 저장
n--; //n값에서 1을 뺀 후 다시 n에 저장 (n=8)
printf("%s\n", st); //st 문자열 출력
for(k=0; k<n; k++) { //0부터 n의 값인 8 미만까지 반복
temp = *(st+k); //temp 변수에 st 주소 값에 k만큼 더한 주소에 해당하는 값을 저장
*(st+k) = *(st+n); //st 주소 값에 k만큼 더한 주소에 해당하는 값에 st 주소 값에 n만큼 더한 주소에 해당하는 값을 저장
*(st+n) = temp; //st 주소 값에 n만큼 더한 주소에 해당하는 값에 temp 값 저장
n--; //n값 감소
}
printf("%s\n", st); //역순으로 저장된 문자열 출력
}
int k, n;
char st[] = "I am Baki";
char temp;
n = strlen(st);
n--;
정수형 변수 k, n을 선언한다.
배열을 선언할 때 사용할 개수를 생략하고 초기값을 지정하면, 초기값으로 지정된 값의 수와 같은 크기의 배열이 선언되는데,
초기값이 문자열인 경우 널 문자가 들어가기 때문에 문자열의 크기보다 1 큰 배열이 만들어진다.
문자형 변수 temp를 선언한다.
strlen()은 문자열의 길이는 함수로, st가 가리키는 문자열인 "I am Baki'의 길이인 9를 변수 n에 저장한다.
또한, strlen()함수는 널 문자(\0)를 제외한 순수한 문자열의 길이만 구한다.
n의 값을 1을 감소시킨다.
c언어에서는 배열의 위치가 0부터 시작되어 배열 st는 st[0]부터 st[8]까지 9개의 문자를 저장하게 된다.
즉, 교환할 문자의 끝 위치는 8번째이기 때문에 n을 1 감소시킨다.
for(k=0; k<n; k++) {
temp = *(st+k);
*(st+k) = *(st+n);
*(st+n) = temp;
n--;
}
반복 변수 k가 0부터 1씩 증가하면서 n(=8)보다 작을 때까지 반복한다.
n--; 명령을 수행하여 문자의 끝 위치를 하나씩 앞으로 당긴다.
temp에 배열 st가 가리키는 곳의 주소에서 k만큼 증가한 주소가 가리키는 곳의 값(*(st+k))을 저장한다.
(st+k)가 가리키는 곳의 값을 (st+n)이 가리키는 곳의 값으로 치환한다.
(st+n)의 값도 temp 값으로 치환한다.
n의 값을 1 감소시킨다.
이해하기 쉽도록 k의 값에 값을 대입해보자.
k가 0일 때, n은 8이게 된다.
이때, st[0]과 st[8]의 값을 교환한다.
그리고 n값 1 감소
k가 1일 때, n은 7이게 된다.
이때, st[1]과 st[7]의 값을 교환한다.
그리고 n값 1 감소
k가 2일 때, n은 6이게 된다.
이때, st[2]과 st[6]의 값을 교환한다.
그리고 n값 1 감소
...
이렇게 k의 값이 n값보다 작을 때까지 반복된다.
실행결과