for문 (초기식과 증감식의 변형, 무한반복문)
//$를 누를 때 까지 키보드로부터 문자를 읽고 출력하는 프로그램
#include<stdio.h>
int main()
{
char ch;
int i;
printf("Please enter any character: ");
for(i=0;(ch=getchar())!='$';i++) // getch 대신 getchar를 사용했다.
{
printf("\nYou typed: %c\n",ch);
getchar(); // 예문에 없는 추가한 부분.
printf("Please enter any character: ");
}
putchar ('\n');
return 0;
}
⇒ 예제 p3_23에서는 #include<conio.h>를 추가로 호출해서 getchar 대신 getch를 사용하였다. 하지만 <conio.h>는 윈도우에서만 사용가능한 명령으로 linux에서는 쓸 수 없다. 따라서 getch 역시 linux에서는 쓸 수 없다.
⇒ getchar → 키보드에서 글자를 하나 읽어온다.(블록된다.) char를 get한다는 뜻.(즉, scanf와는 달리 한 개만 입력 받는다.)
getch → 비표준이다. <conio.h>는 윈도우에서만 지원한다. 따라서 linux 에서는 쓸 수 없으며 버퍼를 사용하지 않아 입력즉시 동작한다.(표준 C는 버퍼를 사용한다.)
※ getchar를 사용할 때 fflush(stdin)을 쓰면 getch와 같은 기능을 할 수도 있다.(역시 윈도우에서 가능, linux는 차이가 있다.)
⇒ getchar와 getch의 차이는 버퍼를 사용하느냐와 아니냐의 차이가 있다. 즉, 입력을 해도 getchar는 enter를 기다리고 버퍼를 사용하지 않는 getch는 바로 동작한다.
⇒ 위의 예문을 linux 환경에서 작성하고 컴파일 했기에 getch를 사용할 수 없으므로 getchar를 사용하였다.
⇒ 위에서 조건식의 getchar를 호출하면 키보드에서 한글자를 불러와 ch에 아스키 코드가 저장된다.(‘ ’는 정수를 뜻한다.) 입력받은 아스키 코드와 ‘$’의 아스키 코드를 비교해 값이 다르면 참이되어 for문의 내용을 실행하고 아니면 반복문을 빠져 나간다.
⇒ 반복문 안에 getchar()를 추가하지 않는다면 반복문 안의 명령이 for문을 거쳐 한번 더 실행된다. 왜냐면 enter가 버퍼에 남아있어 입력이 한 번 더 된 것과 같기 때문이다. %c 부분을 %d로 바꾸어 주면 아스키 코드 값이 출력되는데 반복문 사이 getchar를 넣지 않는다면 enter의 아스키 코드 값 10이 출력되는 것을 볼 수 있다.
- for 문 예제를 while 문으로 바꾸어 보는 실습.
for문 사용 |
while문 사용 |
#include<stdio.h> int main() { int i; for(i=1;i<=5;) { printf("%d\t",i++); } putchar('\n');
return 0; } |
#include<stdio.h> int main() { int i; i=1; while(i<=5) { printf("%d\t",i); ++i; } putchar('\n');
return 0; } |
⇒ for 문은 while 문으로 while 문은 for 문으로 바꾸어서 사용할 수 있다.
⇒ for 문에서 초기식과 증감식을 끄집어내어 증감식을 while 문내에 초기식을 while 문 앞에 선언하게 되면 위와 같이 같은 동작을 하는 소스가 된다.
#include<stdio.h>
int main()
{
int iNum=1;
for(;;) // for문 안을 무한히 반복한다.
{
printf("%d\n",iNum);
++iNum;
if(5<=iNum) // iNum이 5보다 작거나 같으면
{
break; // for문을 빠져나간다.
}
}
return 0;
}
⇒ for(;;)과 while(1)은 반복문을 무한히 반복하는 것을 뜻한다.
⇒ while문의 괄호안의 숫자는 0을 제외하면 참이다. 즉, 0을 제외한 어떠한 값을 넣더라도 무한반복문이 된다.
⇒ 무한 반복문 내에 위와 같이 break;를 사용하게 되면 반복에서 빠져나갈 수 있다.
'내장형 하드웨어 > C언어' 카테고리의 다른 글
포인터 변수의 변화, 주소 저장 방식 - Big Endian, little Endian (1) | 2011.04.15 |
---|---|
무한반복문, break, 포인터 (0) | 2011.04.14 |
VMware player 설치, 리눅스 명령어 (0) | 2011.04.11 |
for 문 - 초기식, 조건식, 증감식, volatile, 최적화 (0) | 2011.04.11 |
심블 테이블 (symbol table), while문, 디버깅, (0) | 2011.04.07 |