이 코드가 세상 모든 유니코드들을 표현할 수 있는 방법이라고 딱 잘라 말하긴 뭐하지만..적어도 WithCS 서버에서는 맞게 동작하는 코드입니다.
일단 한방에 읽는 방법은 있긴 합니다. gets 이런거로고요ㅋㅋㅋ근데 이런걸 원하는거같진 않고...
글쎄요.. wchar 랑 L"%c" 이런 2byte 짜리 문자를 다루는데 사용되는 변수들이 있긴 합니다. 근데 저도 얘네 잘 몰라요ㅋ 사용하지 않는 것이 정신건강에 좋을거같은 친구들이라서.... 왠지 제가 생각한거랑 다르게 동작하는 경우가 많아서 암걸립니다. 엉엉ㅠㅠㅠ
printf가 출력할 때 어디다가 출력을 하는 친구인지 아시나요? stdout 이라는 가상의 "파일"에다가 출력을 하는 친구입니다. (scanf는 stdin이라는 가상의 파일에서 값을 읽어오는 함수고, 따라서 End Of "File" 로 입력이 끝나는거죠.)
문제 지문에도 설명되있지만.. 한글같은 유니코드를 출력하기 위해서는 1byte로는 부족합니다. 그래서 8bit 중 0번째 비트값이 1로 시작하는 애들은 "아 얘는 유니코드구나!" 라고 생각하고, 1로 시작하는 애들끼리 뭉쳐서 유니코드 글자 하나를 출력하는거죠...
그럼 왜 프린트를 2번 할 때마다 한글자씩 나오느냐?
자 여기 char 배열 a[3]에 "-65" "-51" 이라는 숫자 2개가 저장되있다고 칩시다. 제 컴퓨터에서 "와"를 gets로 입력받았을 때 들어오는 값입니다.
printf("%c",a[0]); 을 하면 stdout 파일에는 10111111 가 저장되있겠네요. (bit단위) 이 상태론 화면에 아무런 값이 나오지 않습니다. 왜냐하면 -65에 해당하는 아스키코드 값이 없기 때문이죠.
그 다음 printf("%c",a[1]);을 하면 stdout 파일에는 1011111111001101 가 저장되있겠네요. 이제는 0번째 비트가 1로 시작하는 글자 2개가 나왔으니 콘솔에 글자를 출력하는 녀석이 이녀석이 유니코드구나! 라는걸 알아차리고, 이에 해당하는 글자 "와"를 출력하는거죠. 이해가 가시나요?