دادههای خروجی استاندارد در کامپیوتر با استفاده از این تابع نوشته میشود. این تابع به تعداد دلخواه آرگومان میپذیرد که آرگومان اول دارای مفهوم خاص است و رشته فرمت یا رشته کنترل نامیده میشود. رشته کنترل در داخل زوج گیومه قرار میگیرد و شامل اطلاعات قالببندی است؛ یعنی، مشخص میکند که باید چند قلم آرگومان داده چاپ شود و فرمت آنها چگونه است. فرم کلی این تابع به صورت زیر است.
printf (“control string”, arguments list) ;
یا
printf (“control string”, arg1, arg2,…, argn) ;
رشته کنترل دربردارنده دو نوع اقلام داده است. نوع اول شامل رشته یا کاراکترهایی است که به همان صورت روی صفحه نمایش داده خواهد شد. نوع دوم شامل فرامین فرمت است که با علامت “%” آغاز میگردد و به دنبال آن کد فرمت یا مشخصکننده فرمت میآید. فرمان فرمت، قالب یا فرمت و تعداد متغیرها یا آرگومانهایی را که باید چاپ شوند مشخص میسازد و به آن type conversion نیز میگویند و در آن برای مشخص ساختن فرمت هر آرگومان یک گروه از کاراکترها که با “%” آغاز میگردند به کار میرود.
برخی مؤلفان کد فرمت را فرامین فرمت نیز میگویند. فهرست کد یا فرامین فرمت که در فرمان printf به کار میروند در جدول نشان داده شده است.
مثال۳ـ۱ در برنامه زیر مقادیر متغیرهایی از نوعهای مختلف در خروجی چاپ میشود.
#include<stdio.h>
main ()
{
int x =31 ;
float y =148.5 ;
char z[10] = {“PayamNoor”};
printf(” %d %f %s ” , x , y , z) ;
}
اولی عدد صحیح دهدهی، دومی از نوع اعشاری و سومی رشته است که به ترتیب با فرمان فرمت %s ,%f , %d مشخص شدهاند. خروجی دستور مزبور به صورت زیر خواهد بود.
۳۱ ۱۴۸٫۵ PayamNoor
در برنامه مذکور بهعلت وجود یک محل خالی بین فرامین فرمت در رشته کنترل، بین مقادیر چاپ شده نیز فضای خالی ایجاد شده است.
مثال ۳ـ۲ بهاین برنامه توجه کنید.
#include<stdio.h>
main ()
{
float x=2.0 , y=3 ;
printf(“%f %f %f %f %d”, x , y , x+y , x*y, x) ;
}
خروجی برنامه به صورت زیر خواهد بود.
۲٫۰۰۰۰۰۰ ۳٫۰۰۰۰۰۰ ۵٫۰۰۰۰۰۰ ۶٫۰۰۰۰۰۰ ۲
در اینجا آرگومانهای اول و دوم تکمتغیرند. ولی آرگومانهای سوم و چهارم عبارات محاسباتیاند که اول مقدار آنها محاسبه میگردد و سپس نتیجه براساس کد فرمت مربوط چاپ میشود. آرگومان آخر به شکل عدد صحیح چاپ میشود.
مثال ۳ـ۳ به برنامه زیر توجه کنید.
#include<stdio.h>
main ()
{
double x=50.0 , y=0.25 ;
printf(” %f %f %f %f\n “, x , y , x*y , x / y) ;
printf(” %e %e %e %e “, x , y , x*y , x / y) ;
}
هر دو دستور printf دارای آرگومانهای یکساناند ولی یکی با فرمان فرمت %f و در دیگری با فرمان فرمت %e چاپ شدهاند. همچنین علامت “\n” موجب چاپ خروجی در سطر بعدی میگردد.
خروجی این برنامه به صورت زیر خواهد بود.
۵۰٫۰۰۰۰۰۰ ۰٫۲۵۰۰۰۰ ۱۲٫۵۰۰۰۰۰ ۲۰۰٫۰۰۰۰۰۰
۵٫۰۰۰۰۰۰e+01 2.500000e-01 1.250000e+01 2.000000e+02
در سطر اول مقادیر x/y , x*y , y , x به فرم استاندارد floating point نشان داده شده، درحالیکه در سطر دوم همان مقادیر به دلیل استفاده از فرمان فرمت “%e” به فرم نمایش علمی چاپ شده است.
ملاحظه میکنید که هر مقدار تا ۶ رقم دقت، پس از نقطه اعشار نمایش داده شده است. به هرحال این تعداد ارقام را میتوان با قرار دادن میزان دقت در رشته کنترلی تغییر داد.
در فرمان فرمت میتوان حداقل پهنای میدان و تعداد ارقام اعشار، یعنی ارقام بعد از ممیز، را نیز مشخص کرد. همچنین میتوان تعیین کرد که اطلاعات خروجی از سمت چپ میدان چاپ (یعنی فضای تعیینشده برای چاپ) تراز گردند (در حالت عادی اطلاعات رشتهای از طرف چپ و اطلاعات عددی از سمت راست میدان تراز میشوند). حداقل طول میدان را میتوان با قرار دادن یک عدد صحیح (به عنوان مشخصکننده حداقل فضای لازم) بین علامت % و کد فرمت مشخص کرد. این کار موجب میگردد که اگر طول میدان بیشتر از طول مورد نیاز برای اطلاعات خروجی باشد، فضای اضافی خالی باقی بماند. ولی اگر طول رشته یا عدد بزرگتر از طول پیشبینیشده برای آن باشد، طول پیشبینیشده نادیده گرفته میشود و اطلاعات به طور کامل نمایش مییابد. اگر بخواهید در مورد اطلاعات عددی فضای اضافی با صفر پر شود، سمت چپ عدد m رقم “۰” را قرار دهید. برای مثال %۰۴d موجب میگردد که اگر مقدار چاپ شده از چهار رقم کمتر باشد، سمت چپ آن به تعداد لازم صفر قرار گیرد به طوری که مقدار چاپ شده چهاررقمی باشد.
در مورد مقادیر floating point برای مشخص ساختن تعداد ارقام بعد از ممیز، باید پس از عدد مشخصکننده طول میدان، علامت ممیز “.” و پس از آن نیز یک عدد که معرف تعداد ارقام اعشار خواهد بود قرار داد. برای مثال کد فرمت %۱۰٫۴f عدد را با حداقل ده کاراکتر پهنای میدان و با چهار محل برای ارقام اعشار نمایش خواهد داد.
مثال ۳ـ۴ به برنامه زیر دقت کنید.
#include<stdio.h>
main ()
{
int x = 12345 ;
float y =345.125 ;
printf(“3d %5d %8d\n\n”, x , x , x) ;
printf(“%3f %10f %13f\n”, y , y , y) ;
printf(“%3e %10e %13e\n”, y , y , y) ;
printf(“%g %10g %13g \n”, x , x , x) ;
printf(“%3g %10g %13g “, x , x , x) ;
}
خروجی این برنامه به صورت زیر خواهد بود.
۱۲۳۴۵ ۱۲۳۴۵ ۱۲۳۴۵
۳۴۵٫۱۲۵۰۰۰ ۳۴۵٫۱۲۵۰۰۰ ۳۴۵٫۱۲۵۰۰۰
۳٫۴۵۱۲۵e+02 3.45125e+02 3.45125e+02
۳۴۵٫۱۲۵ ۳۴۵٫۱۲۵ ۳۴۵٫۱۲۵
۳۴۵٫۱۲۵ ۳۴۵٫۱۲۵ ۳۴۵٫۱۲۵
در سطر اول، خروجی با استفاده از مینیمم پهنای فیلد (به طول سه کاراکتر، پنج کاراکتر و هشت کاراکتر) چاپ شده است. در هر فیلد تمامی عدد به طور کامل نمایش داده شده است، اگرچه طول میدان پیشبینی شده کمتر از عدد مورد نظر است (مانند فیلد اول که مینیمم طول پیشبینی شده سه کاراکتر است ولی عدد مورد نظر ۵ رقمی است).
دومین خروجی در سطر اول با یک محل خالی شروع شده است. این محل خالی بهعلت وجود یک محل خالی بین فرمان فرمت فیلد اول و دوم در رشته کنترلی است.
سومین خروجی در سطر اول دارای چهار محل خالی یا blank در سمت چپ است که یک محل آن به سبب وجود یک محل خالی بین فرمان فرمت فیلد دوم و سوم در رشته کنترلی است. سه محل خالی دیگر نیز برای پرکردن حداقل فضای پیشبینی شده برای میدان مورد نظر است (که در اینجا هشت کاراکتر برای یک عدد پنج رقمی است).
شرایط مشابهی در سطر دوم و سوم خروجی وجود دارد. فقط باید توجه کرد که کد فرمت در سطر دوم از نوع f و در سطر سوم از نوع e است.
در سطر چهارم و پنجم همان مقادیر با استفاده از کد فرمت %g چاپ شده است. این فرم نتیجه را کوتاهتر نشان میدهد. فواصل بین مقادیر چاپ شده نیز براساس درنظر گرفتن حداقل پهنای پیشبینی شده در رشته کنترلی برای آرگومانهای مورد نظر است.
میتوان ماکزیمم تعداد ارقام اعشار در مورد مقادیر floating point یا ماکزیمم تعداد کاراکتر برای یک رشته را نیز مشخص کرد. مشخصه مورد نظر برای این عمل، precision یا دقت نامیده میشود. دقت مورد نظر، یک عدد صحیح بدون علامت است که قبل از آن نیز یک علامت ممیز “.” قرار میگیرد. اگر علاوه بر precision حداقل طول میدان نیز مشخص شده باشد (که معمولاً نیز همین طور است)، طول میدان قبل از precision قرار میگیرد و علامت ممیز “.” بین آن دو درج میشود و کد فرمت پس از این مجموعه کاراکترها میآید.
در مورد مقادیر floating point اگر دقت پیشبینی شده برای ارقام اعشار کوچکتر از تعداد ارقام اعشار باشد، جزء اعشار گرد میشود، به طوری که تعداد ارقام آن با دقت یا precision پیشبینی شده مطابقت نماید.
مثال ۳ـ۵ بهاین برنامه توجه کنید.
#include<stdio.h>
main ()
{
float x =123.456 ;
printf(“%7f %7.3f %7.1f\n”, x , x , x) ;
printf(“%12e %12.5e %12.3e”, x , x , x) ;
}
خروجی این برنامه به صورت زیر خواهد بود.
۱۲۳٫۴۵۶۰۰۰ ۱۲۳٫۴۵۶ ۱۲۳٫۵
۱٫۲۳۴۵۶۰e+02 1.23456e+02 1.235e+02
سطر اول با کد فرمت f ایجاد شده است. در اینجا عدد سوم به دلیل وجود مشخصه دقت که یک رقم اعشار در نظر گرفته شده گرد شده است. همچنین با درنظر گرفتن حداقل طول میدان (هفت کاراکتر) در سمت چپ عدد سوم، دو محل فضای خالی به دلیل حداقل طول میدان و یک محل فضای خالی نیز به دلیل وجود یک محل خالی بین فرمان فرمت فیلدهای دوم و سوم ایجاد شده است.
سطر دوم با کد فرمت نوع e ایجاد شده و دارای مشخصههای مشابه سطر اول است. در اینجا هم عدد سوم گرد شده است تا با دقت پیشبینیشده، یعنی ۳ رقم اعشار، تطابق یابد. همچنین چهار فضای خالی نیز با در نظر گرفتن حداقل طول میدان (دوازده کاراکتر) و وجود یک محل خالی بین فرمان فرمت فیلدهای دوم و سوم در سمت چپ آن ایجاد شده است.
ضرورتی ندارد که مشخصه دقت با حداقل طول میدان توأم به کار رود، بلکه میتوان مشخصه دقت را بدون ذکر حداقل طول میدان نیز به کار برد. ولی به هرحال نقطه معرف اعشار باید در جلوی آن به کار رود، مانند دستور زیر.
printf(” %.4f “, x) ;
علاوه بر کاراکترهای تبدیل و پهنای میدان و شاخص دقت، رشته کنترل یک نشانه یا flag نیز دارد که در شکل ظاهری خروجی اثر میگذارد. flag بلافاصله بعد از علامت (%) قرار میگیرد. بعضی کامپایلرها اجازه میدهند که دو flag پشت سر هم درون یک مشخصه تبدیل به کار روند.