Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

새싹교실/2017/꽃밭/0328: Difference between revisions

From ZeroWiki
No edit summary
No edit summary
Line 12: Line 12:
그런데 우리는 이미 printf와 scanf를 통해서 문자를 입력받고 출력받고 있습니다.
그런데 우리는 이미 printf와 scanf를 통해서 문자를 입력받고 출력받고 있습니다.
숫자만을 알고 있는 컴퓨터가 어떻게 문자를 다룰 수 있는 걸까요?
숫자만을 알고 있는 컴퓨터가 어떻게 문자를 다룰 수 있는 걸까요?
[[File:ascii_table.png|400]]
답은 간단합니다. 문자 하나마다 숫자를 하나씩 매칭하는거죠.
답은 간단합니다. 문자 하나마다 숫자를 하나씩 매칭하는거죠.
숫자 97은 문자 a이다, 라고 약속을 하는 겁니다.
숫자 97은 문자 a이다, 라고 약속을 하는 겁니다.
그런 약속이 모여서 아스키 코드가 되었죠.
그런 약속이 모여서 아스키 테이블이 만들어졌습니다.
 
[[File:ascii_table.png|300]]
 
printf("%c", 숫자)에서 '숫자' 자리에 위 테이블에 있는 숫자를 하나씩 넣어보세요.
printf("%c", 숫자)에서 '숫자' 자리에 위 테이블에 있는 숫자를 하나씩 넣어보세요.
그 숫자에 해당되는 문자가 출력될 것입니다.
그 숫자에 해당되는 문자가 출력될 것입니다.

Revision as of 13:06, 30 March 2017

수업 내용

과제 리뷰를 하며 아스키코드와 버퍼를 설명했습니다. 그러고나서 이론을 가르쳤습니다.

아스키 코드

0과 1로 동작하는 컴퓨터에게 모든 것은

{color:red}숫자

로 통합니다. 문자도 숫자, 소리도 숫자, 그림도 숫자로 취급해서 다루죠.

그런데 우리는 이미 printf와 scanf를 통해서 문자를 입력받고 출력받고 있습니다. 숫자만을 알고 있는 컴퓨터가 어떻게 문자를 다룰 수 있는 걸까요? 답은 간단합니다. 문자 하나마다 숫자를 하나씩 매칭하는거죠. 숫자 97은 문자 a이다, 라고 약속을 하는 겁니다. 그런 약속이 모여서 아스키 테이블이 만들어졌습니다.

300

printf("%c", 숫자)에서 '숫자' 자리에 위 테이블에 있는 숫자를 하나씩 넣어보세요. 그 숫자에 해당되는 문자가 출력될 것입니다.

아스키 코드의 숫자는 0부터 127까지입니다. 그래서 우리가 문자를 출력할 때, 0~127을 벗어나는 수를 넣게 되면 문제가 생기게 되지요(물론 저 범위에서 확장된 확장형 아스키 코드가 있긴 하지만, 그건 지금 얘기하지는 않겠습니다).

문자열 입출력

string을 입력받을 때는 앞에 '&'가 붙지 않습니다. 지금은 요정도만 알아두세요.

문자 입력받기는 까다롭다! 버퍼 알아보기

과제 코드의 일부를 가져와봤습니다.

printf("첫 번째 문자 입력하세요 : ");
	scanf("%c", &ch1);
	printf("두 번째 문자 입력하세요 : ");
	scanf("%c", &ch2);
	printf("세 번째 문자 입력하세요 : ");
	scanf("%c", &ch3);

문자 세 개를 입력받아 ch1, ch2, ch3 변수에 넣고 있습니다. 하지만 이대로는 문자 세 개가 정상적으로 입력되지 않습니다. 바로 버퍼 때문인데요, scanf는 입력을 버퍼에 저장합니다. 그래서 사용자가 이렇게 입력을 하면,

첫 번째 문자 입력하세요 : a
두 번째 문자 입력하세요 : b
세 번째 문자 입력하세요 : c

버퍼는 요런 상태가 되지요. 480 a, b, c가 나란히 들어가 있는 것이 아니라 사이사이에 엔터(\n)가 들어간 것을 볼 수 있습니다. a를 입력하고 누른 엔터, b를 입력하고 누른 엔터가 다 들어간 것이지요. 그래서 변수 ch2에는 b가 아닌, a를 입력하고 누른 엔터가 들어가는 것입니다. 480 이 문제를 어떻게 해결해야 할까요? 흠, 엔터를 받아서 어디다 던져 버리면 되지 않을까요? 480

{color:red}getchar()

함수는 문자 하나를 받는 함수입니다. 이 함수를 이용해서 엔터를 받으면, ch2에는 b가 들어가게 되겠죠. getchar()를 추가해서 다시 코드를 작성해 볼까요?

printf("첫 번째 문자 입력하세요 : ");
	scanf("%c", &ch1); // a 받고,
        getchar();         // 엔터 받아오기
	printf("두 번째 문자 입력하세요 : ");
	scanf("%c", &ch2); // b 받고,
        getchar();         // 엔터 받아오기
	printf("세 번째 문자 입력하세요 : ");
	scanf("%c", &ch3);

이렇게 문제가 해결됩니다.

결론 :

{color:blue}문자나 문자열 입력을 받을 때는 그것이 항상 버퍼에 들어간다는 것을 기억하세요!

반복문 for문

==

과제

현지

혜민

유진

후기