Printf function

conversion specification: %d, %s등 %로 시작되는 placeholder. %뒤의 글자는 internal form(binary)에서 printed form(character)으로 변환되는 방법을 의미한다.

ex) %d: integer, %f: float


컴파일러는 다음을 체크해 주지 않는다.

- format string 안의 conversion specification과 output items의 갯수가 같은지

- conversion specifaction의 형식이 해당되는 변수와 적절하게 맞는지


conversion specification의 기본 형태

%m.pX

m, p: integer constatns(optional), X: a letter.

p가 생략되면 마침표도 생략. %.X와 같이 쓰면 p가 0으로 취급되는 것 같다


m: minimun field width. 출력될 최소한의 글자 개수. 만약 값을 출력하는 데 m보다 적은 글자가 필요하면, 우측 정렬됨.

%4d , 123 --> _123

%4d, 12345 --> 12345 (그대로 표시된다)

%-4d , 123 --> 123_ (m이 음수이면 좌측 정렬된다)


p: precision. 어떤 X를 선택하느냐에 따라 달라진다.

X: conversion specifier. 값을 출력할 때 어떤 변환을 적용하는지 지정한다.



X의 종류 몇 가지


d: 정수를 10진수 형태로 표시. p는 표시될 최소한의 숫자를 의미하며 필요하다면 숫자 0들이 앞자리에 붙음. p가 생략되면 p = 1. %d 와 %.1d는 동일한 의미.

e: floating-point(부동 소수점) number를 지수 형태로 표시. ex)[%e, 11.123 - > 1.112300e+01] p는 소수점 뒤에 숫자 몇개가 표시될지를 의미하며, 기본값은 6. p가 0이면 소수점 표시 안됨

f: floating-point number를 일반적으로 우리가 보는 소수 형태로 표시. p의 의미는 e에서와 같다.

g: floating-point number를 수의 크기에 따라 지수형태 또는 일반적인 소수 형태로 표시. p는 유효 숫자의 최대값. f와 달리 소수점 아래의 불필요한 0을 표시하지 않는다.

%g, 0.00000000123 --> 1.23e-09 

%e, 0.00000000123 --> 1.230000e-09

g는 아주 큰 값이나 아주 작은 값이 들어오면 지수형태로 바꿔서 더 적은 글자들로 숫자를 표현하게 해 준다.


escape sequence

\a: alert

\b: backspace

\n: new line

\t horizontal tab

"" 안에서 "를 쓸 때 - \", \문자를 쓸 때 - \\


Scanf Function

scanf 함수에서 integer를 읽으라고 요청 받았을 때

+또는-부호를 읽는다 -> 숫자가 끝날 때까지 숫자를 읽는다

floating-point number를 읽으라고 요청 받았을 때

1. a plus or minus sign(optional)

2. a series of digits(possibly containing a decimal point)

3. an exponent(optional). an exponent consists of the letter e(or E), an optional sign, and one or more digits


scanf("%d%d%f%f", &i, &j, &x, &y);

1-20.3-4.0e3\n

1    -20    .3    -4.0e3\n

둘중 어느것을 입력해도 결과는 같다. scanf 함수는 whitespace 문자는 무시하기 때문.

마지막 입력한 엔터키(\n)는 읽지 않고 'peek' 한다.

이 줄바꿈 문자는 다음번 scanf 함수를 호출할 때 읽어들이는 첫번째 문자가 된다.


format string에 whitespace가 아닌 다른 문자가 왔을 때는, 입력값에서 그 문자가 그대로 들어오기를 기대한다.

format string 이 "%d/%d"일 때

5_/_96 : 5는 입력이 되지만 96은 안 된다. /를 기대하는데 빈칸이 왔기 때문. _/_96은 다음 scanf함수로 넘겨진다.

___5/____96: 5, 96모두 제대로 입력된다.

(*underscore 문자는 빈칸을 나타냄)

그냥 format string에는 conversion specification 이외에는 아무것도 넣지 않는 것이 좋다.


%d와 %i의 차이: %d는 10진수 정수만 입력 가능하지만, %i는 8진수, 10진수, 16진수 형태로 입력 가능. 0x... ->16진수. %i를 사용했을 때 숫자 앞에 실수로 0을 집어넣으면 이상한 숫자가 나올수 있으므로, %d를 사용하는 것을 추천함



+ Recent posts