라인 입출력 함수

언어로그/C/C++ 2011. 3. 27. 21:07



라인단위로 입출력을 다루는 함수들에 대해서 알아보자.  널문자를 삽입해주는지 여부와 버퍼에서 개행문자를
제거하는지 여부에 주목하여 보자. 


scanf(const char *TEMPLATE, ...)
scanf 함수를 사용하여, 한 라인의 문자열을 읽을 수 있지만, 개행문자를 표준입력버퍼에 남겨놓는다.  
연이은 읽기 동작에 오동작을 초래할 수 있기때문에, 입력버퍼에서 개행문자를 제거하는 것을 잊지 말자!



char* fgets(char *S, int COUNT, FILE *STREAM)
지정한 입력버퍼에서 최대 COUNT-1 개의 문자를 읽되, 엔터를 칠때까지  배열  S에 저장하는 함수이다. 
배열의 공간이 충분하다면, 개행문자와 함께 널문자를 삽입한다. (엔터에 의해 종료) 
하지만 공간이 충분하지 않다면,  COUNT-1개의 문자와 널문자를 삽입하고 종료한다. (사이즈 제약의 의해 종료)



int fputs(const char *S, FILE *STREAM)
버퍼 S의 내용을 지정한 출력버퍼에 출력하는 함수로, 널문자를 개행문자로 변환하지 않는다.  




fgets와 fputs 보다는 덜 사용되지만 라인단위로 입출력을 할 수 있는 다음과 같은 함수가 있다. 
char* gets(char *S)
표준 입력버퍼에서 개행문자를 만날 때까지 읽는 함수로,  개행문자는 S에 저장하지 않지만, 입력퍼버에서는 제거한다




int puts(const char *S)
S 문자열을 표준출력버퍼에 출력하는 함수로 널문자를 만나면 개행문자로 변환하여 출력한다. 

'언어로그 > C/C++' 카테고리의 다른 글

음수의 표현  (0) 2011.06.13
문자열 조작함수 직접 구현하기  (2) 2011.04.29
라인 입출력 함수  (0) 2011.03.27
배열의 이해  (0) 2011.03.27
기억부류(Storage Class) / 변수  (0) 2011.03.27
전역변수와 지역변수  (0) 2011.03.27

표준입출력함수 printf() / scanf()

언어로그/C/C++ 2011. 2. 22. 11:31



printf 와 scanf 는 포맷에 맞추어, 표준 입출력을 수행하는 함수, 이 함수들도 표준입출력 버퍼의

데이터를 다루는 함수들이다. printf 와 scanf 함수에 인자로 적절한 포맷을 지정하는 변환코드를 

지정해 줄 수 있다. 

 

변환코드

%c :  문자    

%d :  정수
%f  :  실수(단정도 - float)

%lf :  실수(배정도 -  double)

 

printf 함수에 변환코드를 좀더 세부적으로 표현해줄 수 있다.

printf  함수에 %nd (n은 양수) 은 최소 n 자리를 확보하라는 뜻이다.

int a = 12345;
a값을 다음과 같은 변환코드에 적용을 하면

 

  1. %8d    :   최소 8자리를 확보하여 출력한다.       >>   _ _ _ 1 2 3 4 5  가 출력됨.
  2. %3d    :   최소 3자리를 확보하지만, 더 큰자리수를 표현할수 잇다.    >> 12345
  3. %08d  :   최소 8자리를 확보하되, 빈칸은 0으로 표시한다. >>  0 0 0 1 2 3 4 5   
  4. %-8d  :    최소 8자리를 확보하되, 왼쪽칸 부터 채운다.    >>  1 2 3 4 5 _ _ _ 

 

 실수는 디폴트로 소수 6자리까지 표시를 한다.

double d = 123. 456

에 변환코드를 적용해보면,

  1. %f :디폴트로 소수 6번째 자리까지 표시한다. >>   1 2 3 . 4 5 6 0 0 0          
  2. %8.2f :       최소 8자리를 출력하되, 소수 2째 자리까지 표시  >> _ _  1 2 3 . 4 6           
    %08.2f :     최소 8자리 중, 소수 2째자리까지 표시하고 빈칸은 0으로 채움  >>     0 0 1 2 3 . 4 6   
  3. %.2f :  소수 2째자리까지 표시하고, 최소 자리수는 알아서 출력     >>    1 2 3 . 4 6   

  4. %o  : 8진수로 표현
    %0x : 16진수로 표현
  5. %%  : % 문자 자체 출력
  6. % s : 문자열 출력


정수를 8진수 16진수로 표현하기 

8진수 1자리수는 2진수 3비트에 해당하며, 16진수 1자리는 2진수 4비트에 해당한다.

 

int a = o73;

8진수 73을 2진수로 표현을 하면 0111 0011 로 표현할 수 있다.

 

int b = 0xf4;

16진수 64를 2진수로 표현하면 1111 0100 로 표현할 수 있다. 

scanf

Scanf : 표준 입력버퍼에서 지정한 서식에 맞게 읽어오는 함수로, 값을 저정할 메모리의 정확한 물리적인 주소를
              전달해야 한다. 통상 주소 연산자 &(엠퍼센트) 를 변수 앞에 두어 변수의 주소를 전달한다.

 

 

1234 (천이백삼십사) 라는 값을 입력받고 싶은 경우,  getchar() 함수는 한 문자를 반환하기 때문에
네 문자를 읽어서  적절한 정수형태로 변환을 해주어야 한다. 이러한 과정은 어렵진 않지만 번거로운 작업으로

 scanf 를 사용하여 편리하게 읽어올 수 있다. 

int a;
scanf("%d", &a);

 위 코드를 실행하여 1234를 입력했다고 가정하면,  sscanf

whitespace(공백, 탭, 엔터)를 만날 때까지 값을 읽어들이고, 변환코드에 지정한 형식으로 자동으로 변환하여
변수에 값을 담아준다. 

 

scanf 에서의 변화코드

scanf("%3d", &a);

scanf에서 변환코드는 printf 와는 다르게,  whitespace가 나올 때까지 읽되, 최대 3문자까지만 읽어들인다는 의미이다. 
즉 whitespace가 나오지 않더라도, 3문자까지 읽으면 더이상 버퍼에서 읽지 않는다는 것이다.

 

 scanf 에 변환코드를 여러개 주어 한번에 여러값을 읽어들일 수 있다. 

 

char ch;
int a;
float f;
double d;
 
scanf("%c %d %f  %d", &ch, &a, &f, &d);


scanf  사용시 주의사항

1) printf 에서는 float와 double형 데이터를 위해 %f 변환코드를 사용할 수 있었지만, scanf에서는
    반드시 float는 %f, double은 %lf 변환코드를 사용하여야 한다. 

2) %c 를 제외한 변환코드는 whitespace가 나올때까지 읽지만, %c는 whitespace 문자가 나올때까지 읽지만
    whitespace를 버퍼에 제거하지 않고 남겨두어 이후 오작동에 원인이 될수 있다. %c를 사용한 후 fflush(stdin)를

   사용하여 버퍼를 비워주는 것이 좋다.
3)  scanf("%d \n" , &a) 나 scanf("%d ", &a); 와 같이 변환코드 다음에 다른 문자가 있으면, 다른 변환코드가 있을거라

     가정하여 의도하지 않게 2번 입력해야 하는 경우가 발생하기 때문 포맷문자열에는 변환코드만을 사용한다. 


이 글은 스프링노트에서 작성되었습니다.