printf یا همان پرینت با فرمت قوی ترین راه خروجی دهی در زبان های برنامه نویسی است. این تابع یک رشته را با فرمتی خاص در کنسول چاپ می کند.


#include <stdio.h>
int printf(const char *format, ...);

راحتترین راه برای فرمت بندی رشته در printf توجه به این نکته مهم است که در این تابع تمامی اجزای رشته ای که به عنوان ورودی اول به آن فرستاده می شود به همان شکل چاپ می شوند بجز کاراکتر هایی که پشت آنها علامت درصد (%) قرار داشته باشد، و این زمانی است که جادو اتفاق میافتد، ورودی های بعدی تابع به جای علامت های درصد موجود در رشته اول در خروجی چاپ می شوند.

در زیر پرکاربرد ترین عبارت های درصدی را مشاهده می کنید.
%d
ورودی بعدی تابع را بصورت یک عدد صحیح چاپ می کند، مثل 3490 ورودی ای که در این حالت چاپ می شود می بایست int باشد
%f
آرگومان بعدی تابع را بصورت یک عدد ممییز شناور علامت دار چاپ می کند، مثل 3.14159 آرگومان ورودی ای که در این حالت چاپ می شود می بایست float باشد
%c
آرگومان بعدی تابع را بصورت یک کاراکتر چاپ می کند، مثل 'B' آرگومان ورودی ای که در این حالت چاپ می شود می بایست از نوع char باشد
%s
ورودی بعدی تابع را بصورت یک رشته چاپ می کند، مثل "Did you remember your mittens?" ورودی ای که در این حالت چاپ می شود می بایست از نوع char[] یا char* باشد.
%%
آرگومانی در خروجی چاپ نمی شود و تنها یک علامت % در خروجی چاپ می شود.

این ها پرکاربردترین کدهای درصدی بودند، در زیر کدهای بیشتری را خواهیم دید، قبل دیدن تمامی بقیه کد ها اجازه دهید راجع به کد های درصدی کمی عمیق تر شویم.
برای یک کار، شما می توانید تعداد فضایی که آرگومان شما در آن چاپ می شود را مشخص کنید، این کار به شما کمک می کند تا بتوانید بخش های سطر خود را در ستون هایی مرتب کنید، اگر مقدار عدد مشخص شده منفی باشد، فضای مشخص شده بجای اینکه از سمت راست پر شود از سمت چپ پر خواهد شد، همانند مثال زیر:


printf("%10d", x);  /* prints X on the right side of the 10-space field */
printf("%-10d", x); /* prints X on the left side of the 10-space field */

اگر شما در حالت کلی اندازه عبارت خود را نمی دانید، می توانید آن را از ورودی – درست قبل از عبارت مورد نظر- بخوانید. به مثال زیر توجه کنید.


int width = 12;
int value = 3490;

printf("%*d\n", width, value);

همچنین می توانید قبل از عدد مشخص کننده اندازه عبارت 0 قرار دهید تا در خروجی به جای فاصله پشت عدد چاپ شده صفر قرار بگیرد.


int x = 17;
printf("%05d", x);  /* "00017" */

وقتی شما با اعداد اعشاری کار می کنید، می توانید تعداد قبل و بعد اعشار را مشخص کنید، تنها کافی است مشخصه اندازه را بصورت "x.y” بنویسید، که x مشخص کننده اندازه بخش صحیح(می توانید این عدد را وارد نکنید تا به اندازه عدد تغییر نکند) و y مشخص کننده اندازه بخش اعشاری است.


float f = 3.1415926535;

printf("%.2f", f);  /* "3.14" */
printf("%7.3f", f); /* "  3.141" <-- 7 spaces across */

گفته های فوق پرکاربرد ترین عملگر هایی بودند که قبل از اندازه عبارت می آمدند ولی عملگر های بیشتری نیز موجود است

0
در بالا به آن اشاره شد، در صورتی که قبل از عدد مشخص کننده طول عبارت چاپی صفر بیاید۷ به جای فاصله قبل عدد صفر چاپ می شود. “%05d”

-
در بالا به آن اشاره شد، در این حالت فضای مشخص شده برای عبارت از چپ پر می شود. “%-5d”

' ' (فاصله)
یک فاصله قبل از عدد مورد نظر چاپ می کند، که اعداد صحیح را هم ستون با اعداد منفی (که یک علامت - دارند) می کند.”% d”

+
همواره علامت اعداد را قبل از آنها چاپ می کند (هم + و هم -) “%+d”

اکنون به بررسی بقیه کد های درصدی مب پردازیم

%i
درست همانند %d که در بالا گفته شد عمل می کند

%o
اعداد صحیح را در مبنای ۸ چاپ میکند.

%u
درست همانند %d کار میکند با این تفاوت که فقط اعداد مثبت چاپ می کنید unsigned int

%x یا %X
اعداد صحیح مثبت را در مبنای ۱۶ چاپ میکند، %x حروف را بصورت کوچک و %X حروف را بصورت بزرگ چاپ می کند

%F
درست همانند %f عمل می کند بجز مواردی که عبارت حاوی کاراکتر غیر عددی باشد مثلا بینهایت

%e یا %E
اعداد اعشاری را به فرم نمایی چاپ می کند

%g یا %G
راه دیگری برای چاپ اعداد double

%p
یک اشاره گر با با فرمت hex (مبنای ۱۶) چاپ می کند. به عبارت دیگر آدرس اشاره گر را چاپ می کند.

%n
این کد در حقیقت چیزی چاپ نمی کند ولی تعداد کاراکتر های چاپ شده را در آرگومان متناظر ذخیره می کند.


int numChars;
float a = 3.14159;
int b = 3490;

printf("%f %d%n\n", a, b, &numChars);
printf("The above line contains %d characters.\n", numChars);

در نهایت فرمتی که ما خواهیم داشت بفرم کلی زیر است:


"%[modifier][fieldwidth][.precision][lengthmodifier][formatspecifier]"

modifier مثل - ، fieldwidth همان اندازه عبارت، .precision اندازه بخش اعشاری اعداد اعشاری، lengthmodifier مشخص کننده بزرگی عبارت (در زیر خواهید دید) و formatspecifier همان کاراکتر های بعد درصد هستند
مشخص کننده ها بزرگی یا همان lengthmodifier عبارتند از
h
عدد صحیح نسبت داده شده ازنوع short است، "%hd” از نوع short و "%hu”از نوع ```
unsigned int

l
عدد نسبت داده شده از نوع ```
long
``` است، ```
"%ld”
``` از نوع ```
long
``` و ```
"%lu”
``` از نوع ```
long int
``` است.
hh
عدد نسبت داده شده از نوع ```
char
``` است، ```
"%hhd”
``` از نوع ```
char
``` و ```
"%hhu”
``` از نوع ```
unsigned char
``` است.
ll
عدد نسبت داده شده از نوع ```
long long
``` است، ```
"%lld”
``` از نوع ```
long long
``` و ```
"%llu”
``` از نوع ```
unsigned long long
``` است.

<h3>نمونه کاربرد</h3>
int a = 100;
float b = 2.717;
char *c = "beej!";
char d = 'X';
int e = 5;

printf("%d", a); /* "100"      */
printf("%f", b); /* "2.717000" */
printf("%s", c); /* "beej!"    */
printf("%c", d); /* "X"        */
printf("110%%"); /* "110%"     */

printf("%10d\n", a);   /* "       100" */
printf("%-10d\n", a);  /* "100       " */
printf("%*d\n", e, a); /* "  100"      */
printf("%.2f\n", b);   /* "2.71"       */

printf("%hhd\n", d); /* "88" <-- ASCII code for 'X' */

printf("%5d %5.2f %c\n", a, b, d); /* "  100  2.71 X" */
<strong>البته کاربرد printf و کد های فوق مختص زبان سی نبوده و در دیگر زبان ها همچون جاوا و سی شارپ و .. نیز به کار می رود.</strong>