#16 - 문자열 [매우 쉬움]*

2019. 1. 7. 22:52카테고리 없음

728x90

문제
char* ptr = "program"; 으로 초기화된 문자열을 아래와 같이 출력하는 프로그램을 작성하시오.




핵심 개념
ㅡ 문자열 입출력 방식
         문자열을 표현하기 위해 char* 자료형을 가진 변수를 선언하는 것은 char 자료형으로는 문자 한 개밖에 저장할 수 없기 때문이다. char* 은 포인터 자료형으로서 주어진 문자열을 저장하는 주소에 직접 접근한다. 첫 번째 문자의 주소(index 0)에 'p'부터 7번째 문자의 주소(index 6)에 'm'까지 인접한 주소에 순차적으로 저장된다. 마지막에는 자동적으로 null 문자(\0)가 저장되면서 마침표(.)와 같은 역할을 하게 된다. 이렇게 읽기 전용의 문자열 주소가 생성된다.

ㅡ 이스케이프 시퀀스 활용
         '\' 기호 뒤에 문자나 숫자가 오는 조합을 이스케이프 시퀀스라고 한다. 보통 이스케이프 시퀀스는 제어 문자를 표현할 때 사용한다. 본 문제에서는 '\n'과 '\t'의 형태로 활용되었다'\n'은 줄 바꿈, '\t'는 수평 탭을 의미하는 제어 문자이다.[각주:1]

ㅡ ASCII 코드의 이해
         컴퓨터는 알파벳 대문자와 소문자를 형태 그 자체로 구분하지 못한다. 모든 것은 코드로 변환되어 입출력되는데, 이 때 표준으로 사용되는 코드가 바로 ASCII 코드이다. 이 코드에 따르면 알파벳 소문자 'a'는 컴퓨터가 10진수 97로 이해하게 된다. 알파벳 대문자 'A'는 컴퓨터가 10진수 65로 이해하게 되는데, 모든 알파벳 소문자와 대문자 간의 관계가 ±32로 일정하기 때문에 대소문자 간 변환이 용이하다. 
         



<Main 함수>

ㅡ line 7- 8: k 변수를 unsigned int로 선언한 이유는 strlen 함수의 반환값이 unsigned 형이기 때문이다. signed 형은 부호가 있는 자료형이고, unsigned는 부호가 없는데, 비교나 참조를 할 때 오류 발생을 막기 위해선 자료형을 같게 맞춰줄 필요가 있다. 참고로 strlen(char*) 함수[각주:2]는 문자열 변수를 매개변수로 받아 그 변수의 크기를 반환해주는 함수로서 본 문제에서는 상수 7과 같은 의미로 사용되었다.
ㅡ line 9: "program"에서 줄을 바꿀 때마다 맨 앞에서부터 한 글자씩 빼고 출력할 수 있도록 만들었다.
ㅡ line 10: '\t'을 사용하여 이후 출력될 대문자들을 나란히 세웠다.
ㅡ line 11: 
ASCII 코드 개념을 활용하여 첫번째 문자부터 줄 바꿈에 따라 차례대로 대문자로 변환하여 출력하였다. 문자열이 아니므로 형식 지정자는 %c를 사용했다.


         본 문제는 매우 간단하다. 그러나 이스케이프 시퀀스 '\t'의 엄밀한 용법에 대해 궁금증이 생기게 된 문제이기도 하다. 보통 '\t'라고 하는 수평 탭의 기능은 단순히 스페이스 바를 일정하게 여러 번 누른 것과 같았는데, 이 문제에서는 특별히 두번째 printf 문의 출력 결과와 줄을 맞춰 출력되도록 해주었다. '\t' 대신 ' '(스페이스 바)를 사용한다면 그 차이를 명확히 알 수 있을 것이다. 그리고 또 하나, '\t' 앞에 스페이스 바를 몇 번 입력하냐에 따라 출력 결과가 달라졌다. 본 문제의 main 함수에서 '\t' 대신 ' \t'나 '       \t'로 바꿔보라. 그러면 결과가 예상과는 다르게 나온다는 것을 알 수 있다. 이는 직관적으로 '\t'라는 제어 문자가 각 줄에 대해 독립적으로 수행되는 것이 아니라 이전 줄과 모종의 관계를 갖고 수행되고 있음을 추측할 수 있게 해주는 결과가 아닌가 싶다.



  1. 참고로 백슬래쉬 뒤 r은 복귀(Carriage Return)를 뜻하고, v는 수직 탭을 뜻한다. [본문으로]
  2. 함수의 사용을 위해 헤더파일을 불러왔다. [본문으로]
728x90