Subjects
1. νλ‘μ νΈ κ°μ
μ΄λ² νλ‘μ νΈλ stdio.h κΈ°λ³Έ λΌμ΄λΈλ¬λ¦¬μ ν¬ν¨λμ΄ μλ printf ν¨μμ μΌλΆ κΈ°λ₯λ€μ μ§μ ꡬννλ κ²μ΄λ€.
printfμ fλ formattedμ μ½μμ΄λ©°, μμνλ μΆλ ₯μ μ§μνλ€λ μλ―Έμ΄λ€.
printfμ λ§μ νλ μ€μμ flag νλμ -, 0, ., * κ·Έλ¦¬κ³ width λ° .precision νλ, type νλμ c, s, p, d, i, u, x, X, %λ§ κ΅¬ν νλ©΄λλ€.
μ€μ printfμ ν¨μμ λΉκ΅νλ©΄μ ꡬννλ€.
2. Printf Format Placeholder
printf ν¨μμ μΈμλ‘ μ£Όμ΄μ§λ μΌλ°μ μΈ λ¬Έμμ΄μ μΆλ ₯ μ€νΈλ¦Όμ κ·Έλλ‘ μ λ¬λμ΄ μΆλ ₯μ νκ² λμ§λ§, %λ‘ μμνλ Format Tag(νμ νκ·Έ)λ μΆκ° μΈμλ₯Ό λ°μ μΆλ ₯ μ€νΈλ¦Όμ μ΄λ»κ² μΆλ ₯ν΄μΌ ν μ§ κ°μ΄λλ₯Ό μ 곡νλ€. νμ νκ·Έλ %μ Format Specifier (μμ μ§μ μ)λ‘ κ΅¬μ±λμ΄ μμ μ§μ μμ λ°λΌ λ€μν ν΄μ λ°©μμ λνλΈλ€.
μλ μμλ₯Ό μ΄ν΄λ³΄λ©΄, %λ₯Ό μ μΈν λ¬Έμμ΄λ€μ κ·Έλλ‘ μΆλ ₯λλ€.
pritnf("Color %s, Number %d, Float %4.2f", "red", 123456, 3.14);
C
볡μ¬
1) Printf Format Placeholder Syntax
printf ν¨μμ Format Placeholder Syntax(μμ νκΈ° ꡬ문)μ %λ‘ μμνλ νμ νκ·Έλ‘ νκΈ° λλ©°, κ·Έ ꡬ문μ μλμ κ°λ€.
%[parameter][flags][width][.precision][length]type
C
볡μ¬
% λ€μ λνλλ μμ μ§μ μλ parameter, flags λ± νλμ λν λ€μν μ΅μ
μ λ°κ³ typeμ λ°λ ννμ΄λ€. μλμ νλμ λν μ΅μ
λ€μ μ€λͺ
μ νμΈνμ.
2) parameter (optional)
parameter νλλ POSIXμμμ C μΈμ΄μμλ§ μ΄μ© κ°λ₯νκ³ , C99μμμ C μΈμ΄μμλ μ΄μ©μ΄ λΆκ°λ₯ν νλμ΄λ€. νλμ μ£Όμ΄μ§ μ΅μ
κ°μ ν΅ν΄ ν¨μ νΈμΆμ λ겨 λ°μ μΈμλ€ μ€ λ¬Έμμ΄μ μ μΈν λ§€κ° λ³μλ₯Ό μ‘°μ’
ν μ μλ€. parameterμ κ°μ 1λΆν° μ΄μ©ν μ μλ€. 0λΆν° μ΄μ©νλ €κ³ νλ©΄ μλμ κ°μ μ€λ₯κ° λ°μνλ€.
Search
μλμ n$λ₯Ό μ¬μ©ν μμλ₯Ό λ³΄κ³ μ΄ν΄ν΄λ³΄μ.
#include <stdio.h>
int main(void)
{
printf("%2$d %2$#x; %1$d %1$#x", 16, 17);
return (0);
}
C
볡μ¬
μ½λλ₯Ό μ€νμν€λ©΄ μμ κ°μ κ²°κ³Όκ° λμ¨λ€.
μ°λ¦¬λ λ§€κ° λ³μλ₯Ό 2κ°λ§ λ°μμμλ 4κ°μ μΆλ ₯μ λ§λ€μ΄ λΌ μ μλ€. μμ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ μ λΆλΆμ %2$dμμ $λΌλ μ΅μ
μ μ΄μ©ν΄μ 2λ²μ§Έ λ§€κ° λ³μλ₯Ό λ°μμ€κ² λ€κ³ νμν κ²μ΄λ€. κ·Έλμ μ°λ¦¬λ λ§€κ° λ³μλ₯Ό 16, 17μ ννλ‘ λ°μμ§λ§, λμ€μ λ°μ λ§€κ° λ³μλ₯Ό λ¨Όμ μ¬μ©νλ― μμμ μκ΄μμ΄ μ΄ λ³μλ€μ μ¬μ©ν μ μλ κ²μ΄λ€. λν ν λΉλ λ§€κ° λ³μμ λν΄ μ€λ³΅μ¬μ©λ κ°λ₯νλ€. n$ μ΅μ
μ μ΄μ©νμ¬ μΆλ ₯ ν λ μ¬μ©νμ§ μμ λ§€κ° λ³μκ° μμ΄μ μ λλ€λ μ μ μ μν΄μΌ νλ€.
3) flags (optional)
λ€μν νλ μ€ κ°μ₯ μμ λμ€λ flagsλ(parameter νλλ POSIXμμλ§ λμνλ―λ‘ λ체μ μΌλ‘ flags νλκ° κ°μ₯ μμ λμ¨λ€κ³ λ³Έλ€.) μΆλ ₯μ μ 체 λ°©ν₯μ μ€μ νλ€. μμ μ§μ μμ flags λ¨λ
μΌλ‘ μ¬μ©λλ κ²½μ°λ μκ³ λ€λ₯Έ νλμ ν¨κ» μ¬μ©λλ κ²½μ°λ μλλ°, λ€λ₯Έ νλμ ν¨κ» μ¬μ©λλ κ²½μ° flagsμ μ΅μ
μ΄ μν₯μ λ°λ κ²½μ°κ° μλ€. λν flags νλμλ μ¬λ¬ μ΅μ
μ λμμ μ¬μ©ν μ μλ€.
Search
4) width (optional)
width νλλ λ¨μ΄ λ» κ·Έλλ‘ μΆλ ₯ λλΉλ₯Ό μ€μ νλ€. .precision νλμ μ΅μ
κ³Ό μ¬μ©λλ©΄ μ΅μ
κ°μ κ³ λ €νμ¬ λλΉ κ°μ μ μ©νλ€. (.precisionμμ μμΈν μ΄ν΄λ³΄μ.)
Search
μ΅μ
μΌλ‘ μ
λ ₯ν μ«μλ§νΌ λλΉλ₯Ό κ°μ§λ€. * κΈ°νΈλ₯Ό μ¬μ©νλ©΄ μΈμλ‘ λλΉλ₯Ό μ£Όμ΄μΌ νλ€. μλμ λ μ½λλ κ°μ μΆλ ₯μ λνλΈλ€.
printf("%*d", 5, 42);
printf("%5d", 42);
C
볡μ¬
λλΉ κ° < μ£Όμ΄μ§ κ°μ κΈΈμ΄
#include <stdio.h>
int main(void)
{
printf("%*d", 2, 100);
return (0);
}
C
볡μ¬
μ μ½λλ μ£Όμ΄μ§ λλΉ κ° 2λ₯Ό 무μνκ³ μλ κ° 100μ μΆλ ₯νλ€.
λλΉ κ° β₯ μ£Όμ΄μ§ κ°μ κΈΈμ΄
#include <stdio.h>
int main(void)
{
printf("%*d", 2, 1);
return (0);
}
C
볡μ¬
λ°λ©΄ μ μ½λλ λλΉ κ°μ λ§μΆ° μ°μΈ‘ μ λ ¬μ μννλ€.
5) .precision (optional)
.precisionμ μΆλ ₯νλ κ°μ μ νλ νκΈ°λ₯Ό μν νλμ΄λ€. λλΉλ₯Ό λνλ΄λ width νλ λ€μμΌλ‘ λνλλ νλμ΄κΈ° λλ¬Έμ ꡬλΆμ μν΄μ .μ νμμ μΌλ‘ μꡬλλ€. λ¨λ
μΌλ‘ . μ΄ μ΄μ©λκΈ°λ νλ©° .κ³Ό μ«μλ₯Ό μ‘°ν©νμ¬ μ¬μ©λκΈ°λ νλλ°, κ° κ²½μ°μλ λ°λ‘ λ€μ μ΄μ΄μ§λ type νλμ μ΅μ
μ λ°λΌμ μΆλ ₯μ΄ λ°λλ€. (μμμ λ°ν κ²κ³Ό κ°μ΄ width νλμ κ°μλ μν₯μ λ°κΈ° λλ¬Έμ, widthλ‘ μ£Όμ΄μ§ κ°κ³Ό .precisionμ μ£Όμ΄μ§ κ°μ μ μν΄μΌνκ³ , .precision λ€μ μ£Όμ΄μ§ type νλμ μ΅μ
μ΄ λ¬΄μμΈμ§μλ μ μν΄μΌ νλ€.)
Search
.μ΄ λ¨λ μΌλ‘ μ¬μ©λμ΄ typeμ λ°μ μμ
c, p
d, i, o, u, x, X
f, e, E, g, G, a, A
s, *s
.μ μ«μλ₯Ό λͺ μνμ¬ typeμ λ°μ μμ
c, p
d, i, o, u, x, X
f, e, E, g, G, a, A
s
6) length (optional)
length νλμ κ²½μ° type νλ μμ λΆμ΄ μμμ λν μλ£μ νμ μ§μ νλλ‘ νκ³ , μ§μ ν μλ£μ νμ ν΅ν΄ μΈμμ λν μ μ ν ν λ³νμ μνν μ μλλ‘ ν΄μ€λ€.
Search
μμ νμ μ£Όμ΄μ§ κ²κ³Ό κ°μ΄ type νλ μμ μ¬μ©λ μ΅μ
μ λ°λΌμ λ°μ μ μλ μΈμ νμ
(ν΄μλλ νμ
)μ΄ λ¬λΌμ§λ€. μλμ μλ₯Ό μ΄ν΄λ³΄μ.
type νλμ d μ΅μ
μμ hhλΌλ length μ΅μ
μ΄ λΆμΌλ©΄ signed charλ‘ μΈμνκ² λλ€. νμ§λ§ signed char λ²μ λ΄μ μλ κ°μ printfμ κ°λ³ μΈμμ λ£μ΄μ£Όλ©΄ μλμ κ°μ΄ κ²½κ³ κ° λ°μνλ κ²μ μ μ μλ€. (μ»΄νμΌ μ κ²½κ³ νμ©μ νμ§ μμΌλ©΄ μ»΄νμΌμ΄ λμ§ μλλ€.)
μ΄λ μ€λ₯κ° λ°μν λΆλΆμ 리ν°λ΄μ μ»΄νμΌλ¬κ° μλμΌλ‘ νμ
μ μΆμΈ‘νμ¬ intλ‘ ν΄μνκ³ , intλ₯Ό signed charμ ν λΉνλ € ν΄μ μκΈ°λ κ²½κ³ μ΄λ€. λ°λΌμ μλ μ½λλ₯Ό μ΄μ©νλ©΄ μ μμ μΌλ‘ μΆλ ₯ κ°μ νμΈν μ μλ€.
#include <stdio.h>
int main(void)
{
char ch;
ch = 99;
printf("%3.2hhd", ch);
return (0);
}
C
볡μ¬
lengthμ λλ¨Έμ§ μ΅μ
λ€ μμ μμ κ°μ΄ μμ©νκ² λλ€. μ£Όμ΄μ§ κ° νμ
μ λν΄ μ΄ν΄κ° μ κ°λ κ²μ΄ μλ€λ©΄ λ³λλ‘ μ°Ύμ보λλ‘ νμ. (intmax_t, uintmax_t, ptrdiff_t λ±)
7) type (required)
νμ λ¬Έμμ΄μλ μΌλ° λ¬Έμμ΄μ ν¬ν¨νμ¬ μ¬λ¬ νμ νκ·Έλ€λ‘ μ΄λ€μ Έ μμΌλ©°, νμ νκ·Έλ %μ μμ μ§μ μλ‘ κ΅¬μ±λλ€. %λ₯Ό μ μΈν λλ¨Έμ§ νλλ€μ λͺ¨λ ν¬ν¨νμ¬ μμ μ§μ μλΌκ³ νλλ°, type νλλ %μ λλΆμ΄ νμ νκ·Έμ μμ΄μλ μ λλ νλμ΄λ―λ‘ type νλλ₯Ό μμ μ§μ μλ‘ λ³΄κΈ°λ νλ€.
printfλ‘ μΆλ ₯ν μ΄λ€ κ°μ΄ μ£Όμ΄μ‘μ λ, type νλμ μ£Όμ΄μ§ μ΅μ
μ λ°λΌμ κ·Έ κ°μ μ΄λ»κ² ν΄μν μ§ λ¬λΌμ§λ€.
μ μλ₯Ό μΆλ ₯ν λλ %dλ‘, μ€μλ₯Ό μΆλ ₯ν λλ %fλ‘ μΆλ ₯μ νλ κΈ°μ΅ λμ type νλλ μλ£μ νμ
κ³Ό κ΄λ ¨μ΄ μλ€κ³ μκ°νλ κ²½μ°κ° λ§λ€. νμ§λ§ length νλμ λν μ€λͺ
μ ν΅ν΄μ μ μ μλ―μ΄ μλ£μ νμ
μ length νλμ κ΄λ ¨μ΄ μλ€. length νλλ₯Ό λΉμλκ³ %d, %fλ₯Ό μ΄μ©νμμλ μ μ, μ€μλ₯Ό νμ
μ λ°λΌ μ λλ‘ μΆλ ₯ν μ μλ μ΄μ λ type νλ μμ length μ΅μ
μ΄ μ£Όμ΄μ§μ§ μμ κ²½μ°μ κ° type μ΅μ
μ λν κΈ°λ³Έ μ€μ κ°μΌλ‘ κ·Έ νμμ ν΄μνκΈ° λλ¬Έμ΄λ€. μ΄λ₯Ό ν΅ν΄ μ μ μλ κ²μ type νλλ μλ£μ νμ
μ λν ν΄μμ΄ μλλΌ μΆλ ₯ νμμ λν ν΄μμ μννλ€λ κ²μ΄λ€.
μλ₯Ό λ€μ΄, 10μ΄λΌλ κ°μ 10μ§μλ‘ ν΄μνλ©΄ 10, 8μ§μλ‘ ν΄μνλ©΄ 012, 16μ§μλ‘ ν΄μνλ©΄ 0xAμ κ°μλ° μ΄μ κ°μ΄ ν΄μνμ¬ μΆλ ₯νλ κ²μ printfμ type νλκ° λμμ€λ€.
Search
d μ΅μ κ³Ό i μ΅μ μ μ°¨μ΄
d μ΅μ
κ³Ό i μ΅μ
μ λͺ¨λ Signed Decimal Integerλ‘ λΆνΈμλ 10μ§ μ μλ‘ ν΄μνλ€. λ μ΅μ
μ λν΄μ printfλ₯Ό μ΄μ©ν μΆλ ₯μμλ μ°¨μ΄κ° μλ€λ κ²μ μλ μ½λλ₯Ό ν΅ν΄ μ΄ν΄ν μ μλ€.
#include <stdio.h>
int main(void)
{
printf("%d\n", -42);
printf("%d\n", -052);
printf("%d\n", -0x2a);
printf("%d\n", -0x2A);
printf("%i\n", -42);
printf("%i\n", -052);
printf("%i\n", -0x2a);
printf("%i\n", -0x2A);
return (0);
}
C
볡μ¬
νμ§λ§ λ μ΅μ
μ scanfλ₯Ό μ΄μ©ν μ
λ ₯μμ μ°¨μ΄κ° μλ€. scanfμμμ d μ΅μ
μ λΆνΈκ° μλ 10μ§ μ μλ₯Ό μ
λ ₯μΌλ‘ λ°μ§λ§, scanfμμμ i μ΅μ
μ λΆνΈκ° μλ 8μ§, 10μ§, 16μ§ μ μλ₯Ό μ
λ ₯μΌλ‘ λ°μ μ μλ€. λ¨, i μ΅μ
μΌλ‘ μ
λ ₯μ λ°μ λλ νΉμ νμμ λ§μΆ°μ£Όμ΄μΌ νλ€. μλ μ½λλ₯Ό μ€νν΄μ λμΌν μ«μλ₯Ό μ§μ νμμ λ§μΆ°μ μ€νν΄λ³΄λ©΄ d μ΅μ
κ³Ό i μ΅μ
μ κ²°κ³Όκ° λ€λ₯Έ κ²μ μ μ μλ€.
hyeonsokλ κ°μ¬ν©λλ€ 
#include <stdio.h>
int main(void)
{
int num;
printf("=== test %%d ===\n");
printf("10μ§μ: ");
scanf("%d", &num);
printf("%d\n", num);
printf("8μ§μ : ");
scanf("%d", &num);
printf("%d\n", num);
printf("16μ§μ: ");
scanf("%d", &num);
printf("%d\n", num);
while (getchar() != '\n')
continue ;
printf("=== test %%i ===\n");
printf("10μ§μ: ");
scanf("%i", &num);
printf("%i\n", num);
printf("8μ§μ : ");
scanf("%i", &num);
printf("%i\n", num);
printf("16μ§μ: ");
scanf("%i", &num);
printf("%i\n", num);
return (0);
}
C
볡μ¬
f μ΅μ κ³Ό F μ΅μ μ μ°¨μ΄
f μ΅μ
κ³Ό F μ΅μ
μ ν λΉλ κ°μ 10μ§μ νκΈ°λ²μ μ¬μ©ν μ€μλ‘ ν΄μνλ€. μ΄μ λν΄ μ΄μ°¨νΌ μ«μλ‘λ§ ν΄μνκ² λμ΄ μλλ° μ΅μ
μ λλ¬Έμ μλ¬Έμ ꡬλΆμ λ νμκ° μλμ§ μλ¬Έμ΄ λ€ μ μλ€.
#include <stdio.h>
int main(void)
{
printf("val : %f\n", -123.456);
printf("val : %F\n", -123.456);
return (0);
}
C
볡μ¬
μ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ λλ¬Έμμ μλ¬Έμ μ΅μ
κ΅¬λΆ μμ΄ λμΌν κ°μ΄ μΆλ ₯λλ κ²μ λ³Ό μ μλλ°, κ·Έλ λ€λ©΄ μ€μμ λν 10μ§μ νκΈ°λ₯Ό μ΄μ§Έμ fμ Fλ‘ κ΅¬λΆμ ν΄λμμκΉ?
Linux Manualμ λ°λ₯΄λ©΄ μλμ κ°μ΄ λ μ΅μ
μ λν μ°¨μ΄λ₯Ό μ€λͺ
ν΄λ κ²μ λ³Ό μ μλ€.
SUSv2 does not know about F and says that character string representations for infinity and NaN may be made available. SUSv3 adds a specification for F. The C99 standard specifies "[-]inf" or "[-]infinity" for infinity, and a string starting with "nan" for NaN, in the case of f conversion, and "[-]INF" or "[-]INFINITY" or "NAN" in the case of F conversion.
μ¦, νν κ°λ₯ν λ²μ λ°μ μλ€μ νν κ°λ₯ν μλ€λ‘ μ μνμ¬ ν΄λΉ κ°μ μΆλ ₯νλ € ν λ μνλ²³μΌλ‘ μΆλ ₯νκΈ° λλ¬Έμ μ΅μ
μ λμλ¬Έμ μ°¨μ΄λ₯Ό λ κ²μ΄λΌκ³ λ³Ό μ μλ€. κ° μ΅μ
μ μ΄μ©νμ λλ μλμ κ°μ΄ μΆλ ₯λλ©°, λκ΄νΈμ μλ―Έλ Optionalνλ€λ μλ―Έμ΄λ€.
f μ΅μ
: , ,
F μ΅μ
: , ,
νμ§λ§ Visual Studioμ Dev C++μμλ type νλμ F μ΅μ
μ νμ©νμ§ μλλ€κ³ νλ€.
νν κ°λ₯ λ²μ λ°μ μλ€
νν κ°λ₯ λ²μ λ°μ μλ€μ 3κ°μ§κ° μλ€.
1. Denormalized Number
2. Infinity
3. NaN (Not a Number)
κ° μλ€μ΄ μ μ‘΄μ¬νλμ§, μ΄λ»κ² μ§μλΆμ κ°μλΆλ₯Ό ꡬμ±νμ¬ λ©λͺ¨λ¦¬μ μ¬λΌκ°λμ§ κΆκΈνλ€λ©΄ μλ λ§ν¬λ₯Ό μ°Έκ³ νμ.
κ³Όνμ κΈ°μλ² (Scientific Notation)μ΄λ?
κ³Όνμ κΈ°μλ²μ΄λΌκ³ νλ Scientific Notationμ μ§μ νκΈ°λ² (Exponent Notation), κ°μ νκΈ°λ² (Mantissa Notation)κ³Ό λμμ΄μ΄λ€.
10μ λ°°μλ‘ λ§μ 0μ νκΈ° ν΄μΌνλ κ²½μ°, κ·Έ νκΈ°κ° κΉλ€λ‘κΈ° λλ¬Έμ μ§μ (e)λ₯Ό μ¬μ©νμ¬ νκΈ°νλ λ°©μμ λ§νλ€.
ex)
n μ΅μ
n μ΅μ
μ κ²½μ° μ¬λ¬ μ΅μ
λ€ μ€μ κ°μ₯ νΉμ΄νκ² λμνλ€. n μ΅μ
μ n μ΅μ
μ΄ μ μ©λκΈ° μ κΉμ§μ μΆλ ₯λ λ¬Έμ κΈΈμ΄λ₯Ό μΈ‘μ νμ¬ κ°λ³ μΈμμ μ£Όμ΄μ§ λ³μμ ν λΉνκ² λλ€. μ¦, μΌλ°μ μΌλ‘ μΆλ ₯μ μ¬μ©λλ μ΅μ
μ΄ μλκΈ° λλ¬Έμ λ€λ₯Έ μ΅μ
λ€κ³Ό μ°¨μ΄κ° μμμ μ μ μλ€. μλμ μ½λλ₯Ό μ΄ν΄λ³΄μ.
n μ΅μ
μ κΈ°λ³Έ ν λΉ νμ
μ int *μ΄λ―λ‘ int λ³μμ μ£Όμλ₯Ό λκΈ΄ κ²μ νμΈν μ μλ€. λ§μΌ λ€λ₯Έ νμ
μ λ³μμ μ£Όμλ₯Ό λ겨 ν λΉ λ°κ³ μΆλ€λ©΄, ν΄μμν€κ³ μΆμ lengthμ μ΅μ
μ n μ΅μ
μμ νκΈ°νλλ‘ νλ€.
#include <stdio.h>
int main(void)
{
char len;
printf("hello init 6!%hhn\n", &len);
printf("length : %hhd", len);
return (0);
}
C
볡μ¬
% κΈ°νΈ μΆλ ₯
νμ λ¬Έμμ΄μ μ΄μ©ν λλ % κΈ°νΈλ₯Ό μ΄μ©νμ¬ νμ νκ·Έμ μμμμ μλ¦¬κ² λλ€. λ°λΌμ %λ μΌλ°μ μΈ λ¬Έμκ° μλκΈ° λλ¬Έμ, λ¨μν printfλ₯Ό μ΄μ©νμ¬ κΈ°νΈλ₯Ό μΆλ ₯νλ € νλ©΄ μλμ κ°μ΄ κ²½κ³ λ¬Έκ΅¬λ₯Ό λμ°λ©΄μ μ»΄νμΌμ΄ λμ§ μλ κ²μ λ³Ό μ μλ€.
μΌλ°μ μΌλ‘ νΉμν λ¬Έμλ€μ Escape SequenceλΌκ³ νμ¬ \λ₯Ό μ΄μ©νμ¬ μΆλ ₯νκ³€ νλλ°, % κΈ°νΈλ \λ₯Ό μ΄μ©νμ¬ μΆλ ₯ν μ μλμ§ νμΈν΄λ³΄μ. μλ κ·Έλ¦Όμ 보면 μ¬μ ν κ²½κ³ λ¬Έκ΅¬λ₯Ό λμ°λ©΄μ μ»΄νμΌμ λ§λ λͺ¨μ΅μ νμΈν μ μλ€.
% κΈ°νΈλ₯Ό μΆλ ₯νκΈ° μν΄μ \λ‘λ μΆλ ₯ν μ μκ³ μ€λ‘μ§ % κΈ°νΈλ₯Ό μ΄μ©ν΄μλ§ μΆλ ₯ν μ μλ€. % κΈ°νΈ μΆλ ₯μ μν΄ % κΈ°νΈλ₯Ό μ΄μ©νλ€λ κ²μ % κΈ°νΈ μμλ μ¬λ¬ νλλ€μ λ€μν μ΅μ
μ μ¬μ©ν μ μλ€λ κ²μ μλ―Ένλ€.
μλμ κ°μ΄ flagμ μ΅μ
μΌλ‘ 0μ μ£Όκ³ widthμ μ΅μ
μΌλ‘ 5λΌλ κ°μ μ£Όλ©΄ 5μ리μ λλΉλ‘ %λ₯Ό μΆλ ₯νκ³ λΉ μ리λ 0μ μ±μ°λ κ²μ νμΈν μ μλ€.
#include <stdio.h>
int main(void)
{
printf("%05%");
return (0);
}
C
볡μ¬
κ·Έλ λ€λ©΄ μ κΉ μκ°λμλ \λ‘ μΆλ ₯ν μ μλ λ¬Έμλ€μ μ΄λ€ λ¬Έμλ€μ΄ μμκΉ? λ€μ νλͺ©μμ Escape Sequenceμ λν΄ μμ보μ.
8) Escape sequence (Not a Field, String of Characters)
μΌλ°μ μΌλ‘ νΉμν λ¬Έμλ€μ Escape SequenceλΌκ³ νμ¬ \λ₯Ό μ΄μ©νμ¬ μΆλ ₯νκ² λλ€. \λ₯Ό ν¬ν¨ν λ¬Έμλ printf ν¨μλ₯Ό μ΄μ©νμ¬ μΆλ ₯ν λ νΉμ λ¬Έμλ₯Ό μ§μΉνκ±°λ νΉμ κΈ°λ₯μ μννκ² λλ€.
Search
3. Variable Argument
1) Variable Argument (κ°λ³ μΈμ)λ?
C μΈμ΄μμ ν¨μλ₯Ό μ¬μ©νλ€λ³΄λ©΄ λ§€κ° λ³μμ κ°μκ° μ ν΄μ Έμμ§ μμ ν¨μκ° μλ€. μμμ λ°°μ΄ printfλ μν©μ λ°λΌ μνλ λ§νΌμ μΈμλ₯Ό λ°μμ μ¬μ©ν μ μλ€. μ΄λ κ² μν©μ λ°λΌ ν¨μμ μΈμμ κ°μκ° λ€λ₯΄κ² ν λΉλμ΄λ μ²λ¦¬ν μ μκ² ν΄μ£Όλ κ²μ΄ κ°λ³ μΈμμ΄λ€.
λ§€ν¬λ‘ ν¨μλ?
μΌλ° ν¨μμλ λ¬λ¦¬ λ¨μ ν
μ€νΈ μΉνλ§μ ν΄μ€λ€. λ°λΌμ μ¬λ¬ λͺ
λ Ήλ¬Έμ λμμ ν¬ν¨ν μ μλ€.
ν¨μ νΈμΆ ꡬ문과 λΉμ·νκ² μμ±νλλΌλ μ€μ λ‘λ ν¨μ νΈμΆμ νμ§ μμΌλ―λ‘ ν¨μ νΈμΆ ꡬ문과 λΉκ΅νμ λλ μ±λ₯μ΄ μ‘°κΈ λ μ’μ νΈμ΄λ€. νμ§λ§ λ§€ν¬λ‘ ν¨μμμλ μΈμμ νμ
μ κ³ λ €νμ§ μκΈ° λλ¬Έμ μλνμ§ μμ μ¬λ¬ μ€λ₯κ° λ°μν μλ μμ΄ μ£Όμνμ¬ μ¬μ©ν΄μΌ νλ€.
2) Variadic Function Format
κ°λ¨ν μλ‘ κ°λ³ μΈμλ₯Ό κ°μ§λ ν¨μ μνκ³Ό νΈμΆ λ°©λ²μ μλμ κ°λ€.
#include <stdarg.h>
void function(int args, ...)
{
//fuction body
}
int main(void)
{
function(42, /* μνλ λ§νΌ μΈμ μ
λ ₯ */);
return (0);
}
C
볡μ¬
κ°λ³ μΈμλ₯Ό ν¬ν¨ν ν¨μμλ λ μ’
λ₯μ μΈμκ° μꡬλλ€.
β’
νμ μΈμ
β’
μ νμ μΈμ
μ¬κΈ°μ λ§ν μ νμ μΈμλ κ°λ³ μΈμμΈλ°, κ°λ³ μΈμλ₯Ό λ°κΈ° μν΄μ μ¬μ μ νμ μΈμκ° λ¬΄μ‘°κ±΄ μꡬλλ€. μ νμ μΈμμΈ κ°λ³ μΈμλ λ§ κ·Έλλ‘ μΈμμ μκ° μ ν΄μ Έ μμ§ μκΈ° λλ¬Έμ μ νμ μΈμλ₯Ό λ¨Όμ λ°κ² λλ©΄ ν¨μμ μνμμ μ΄λ μΈμλ₯Ό νμ μΈμλ‘ λ°μ κ²μΈμ§ μ μ μκΈ° λλ¬Έμ, νμ μΈμλ₯Ό λ¨Όμ λ°μ λ€μ μ νμ μΈμλ₯Ό λ°λ κ²μ μμΉμΌλ‘ νλ€.
μ νμ μΈμλ ...μΌλ£ νμνλ©° μμμ λ°ν κ²μ²λΌ νμ μΈμμ μ νμ μΈμμ μμκ° μ€μνκΈ° λλ¬Έμ μ νμ μΈμ λ€μλ λ€λ₯Έ λ§€κ° λ³μλ₯Ό λ μ μλ€. λν νμ μΈμ λ§ κ·Έλλ‘ κ°λ³ μΈμκ° μλ νλ μ΄μμ μΈμλ₯Ό λ°λμ νμλ‘ νλ€. μλ ν¨μμ μνμμ argκ° νμ μΈμλ₯Ό μλ―Ένλ€.
T function(T args, ...);
C
볡μ¬
pritnf ν¨μμ κ²½μ°λ₯Ό μ΄ν΄λ³΄μ.
printf("i'm %d years old.\n you are %d years old.\n", age1, age2);
C
볡μ¬
μ΄ κ²½μ°μ ""(Double Qoute)λ‘ λ¬Άμ¬μ§ λ¬Έμμ΄ λΆλΆμ΄ νμ μΈμκ° λλ κ²μ΄κ³ age1 μ΄ν age2κΉμ§κ° λ°λ‘ μ νμ μΈμκ° λλ κ²μ΄λ€. μΌλ°μ μΌλ‘ νμ μΈμλ‘ μ£Όμ΄μ§λ μΈμλ€ μ€ νλλ μ νμ μΈμλ₯Ό λͺ κ° λ°μλμ§ λͺ
μνμ¬ μ νμ μΈμλ€μμ μ μ§ μ νΈλ₯Ό μ°Ύμ μ μκ² ν΄μ€λ€.
κ°λ³ μΈμλ₯Ό ν¬ν¨ν ν¨μλ₯Ό μ΄μ©νκΈ° μ μ λ§€ν¬λ‘μ λν΄ λ¨Όμ μμ보μ.
3) C Variadic Macros
C μΈμ΄μμ κ°λ³ μΈμλ₯Ό κ°μ§λ ν¨μλ₯Ό μ¬μ©νκΈ° μν΄μ μλμ λ§€ν¬λ‘λ₯Ό νμ©νλ€.
va_list // κ°λ³ μΈμ λͺ©λ‘
va_start // κ°λ³ μΈμλ₯Ό κ°μ Έμ¬ μ μλλ‘ κ°λ³ μΈμ μμ μ£Όμ μ°Έμ‘°νλ ν¬μΈν° μ€μ
va_arg // κ°λ³ μΈμλ₯Ό μ°Έμ‘°νλ ν¬μΈν°λ₯Ό ν΅ν΄ μμ°Έμ‘° ν, ν΄λΉ λ°μ΄ν°μ ν¬κΈ°λ§νΌ λ°μ΄ λ€μ μΈμλ₯Ό μ°Έμ‘°
va_end // κ°λ³ μΈμλ₯Ό λͺ¨λ μ²λ¦¬ ν, κ°λ³μΈμλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°λ₯Ό NULLλ‘ μ΄κΈ°ν
va_copy // κ°λ³ μΈμ λͺ©λ‘μ 볡μ¬
C
볡μ¬
μμ λ§€ν¬λ‘λ€μ stdarg.hμ μ μλμ΄ μκΈ° λλ¬Έμ ν€λλ₯Ό μΆκ°ν΄μ€μΌ μ΄μ©ν μ μλ€.
μ΄μ μλ varargs.hκ° μ¬μ©λμμ§λ§ λμ΄μ μ¬μ©μ κΆμ₯νμ§ μλλ€. stdarg.hλ C89 νμ€λΆν° μΆκ°λ ν€λ νμΌμ΄λ€. C++μμλ cstdarg ν€λ νμΌμ΄ μ¬μ©λλ€.
#include <stdarg.h>
C
볡μ¬
λ§€ν¬λ‘λ₯Ό νμ©ν ν¨μλ₯Ό 보면μ κ°λ³ μΈμλ₯Ό μ²λ¦¬νλ κ³Όμ μ μμ보μ. μλμ μμ±λ sumAllμ΄λΌλ ν¨μλ κ° μΈμλ‘ λ€μ΄μ¨ μ μλ₯Ό λͺ¨λ λν΄μ κ²°κ³Όλ₯Ό μΆλ ₯νλ ν¨μμ΄λ€.
#include <stdio.h>
#include <stdarg.h>
void sumAll(int args, ...)
{
int result;
int tmp;
// Part 1
va_list ap;
result = 0;
// Part 2
va_start(ap, args);
for (int i = 0 ; i < args ; i++)
{
// Part 3
tmp = va_arg(ap, int);
result += tmp;
printf("%d", tmp);
if (i == args - 1)
break;
printf(" + ");
}
printf(" = %d\n", result);
// Part 4
va_end(ap);
}
int main(void)
{
sumAll(1, 10);
sumAll(2, 10, 20);
sumAll(3, 10, 20, 30);
sumAll(4, 10, 20, 30, 40);
sumAll(5, 10, 20, 30, 40, 50);
return (0);
}
C
볡μ¬
Part 1: va_list
va_list ap;
C
볡μ¬
κ°λ³ μΈμ λͺ©λ‘λ₯Ό μλ―Ένλ©°, κ°λ³ μΈμμ μ£Όμλ₯Ό λ΄μ μ μλ ν¬μΈν° λ³μμ΄λ€. κ΄μ΅μ μΌλ‘ apλΌλ μ΄λ¦μ μ¬μ©ννλ€. va_listμ νμ
μ typedefλ₯Ό ν΅ν΄ λ΄λΆμ μΌλ‘ char *λ‘ μ μλμ΄ μλ€.
Part 2: va_start
va_start(ap, args);
C
볡μ¬
va_startλ μμμ μ μΈν va_list νμ
μ apλ₯Ό μ΄κΈ°ν ν΄μ£Όλ λ§€ν¬λ‘μ΄λ€. va_startλ₯Ό ν΅ν΄ 첫 λ²μ§Έ κ°λ³ μΈμμ μ£Όμλ₯Ό apκ° μ°Έμ‘°ν μ μλλ‘ λ§λ€μ΄μ€λ€. μ μ λμ΄ μλ ννλ Microsoft Visual Studio κΈ°μ€μΌλ‘ μλμ κ°λ€.
#define va_start(ap, v) ( (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
C
볡μ¬
β’
_ADDRESSOF(v) => &(v)
β’
_INTSIZEOF(v) => ( (sizeof(v) + sizeof(v) - 1) & ~(sizeof(int) - 1) )
va_startλ λ§μ§λ§ νμ μΈμλ₯Ό λ§€κ° λ³μλ‘ λ£κΈ°λ§ νλ©΄ μλμΌλ‘ κ°λ³ μΈμμ μμ μ£Όμλ₯Ό κ³μ°νμ¬ apμ ν λΉν΄μ£Όλ μν μ μννλ€.
μ£Όμ΄μ§ νμ μΈμλ€ μ€ λ§μ§λ§ νμ μΈμμΈ vμ ν¬κΈ°λ₯Ό μ¬κ³ , vμ μμ μ£Όμμμ vμ ν¬κΈ°λ§νΌμ λνμ¬ κ°λ³ μΈμμ μμ μ£Όμλ₯Ό ꡬν μ μκ² ν΄μ€λ€. κ·Έλ¦¬κ³ κ°λ³ μΈμμ μμ μ£Όμλ₯Ό apμ ν λΉν΄μ£Όλλ°, μ΄ λͺ¨λ κ²λ€μ΄ va_startλ₯Ό ν΅ν΄ μ΄λ€μ§λ€.
vμ μ£Όμμμ vμ ν¬κΈ°λ₯Ό λν κ²μ΄ κ°λ³ μΈμμ μμ μ£Όμκ° λλ μ΄μ λ, ν¨μμ νΈμΆμ ν΅ν΄ λμ΄μ¨ μΈμλ€μ μΌλ ¨μ λ©λͺ¨λ¦¬ 곡κ°μ μ°¨μ§νλ ννλ₯Ό κ°κΈ° λλ¬Έμ΄λ€.
Part 3: va_arg
tmp = va_arg(ap, int);
C
볡μ¬
va_argλ va_listκ° μ°Έμ‘°νκ³ μλ νΉμ κ°λ³ μΈμλ₯Ό μμ°Έμ‘°νκ³ , va_listλ΄μ λ€μ κ°λ³ μΈμλ₯Ό μ°Έμ‘°νλλ‘ ν΄μ£Όλ λ§€ν¬λ‘μ΄λ€. λ€μ κ°λ³ μΈμλ₯Ό μ°Έμ‘°νλλ‘ λ§λ€ λλ sizeof(type)λ§νΌ λ€μμ μλ κ°μ μ°Έμ‘°νλλ‘ λ§λ λ€. μμ κ²½μ°λ sizeof(int)λ§νΌ λ€μμ μλ κ°μ μ°Έμ‘°νλλ‘ λ§λ λ€κ³ 보면λλ€.
μ κ³Όμ μ μλμ κ°μ λ§€ν¬λ‘λ₯Ό ν΅ν΄ μ΄λ€μ§λ€.
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
C
볡μ¬
va_listμ κ°λ³ μΈμλ₯Ό μμ°Έμ‘°νκ³ λ€μ κ°λ³ μΈμλ₯Ό κ°λ¦¬ν€λλ‘ λ§λλ μ°μ°μ μμΈν 보면, λμ
μ°μ°μλ₯Ό ν΅ν΄ νΉμ νμ
μ ν¬κΈ° λ§νΌ λ¨Όμ λ°μ΄μ λ€μ κ°λ³ μΈμλ₯Ό κ°λ¦¬ν€λλ‘ λ§λ€μ΄ λμ ν λ€μ κ·Έ νΉμ νμ
μ ν¬κΈ°λ§νΌμ λΉΌμ νμ¬ μ°Έμ‘°νκ³ κ°λ³ μΈμλ₯Ό μμ°Έμ‘° ν μ μλλ‘ λ§λ€μ΄ λ κ²μ λ³Ό μ μλ€.
_INTSIZEOF(t)λ§νΌ λν΄λκ³ _INTSIZEOF(t)λ§νΌ λ€μ λΊ κ°μ t * νμ
μ ν¬μΈν° λ³μλ₯Ό μμ°Έμ‘°ν κ²μ λ³Ό μ μλ€.
for ꡬ문μΌλ‘ μμ±ν λ°λ³΅λ¬Έμ κ·Έλ¦Όμ ν΅ν΄ μ΄ν΄λ³΄μ.
char, short μ κ²½μ°μλ intλ‘ λμ μ°κ³ , floatμ κ²½μ°μλ doubleλ‘ λμ μ΄ μ΄ν ν λ³νμ ν΄μ£Όμ΄μΌ νλ€.
μ΄μ²λΌ μννλ μ΄μ λ λ©λͺ¨λ¦¬μ νΉμ κ°μ΄ μ°μΌ λλ μ£Όμ μ²΄κ³ λ¨μλ‘ κΈ°λ‘μ νκΈ° λλ¬Έμ΄λ€. μ΄λ₯Ό ν΅ν΄ Byte Padding ν¨κ³Όκ° μΌμ΄λμ 32 λΉνΈ μ£Όμ 체κ³λ₯Ό κΈ°μ€μΌλ‘ 4 λ°μ΄νΈ μλμ νμ
λ€μ 4 λ°μ΄νΈμΈ intλ‘ μ²λ¦¬ ν, κ°μμ νμ
μΌλ‘ ν λ³ν νμ¬ κ°μ μ½μ΄λ΄λ κ²μ΄λ€.
ex) char ch = (char)va_arg(ap, int);
Part 4: va_end
va_end(ap);
C
볡μ¬
κ°λ³ μΈμ λͺ©λ‘μ μ§μΉνλ va_list νμ
μ ν¬μΈν° λ³μλ₯Ό NULLμ ν λΉνλ©΄μ κ°λ³ μΈμ μ¬μ©μ λλΌ λ μ¬μ©νλ€. μλ λ§€ν¬λ‘λ₯Ό 보면 va_list νμ
μΌλ‘ ν λ³ν ν 0μ λ£μ΄μ£Όλ κ²μ λ³Ό μμλ€. μ¬κΈ°μμ 0μ NULLμ μλ―Ένλλ°, va_argλ₯Ό μ¬μ©νμ¬ νΉμ λ©λͺ¨λ¦¬ 곡κ°μ μ°Έμ‘°νκ³ μλ ν¬μΈν°μ NULLμ ν λΉνμ¬ μ°Έμ‘°νλ 곡κ°μ΄ μλλ‘ λ§λ λ€.
#define va_end(ap) ( ap = (va_list)0 )
C
볡μ¬
μ λ§€ν¬λ‘λ μ€μ λ‘ μμ΄λ νλ‘κ·Έλ¨μ μ§μ₯μ΄ μλ€. μΈν
κ³μ΄μ CPUμμλ va_endκ° μ무 μΌλ νμ§ μλλ€κ³ νλ€. νμ§λ§ λ€λ₯Έ νλ«νΌκ³Όμ νΈνμ±μμ μ€μν μν μ ν μ μμΌλ―λ‘ κ΄λ‘μ μΌλ‘ λ£μ΄μ€λ€. λν νλ‘κ·Έλλ°μ νλ©΄μ μ΄λ―Έ μ¬μ©μ΄ λλ va_listλ₯Ό μ¬μ©νμ¬λ μ°Έμ‘°νλ κ²μ΄ μλλ‘ μμ μ±μ κΈ°μ¬νκΈ°λ νλ€.
Bonus: va_copy
va_copy(va_list dest, va_list src);
C
볡μ¬
va_copyλ νμ¬ μμΉλ₯Ό μ μ₯ν΄μΌ νλ μν©μμ μ¬μ©νλ€. μλ₯Όλ€μ΄ 루νλ₯Ό λλ©΄μ ν¬μΈν°κ° κ³μ μ μ§νκ³ μλ μν©μμ ν΄λΉ μμΉλ₯Ό μ μ₯ν΄μΌ ν κ²½μ°κ° μκΈ°λ©΄ va_copyλ₯Ό νμ©ν΄μ ν΄λΉ μμΉλ₯Ό μ μ₯ν΄λλ€.
Bonus: Without Macros
λ§€ν¬λ‘λ μ μ²λ¦¬κΈ°μ μν΄ μ»΄νμΌ μμ μ§μ μ ν
μ€νΈ μΉνμΌλ‘ μ²λ¦¬λλ€. κ·Έλ λ€λ©΄ κ°λ³ μΈμλ₯Ό μν΄ κ΅¬νλ λ§€ν¬λ‘λ€μ μ¬μ©νμ§ μκ³ λ κ°λ³ μΈμλ₯Ό νμ©ν ν¨μμ²λΌ λ§λ€ μ μμ§ μμκΉ?
μμμ κ°λ³ μΈμμ κ΄λ ¨λ λͺ¨λ λ§€ν¬λ‘λ€μ ννλ₯Ό μ΄ν΄λ³΄μλ€. μ΄μ λ°λΌ λ§€ν¬λ‘λ₯Ό μ΄μ©νμ§ μκ³ μλμ κ°μ΄ μ½λλ₯Ό μμ±ν μ μλ€.
#include <stdio.h>
#include <stdarg.h>
void sumAll(int args, ...)
{
int result;
int tmp;
//va_list ap;
char *ap;
result = 0;
//va_start(ap, args);
ap = (char *)&args + sizeof(args);
for (int i = 0 ; i < args ; i++)
{
//tmp = va_arg(ap, int);
tmp = *(int *)ap;
ap += sizeof(int);
result += tmp;
printf("%d", tmp);
if (i == args - 1)
break;
printf(" + ");
}
printf(" = %d\n", result);
//va_end(ap);
ap = 0;
}
int main(void)
{
sumAll(1, 10);
sumAll(2, 10, 20);
sumAll(3, 10, 20, 30);
sumAll(4, 10, 20, 30, 40);
sumAll(5, 10, 20, 30, 40, 50);
return (0);
}
C
볡μ¬
μ μ½λλ₯Ό μ»΄νμΌ νκ³ μ€ννλ©΄, μ¬λ°λ₯΄μ§ μμ κ²°κ³Όκ° λνλλ κ²μ λ³Ό μ μλ€. λΆλͺ
μ¬λ°λ₯Έ κ°μ΄ λμμΌ νλλ° λ©λͺ¨λ¦¬μ κ°μ΄ μ¬λ°λ₯΄κ² μμ°Έμ‘° λμ§ μλ κ²μ μ μΆν μ μλ€. μΌλ°μ μΌλ‘ 32 λΉνΈ μ£Όμ 체κ³μμλ λ¬Έμ μμ΄ μνλ μ½λμ§λ§, νμ¬ μ€μ΅μ μννλ μ»΄ν¨ν°λ 64 λΉνΈ μ£Όμ 체κ³λ₯Ό μ΄μ©ν¨μ λ°λΌ λ°μν λ¬Έμ μ΄λ€.
64 λΉνΈ μ£Όμ 체κ³λ₯Ό μ΄μ©νμ λ, λ§€ν¬λ‘λ₯Ό μ¬μ©νμ§ μκ³ κ΅¬νν μ½λκ° μ¬λ°λ₯Έ κ²°κ³Όκ° λμ€μ§ μλ μ΄μ λ μλ λΈλ‘κ·Έμ μμΈν μ€λͺ
λμ΄ μλ€.
4. Format Specifier Rules
1) Rule μ 리 νμ
μ 리λ₯Ό μν΄ μλμ κ°μ΄ μΆμ½ν΄μ νννλ€λ κ²μ μ°Έκ³ νμ.
printf("%3.2c", 'a');
C
볡μ¬
β "%3.2c", 'a'
β %{3.2}c
β %{w.p}c
β w.p
2) Rule of Only Width (with Flag)
widthμ λν΄μ κΈ°λ³Έμ μΌλ‘ μΈμμ κΈΈμ΄ κ°μ΄ widthμ μ΅μ
μΌλ‘ μ£Όμ΄μ§ κ°μ λμ΄κ°μ λ, width νλλ₯Ό 무μνλ€.
[1] w
λλΉκ° wκ° λλλ‘ λΉ μ리μ λν΄ κ³΅λ°±μ μΌμͺ½μ μΆκ°
#include <stdio.h>
int main(void)
{
printf("%5d", 0);
return (0);
}
C
볡μ¬
[2] -w
λλΉκ° wκ° λλλ‘ λΉ μ리μ λν΄ κ³΅λ°±μ μ€λ₯Έμͺ½μ μΆκ°
#include <stdio.h>
int main(void)
{
printf("%-5d", 0);
return (0);
}
C
볡μ¬
[3] 0w
λλΉκ° wκ° λλλ‘ λΉ μ리μ λν΄ 0μ μΌμͺ½μ μΆκ°
#include <stdio.h>
int main(void)
{
printf("%05d\n", 1);
return (0);
}
C
볡μ¬
[4] -0w
λλΉκ° wκ° λλλ‘ λΉ μ리μ λν΄ 0μ μ€λ₯Έμͺ½μ μΆκ°ν΄μΌν κ² κ°μ§λ§, flag νλμ -μ 0μ ν¨κ» μ¬μ©ν μ μλ€. κΈ°λ³Έμ μΌλ‘ μλ κ·Έλ¦Όκ³Ό κ°μ΄ μ»΄νμΌ κ²½κ³ λ₯Ό λμ΄λ€.
#include <stdio.h>
int main(void)
{
printf("%-05d\n", 1);
return (0);
}
C
볡μ¬
λ§μΌ μ΄ κ²½κ³ λ₯Ό 무μνκ³ κ°μ λ‘ μ»΄νμΌ νλ©΄ -wμ κ°μ κ²°κ³Όλ‘ μΆλ ₯λλ κ²μ λ³Ό μ μλ€.
[5] *
0 < * : μΈμλ‘ λ°μ *μ λν΄ λλΉκ° *μ΄ λλλ‘ λΉ μ리μ λν΄ κ³΅λ°±μ μΌμͺ½μ μΆκ°
0 > * : μΈμλ‘ λ°μ *μ λν΄ λλΉκ° *μ΄ λλλ‘ λΉ μ리μ λν΄ κ³΅λ°±μ μ€λ₯Έμͺ½μ μΆκ°
#include <stdio.h>
int main(void)
{
printf("%*d\n", 5, 0);
printf("%*d\n", -5, 0);
return (0);
}
C
볡μ¬
[6] -*
μΈμλ‘ λ°μ *μ λν΄ λλΉκ° *μ΄ λλλ‘ λΉ μ리μ λν΄ κ³΅λ°±μ μ€λ₯Έμͺ½μ μΆκ°
#include <stdio.h>
int main(void)
{
printf("%-*d\n", 5, 0);
printf("%-*d\n", -5, 0);
return (0);
}
C
볡μ¬
[7] 0*
0 < * : μΈμλ‘ λ°μ *μ λν΄ λλΉκ° *μ΄ λλλ‘ λΉ μ리μ λν΄ 0μ μΌμͺ½μ μΆκ°
0 > * : μΈμλ‘ λ°μ *μ λν΄ λλΉκ° *μ΄ λλλ‘ λΉ μ리μ λν΄ 0μ μ€λ₯Έμͺ½μ μΆκ°ν΄μΌν κ² κ°μ§λ§, μΈμλ‘ λ°μ *μ΄ μμλΌλ©΄ flagμ -μ΅μ
μ΄ μ μ©λλ€. flagμ -μ 0μ ν¨κ» μ¬μ©ν μ μμΌλ―λ‘ -wμ κ°μ κ²°κ³Όλ‘ μΆλ ₯λλ€. -0wμ²λΌ μ»΄νμΌ κ²½κ³ λ₯Ό μ£Όμ§ μλ μ΄μ λ μ½λ μμ wλ₯Ό λͺ
μν΄λμ κ²μ΄ μλκ³ λ° νμμ μ¬μ©μλ‘λΆν° μ
λ ₯μ λ°λλ‘ λ§λ€μκΈ° λλ¬Έμ΄λ€. λ° νμμ λ°μν μΌμ΄μ€λ μ»΄νμΌ νμμμ μ°ΎμλΌ μ μλ€.
#include <stdio.h>
int main(void)
{
printf("%0*d\n", 5, 1);
printf("%0*d\n", -5, 1);
return (0);
}
C
볡μ¬
[8] -0*
flag νλμ -μ 0μ ν¨κ» μ¬μ©ν μ μλ€λ λμΌν μ΄μ λ‘ μ»΄νμΌ κ²½κ³ λ₯Ό λνλΈλ€.
#include <stdio.h>
int main(void)
{
printf("%-0*d\n", 5, 1);
printf("%-0*d\n", -5, 1);
return (0);
}
C
볡μ¬
κ°μ λ‘ μ»΄νμΌμ μννλ©΄, μλμ 보μ΄λ κ²μ²λΌ -*κ³Ό κ°μ κ²°κ³Όλ‘ μΆλ ₯λλ κ²μ λ³Ό μ μλ€.
3) Rule of Only Precision (with Flag)
.precisionμ κΈ°λ³Έμ μΌλ‘ μλ¦Ώμλ₯Ό μ±μΈ λ 0μ μ±μμ£Όλ μ±μ§μ΄ μμΌλ©° .precisionμ κ°μΌλ‘λ μμκ° μλ κ°λ§ μ¬ μ μλ€. (μμκ° λ€μ΄μ€λ©΄ .precisionμ κ°μ μ²λ¦¬νλ λ°©μμ΄ μλ€. μμΈν κ²μ printf μ€λͺ
λΆμ μλ .precision νλμ μ€λͺ
μ μ°Έκ³ νμ.)
[1] .p
μ μμ λν΄μ μ΄ μλ¦Ώμκ° pκ° λλλ‘ 0μ μΌμͺ½ λΉ κ³΅κ°μ μ±μ λ£λλ€.
μ€μμ λν΄μ μμμ μλ μλ¦Ώμκ° pκ° λλλ‘ 0μ λΉ κ³΅κ°μ μ±μ λ£λλ€. λ§μΌ μλ¦Ώμκ° λμ΄κ°λ©΄ μλ¦Ώμλ₯Ό λ§μΆκΈ° μν΄ λ°μ¬λ¦Όμ μννλ€.
#include <stdio.h>
int main(void)
{
printf("%.5d\n", 1);
printf("%.5f\n", 0.1);
printf("%.5f", 0.000015);
return (0);
}
C
볡μ¬
[2] -.p
width κ°μ΄ μ£Όμ΄μ§ ννκ° μλκΈ° λλ¬Έμ κ·Έ κ²°κ³Όκ° .pμ λμΌνκ² λνλλ€.
#include <stdio.h>
int main(void)
{
printf("%-.5d\n", 1);
printf("%-.5f\n", 0.1);
printf("%-.5f", 0.000015);
return (0);
}
C
볡μ¬
[3] 0.p
width κ°μ΄ μ£Όμ΄μ§ ννκ° μλλ°λ€κ° .precision νΉμ± μ 0μ λΉ μ리μ μ±μ°κΈ° λλ¬Έμ κ·Έ κ²°κ³Όκ° .pμ λμΌνκ² λνλλ€.
#include <stdio.h>
int main(void)
{
printf("%0.5d\n", 1);
printf("%0.5f\n", 0.1);
printf("%0.5f", 0.000015);
return (0);
}
C
볡μ¬
[4] -0.p
flagμ -μ 0μ ν¨κ» μ¬μ©ν μ μκΈ° λλ¬Έμ μ»΄νμΌ κ²½κ³ κ° λ°μνλ€.
#include <stdio.h>
int main(void)
{
printf("%-0.5d\n", 1);
printf("%-0.5f\n", 0.1);
printf("%-0.5f", 0.000015);
return (0);
}
C
볡μ¬
λ€λ§ κ°μ λ‘ μ»΄νμΌμ μμΌλ, width κ°μ΄ μ£Όμ΄μ§ ννκ° μλλ°λ€κ° .precision νΉμ± μ 0μ λΉ μ리μ μ±μ°κΈ° λλ¬Έμ κ·Έ κ²°κ³Όκ° -.pμ λμΌνκ² λνλλ€.
[5] .*
.pμ κ²°κ³Όκ° λμΌνλ€. νμ§λ§ p κ°μ μ¬μ©μμκ²μ μΈμλ‘ λ°μμ μ¬μ©νκ² λλ€.
#include <stdio.h>
int main(void)
{
printf("%.*d\n", 5, 1);
printf("%.*f\n", 5, 0.1);
printf("%.*f", 5, 0.000015);
return (0);
}
C
볡μ¬
[6] -.*
-.pμ κ²°κ³Όκ° λμΌνλ€. νμ§λ§ pκ°μ μ¬μ©μμκ²μ μΈμλ‘ λ°μμ μ¬μ©νκ² λλ€.
#include <stdio.h>
int main(void)
{
printf("%-.*d\n", 5, 1);
printf("%-.*f\n", 5, 0.1);
printf("%-.*f", 5, 0.000015);
return (0);
}
C
볡μ¬
[7] 0.*
0.pμ κ²°κ³Όκ° λμΌνλ€. νμ§λ§ pκ°μ μ¬μ©μμκ²μ μΈμλ‘ λ°μμ μ¬μ©νκ² λλ€.
#include <stdio.h>
int main(void)
{
printf("%0.*d\n", 5, 1);
printf("%0.*f\n", 5, 0.1);
printf("%0.*f", 5, 0.000015);
return (0);
}
C
볡μ¬
[8] -0.*
-0.pμ κ°μ΄ flagμμ -μ 0μ΄ ν¨κ» μ¬μ©λ μ μκΈ° λλ¬Έμ μλμ κ°μ΄ μ»΄νμΌ κ²½κ³ κ° λ°μνλ€.
#include <stdio.h>
int main(void)
{
printf("%-0.*d\n", 5, 1);
printf("%-0.*f\n", 5, 0.1);
printf("%-0.*f", 5, 0.000015);
return (0);
}
C
볡μ¬
λ€λ§ κ°μ λ‘ μ»΄νμΌμ μμΌλ, width κ°μ΄ μ£Όμ΄μ§ ννκ° μλλ°λ€κ° .precision νΉμ± μ 0μ λΉ μ리μ μ±μ°κΈ° λλ¬Έμ κ·Έ κ²°κ³Όκ° -.*μ λμΌνκ² λνλλ€.
4) Rules of Width + Precision (with Flag)
[1] w.p
[2] -w.p
w.pμ κ²°κ³Όμ λμΌνλ©΄μ μΆκ°μ μΌλ‘ μ’μΈ‘ μ λ ¬μ μννλ€.
[3] 0w.p
w.pμ κ²°κ³Όμ λμΌνλ©΄μ μΆκ°μ μΌλ‘ λΉ κ³΅κ°μ 0μΌλ‘ μ±μ λ£λλ€.
[4] -0w.p
flagμλ -μ 0μ ν¨κ» μ¬μ©ν μ μκΈ° λλ¬Έμ μ»΄νμΌ κ²½κ³ λ₯Ό λμ΄λ€.
κ°μ λ‘ μ»΄νμΌ μν¬ κ²½μ° -w.pμ λμΌν κ²°κ³Όλ₯Ό λνλΈλ€.
[5] *.* / *.p / w.*
w.pμ κ²°κ³Όμ λμΌνλ©΄μ *μ ν΄λΉνλ μΈμλ₯Ό μ¬μ©μμκ² μ§μ λ°λλ€.
[6] -*.* / -*.p / -w.*
-w.pμ κ²°κ³Όμ λμΌνλ©΄μ *μ ν΄λΉνλ μΈμλ₯Ό μ¬μ©μμκ² μ§μ λ°λλ€.
[7] 0*.* / 0*.p / 0w.*
0w.pμ κ²°κ³Όμ λμΌνλ©΄μ *μ ν΄λΉνλ μΈμλ₯Ό μ¬μ©μμκ² μ§μ λ°λλ€.
[8] -0*.* / -0*.p / -0w.*
flagμλ -μ 0μ ν¨κ» μ¬μ©ν μ μκΈ° λλ¬Έμ μ»΄νμΌ κ²½κ³ λ₯Ό λμ΄λ€.
κ°μ λ‘ μ»΄νμΌ μν¬ κ²½μ° -*.*μ λμΌν κ²°κ³Όλ₯Ό λνλΈλ€.
5) Warnings of Each Type
[1] c
w, *, -w, -* λ±μ λν΄ νμ© κ°λ₯νλ€.
.p, .*, 0w, 0* λ±μ λν΄ κ²½κ³ κ° λνλλ€.
λ€λ§ 0w, 0*μ λν΄μλ μλμ κ°μ΄ κ²½κ³ κ° λνλλ κ°μ λ‘ μ»΄νμΌ μμλ μ μ μ μ©λ κ°μ΄ λμμΌ νλ€λ κ²μ μμ§ν΄μΌ νλ€.
#include <stdio.h>
int main(void)
{
printf("%05c\n", 'a');
printf("%0*c\n", 5, 'a');
return (0);
}
C
볡μ¬
[2] s
w, *, -w, -*, .p, .*, w., *., w.p, *.* λ±μ λν΄ νμ© κ°λ₯νλ€.
0w, 0* λ±μ λν΄ κ²½κ³ κ° λνλλ€.
λ€λ§ 0w, 0*μ λν΄μλ μλμ κ°μ΄ κ²½κ³ κ° λνλλ κ°μ λ‘ μ»΄νμΌ μμλ μ μ μ μ©λ κ°μ΄ λμμΌ νλ€λ κ²μ μμ§ν΄μΌ νλ€.
#include <stdio.h>
int main(void)
{
printf("%05.3s\n", "abcdef");
printf("%0*.*s\n", 5, 3, "abcdef");
return (0);
}
C
볡μ¬
[3] p
w, *, -w, -* λ±μ λν΄ νμ© κ°λ₯νλ€.
.p, .*, 0w, 0* λ±μ λν΄ κ²½κ³ κ° λνλλ€.
λ€λ§ .p, .*, 0w, 0*μ λν΄μλ μλμ κ°μ΄ κ²½κ³ κ° λνλλ κ°μ λ‘ μ»΄νμΌ μμλ μ μ μ μ©λ κ°μ΄ λμμΌ νλ€λ κ²μ μμ§ν΄μΌ νλ€.
wμ κ²½μ°μλ 0xλ₯Ό λλΉμ ν¬ν¨νκ³ , pμ κ²½μ° 0xλ₯Ό μ νλμμ μ μΈνκ³ μΆλ ₯μ΄ λλ κ²μ λ³Ό μ μλ€.
#include <stdio.h>
int main(void)
{
printf("%.20p\n", "abcdef");
printf("%.*p\n", 20, "abcdef");
printf("%020p\n", "abcdef");
printf("%0*p\n", 20, "abcdef");
return (0);
}
C
볡μ¬
[4] d / i / u / x / X
λͺ¨λ νλμ λν΄ νμ© κ°λ₯νλ€.