본문 바로가기

TIPS/C언어

[TIPS] 4th 20160714

4번째 강좌 정리입니다.


1. 표준입력함수

scanf(cons char *format [,argument]…);


예제 1)

int data =0;

scanf(“%d”,&data);


예제 2)

char name[100];

scanf(“%s”, name);

printf(“당신의 이름은 %s입니다.”, name); // 이 부분은 포인터와 배열을 배운 후면 이해가 갈 것이다. 


 scanfprintf와 같이 %를 사용한다. 변수 앞에 &가 들어가는건 주소를 뜻하는 것인데, 이 부분은 뒤의 포인터를 배우면서 자세히 다룬다.

 입력형식과 입력받을 변수의 형식이 같아야한다. 예시 1에서는 data가 int이기 때문에 %d를 사용하였고, 예시 2에서는 name[100]이 배열 (연결되면 문자열)이기 때문에 %s를 사용하였다.

 또 예를 들자면 %c 사용시에는 1바이트 변수가 와야한다.


※ scanf 함수 사용시 주의할 점.


아래와 같은 예제와 결과를 살펴보자.   



int형 변수 num에 scanf를 이용하여 값을 받도록 하였다.


1. 먼저 123이라는 정상적인 값을 입력하였을 때, 프로그램이 정상종료 됨을 알 수 있다.

2. 123abc 라는 숫자가 아닌 문자도 함께 입력을 하였다. 하지만 정상종료되었다.

3. abc라는 문자만을 입력하였다. 입력을 하자 계속해서 무한루프를 돌았다.


2번과 3번의 경우에 대해서 살펴보겠다.

2번은 123abc 중에 숫자에 해당하는 123만 입력받고 정상작동을 한다.

3번은 abc가 입력되었기 때문에 else의 incorrect age를 출력하게 되는데, num에는 여전히 abc라는 값이 저장되어 있기 때문에 계속해서 else문으로 들어가 반복하게 되는 것이다.


이에 대해 더 자세히 알아보겠다.


버퍼란 속도가 다른 두 장치의 속도차이 완화를 위한 메모리이다. '표준 입력 버퍼'에 사용자가 입력한 것이 저장된다.

처음보는 함수는 항상 도움말을 확인하는 습관을 가지자!

보통 scanf가 실패하게 되면 0을 반환한다. 따라서 scanf를 사용 후 반환값을 확인하는 작업을 꼭 해줘야한다. 표준입력버퍼에 값이 남아있으면 더이상 사용자로부터 값을 입력받지 않는다. 따라서 앞의 3번이 abc를 받아서 더이상 값을 받지 않고 계속 돌게되는 것이다.


표준 입력 버퍼를 초기화 하기 위해서는 


fflush(stdin);


을 사용해준다. (요즘꺼는 rewind를 사용한다.)


따라서 위의 예제는 다음과 같이 수정해줄 수 있다.


if(scanf("%d", &num)==0) {

fflush(stdin);

printf("Incorrect Age");

}else...




TIP!

만약 data type을 처음부터 unsigned로 정하면 


if(a>=0&&a<30)이라는 조건문을 if(a<30)으로 바꿀 수 있다.


i+2+3으로 적으면 두번 add연산을 하지만, 2+3+i로 적으면 한번의 명령을 수행한다. 이러한 습관을 들이는 것이 중요하다.



다시 scanf로 돌아와서,


1. scanf는 앞과 뒤의 데이터타입이 동일해야한다.

2. fflush나 rewind를 사용해 표준 입력 버퍼를 비워준다. 

3. scanf를 여러번 연속하여 사용할 때는, 스페이스(공백)을 입력의 구분으로 본다.

 이는 오동작이 많기 때문에 gets를 사용한다. 무조건 문자열로 입력받는 것이로, 보통은 리눅스같은 것이 아니면 잘 쓰지 않는다.


2. 변수의 종류


1. 지역변수

함수 안에 선언된 변수들로 함수와 생명주기를 같이하며 stack에 저장된다.

2. 전역변수

함수 밖에 선언된 변수들로 프로그램과 생명주기를 같이하며 data segment에 저장이 된다. 자동으로 0으로 초기화된다.

전역변수는 지역변수와 달리 C언어의 구조적인 성질이 깨지게 되므로 전역변수는 많이 사용하지 않는 것이 좋다.

참고로 전역변수는 다른 소스파일에서 extern키워드를 이용하여 참조가능하다.

3. 정적 변수 Static Variable

특정함수에서만 사용가능한 전역변수이다. static을 지역번수로 사용하게 되면 함수가 호출될 때마다 초기화되지 않고 이전의 값을 유지하게 된다.

4. 상수 변수 constant variable

const를 붙여 변수의 값을 변경할 수 없도록 한다. 이는 에러검출을 쉽게 하고 실수를 줄여주기 위한 문법으로, 실제로 기계어에는 반영되지 않는다.



3. 배열








www.tipssoft.com


'TIPS > C언어' 카테고리의 다른 글

[TIPS] 8th 20160728_(1)  (0) 2016.08.06
[TIPS] 6th 20160721_(1)  (0) 2016.07.23