본문 바로가기

C 언어/임베디드 C

for문(3)

// '$'를 누를 때까지 키보드로부터 문자를 읽고 출력하는 프로그램

#include <stdio.h>
#include <conio.h> //getche() 함수의 사용

int main()
{
char ch;
int i;

printf("Please enter any charecter : ");
for(i=0; (ch=getch()) !='$'; i++)
{
printf("\nYou typed : %c\n, ch);
printf("Please enter any charecter : ");
}
putchar('\n')
return 0;
}

결과
Please enter any charecter : a
You typed : a
Please enter any charecter : b
You typed : b
Please enter any charecter : c
You typed : c
Please enter any charecter : $


#include <conio.h>
이 문을 리눅스에서는 사용할 수 없다.
리눅스에서는 getch(), getche()함수를 사용할 수 없기 때문이다.

그래서 리눅스에선 getchar()함수를 사용해야 한다.
for(i=0; (ch=getch()) !='$'; i++)
for(i=0; (ch=getchar()) !='$'; i++)로 바꿈

하지만 위처럼 getchar() 함수로 문자를 읽은 후 버퍼에 <엔터키>가 남아 있기 때문에
printf("\nYou typed : %c\n, ch); 밑에
getchar();를 입력해야 한다. 윈도우 운영체제라면 fflush(stdin);을 사용하겠지만 리눅스에선 이 명령어에 대한 인식이 없기 때문이다.

결과는
Please enter any charecter : a

You typed : a
Please enter any charecter : b

You typed : b
Please enter any charecter : c

You typed : c
Please enter any charecter : $

이런식으로 나온다. 중간에 빈칸이 있는 이유는 getche()를 썼을땐 글자하나 입력하면 바로 입력하지만getchar()함수를 이용하면 엔터키를 입력하면 문자로 받아들이는 것을 안보이게하였지만  실제로는 존재하기 때문이다.

printf("\nYou typed : %c\n, ch);에서
%c때문에 a를 입력하면 아스키코드 'a'로 나타내지만
printf("\nYou typed : %d\n, ch);로 입력하면
'a'는 아스키 코드 표를 보면 97이기 때문에
Please enter any charecter : a

You typed : 97
Please enter any charecter :
로 나온다.

getchar();함수 입력한걸 주석처리 하게 되면
Please enter any charecter : a

You typed : 97
Please enter any charecter :
You typed : 10
Please enter any charecter :
으로 나온다. 10은 엔터키의 아스키코드기 때문이다.




'C 언어 > 임베디드 C' 카테고리의 다른 글

gdb 명령어  (0) 2011.04.13
무한 반복문  (0) 2011.04.13
for문(2)  (0) 2011.04.11
for문(1)  (0) 2011.04.11
while문의 무한반복  (0) 2011.04.07