...

آموزش تابع printf در زبان C؛ قالب‌بندی خروجی و جدول ASCII

قسمت 34
آموزش تابع printf در زبان C؛ قالب‌بندی خروجی و جدول ASCII
مشاهده سایر جلسات آموزش
9 بازدید
۱۴۰۵-۰۸-۰۴
5 دقیقه
  • نویسنده: آرتین
  • درباره نویسنده: ---

در قسمت‌های قبلی آموزش امبدد C، بیشتر روی مفاهیم پایه زبان C، ساختار برنامه‌ها، حافظه، اشاره‌گرها و مباحث مهم Bare-metal تمرکز داشتیم. از این قسمت وارد بخشی می‌شویم که بیشتر به ورودی و خروجی (I/O) در زبان C مربوط است.

در دنیای سیستم‌های Embedded، خروجی گرفتن همیشه به سادگی اجرای یک تابع نیست. در یک کامپیوتر معمولی، سیستم‌عامل و کتابخانه‌های استاندارد بسیاری از جزئیات را از ما پنهان می‌کنند؛ اما در سیستم‌های Bare-metal، معمولاً خود برنامه‌نویس باید مسیر خروجی را پیاده‌سازی کند.

در این قسمت، با printf به‌عنوان مهم‌ترین تابع خروجی در زبان C آشنا می‌شویم، چند نمونه از قالب‌بندی خروجی را بررسی می‌کنیم، جدول ASCII را با کمک این تابع تولید می‌کنیم و در پایان با دو جریان خروجی مهم یعنی stdout و stderr آشنا خواهیم شد.

آموزش تابع printf در زبان C؛ قالب‌بندی خروجی و جدول ASCII

شکل ۱- تفاوت مسیر خروجی در یک کامپیوتر معمولی و یک سیستم Bare-metal

تابع printf چیست؟

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

فرم کلی این تابع به‌صورت زیر است:

در این ساختار، رشته‌ی قالب یا همان format string تعیین می‌کند که هر مقدار چگونه نمایش داده شود. برای مثال:

خروجی این برنامه به‌صورت زیر خواهد بود:

در اینجا %d به printf می‌گوید که مقدار بعدی را به‌صورت یک عدد ده‌دهی صحیح چاپ کند.

چند قالب پرکاربرد در printf

قدرت اصلی printf زمانی مشخص می‌شود که بخواهیم نحوه نمایش داده‌ها را کنترل کنیم. مثلاً می‌توانیم تعیین کنیم یک عدد با چه عرضی نمایش داده شود، از چپ‌چین یا راست‌چین بودن آن مطمئن شویم یا عدد را با صفر پر کنیم.

به مثال زیر توجه کنید:

خروجی:

در این مثال:

  • %d عدد را به‌صورت معمولی چاپ می‌کند.
  • %5d عدد را در فیلدی با عرض حداقل ۵ کاراکتر، راست‌چین چاپ می‌کند.
  • %-5d عدد را در فیلدی با عرض ۵ کاراکتر، چپ‌چین چاپ می‌کند.
  • %05d اگر عرض عدد کمتر از ۵ باشد، سمت چپ آن با صفر پر می‌شود.

آموزش تابع printf در زبان C؛ قالب‌بندی خروجی و جدول ASCII

شکل ۲- مقایسه چهار روش رایج برای چاپ یک عدد در printf

برخی از قالب‌های مهم در printf

در جدول زیر چند قالب پرکاربرد در printf را می‌بینید:

قالب کاربرد نمونه خروجی
%d چاپ عدد صحیح ده‌دهی 42
%c چاپ یک کاراکتر A
%s چاپ رشته Hello
%x چاپ عدد در مبنای شانزده 2a
%o چاپ عدد در مبنای هشت 52
%f چاپ عدد اعشاری 3.141593

برای مثال:

خروجی:

ساخت جدول ASCII با printf

یکی از مثال‌های آموزشی و جذاب برای تمرین با printf، تولید جدول نویسه‌های ASCII است. ASCII یک استاندارد قدیمی اما بسیار مهم برای نمایش نویسه‌هاست. هر حرف، عدد یا علامت در این جدول، یک کد عددی مشخص دارد.

برنامه زیر نویسه‌های قابل‌چاپ ASCII را به همراه مقدار ده‌دهی، هگزادسیمال و اکتال آن‌ها چاپ می‌کند:

بخشی از خروجی برنامه:

در این برنامه:

  • %c نویسه را چاپ می‌کند.
  • %3d مقدار ده‌دهی را با عرض حداقل ۳ کاراکتر نشان می‌دهد.
  • %02x مقدار هگز را با عرض ۲ و صفرگذاری از چپ چاپ می‌کند.
  • %03o مقدار اکتال را با عرض ۳ و صفرگذاری چاپ می‌کند.

آموزش تابع printf در زبان C؛ قالب‌بندی خروجی و جدول ASCII

شکل ۳- خلاصه‌ای از نویسه‌های قابل‌چاپ ASCII و کدهای آن‌ها

تفاوت printf و fprintf

در ظاهر، printf فقط برای چاپ روی صفحه استفاده می‌شود؛ اما در واقع این تابع خروجی را به جریان استاندارد خروجی یعنی stdout می‌فرستد. اگر بخواهیم مشخص کنیم خروجی به کدام فایل یا جریان برود، از تابع fprintf استفاده می‌کنیم.

فرم کلی آن:

برای مثال:

خط اول پیام را به خروجی عادی برنامه می‌فرستد و خط دوم پیام خطا را به جریان خطا.

دو جریان مهم خروجی: stdout و stderr

در برنامه‌های C، معمولاً سه جریان استاندارد وجود دارند:

  • stdin برای ورودی
  • stdout برای خروجی عادی برنامه
  • stderr برای پیام‌های خطا

تفاوت stdout و stderr در برنامه‌های واقعی اهمیت زیادی دارد. وقتی خروجی عادی و پیام‌های خطا از هم جدا باشند، هم دیباگ آسان‌تر می‌شود و هم می‌توان در خط فرمان یا اسکریپت‌ها آن‌ها را جداگانه مدیریت کرد.

مثال:

خروجی منطقی این برنامه دو بخش دارد:

  • پیام اول روی stdout ارسال می‌شود.
  • پیام دوم روی stderr ارسال می‌شود.

آموزش تابع printf در زبان C؛ قالب‌بندی خروجی و جدول ASCII

شکل ۴- تفاوت جریان خروجی عادی (stdout) و جریان پیام خطا (stderr)

این مفاهیم در سیستم‌های امبدد چه کاربردی دارند؟

شاید در نگاه اول printf فقط یک ابزار ساده برای نمایش متن به نظر برسد، اما در پروژه‌های Embedded همین ابزار ساده می‌تواند نقش بسیار مهمی در دیباگ و بررسی وضعیت برنامه داشته باشد. برای مثال، وقتی یک ماژول میکروکنترلر را از طریق UART به کامپیوتر وصل می‌کنیم، می‌توانیم با استفاده از printf اطلاعاتی مثل موارد زیر را در ترمینال ببینیم:

  • مقدار سنسورها
  • وضعیت پین‌ها
  • تعداد تکرار حلقه‌ها
  • پیام‌های خطا یا هشدار
  • نتایج محاسبات

البته در سیستم‌های Bare-metal، تابع printf معمولاً به‌صورت پیش‌فرض کار نمی‌کند و باید مسیر خروجی آن را خودمان تعریف کنیم؛ مثلاً آن را به UART متصل کنیم.

جمع‌بندی

در این قسمت با یکی از مهم‌ترین توابع خروجی در زبان C یعنی printf آشنا شدیم و دیدیم که چگونه می‌توان با استفاده از قالب‌های مختلف، داده‌ها را به شکل‌های متنوع چاپ کرد. همچنین با تولید جدول ASCII، کاربرد عملی قالب‌های چاپ را بهتر درک کردیم و در ادامه تفاوت بین stdout و stderr را شناختیم.

در قسمت بعدی، ادامه مباحث ورودی/خروجی را دنبال می‌کنیم و به سراغ خواندن داده، fgets، sscanf و مقدمات کار با فایل‌ها خواهیم رفت.

تمرین

  1. برنامه‌ای بنویسید که یک عدد صحیح را با قالب‌های %d، %5d، %-5d و %05d چاپ کند.
  2. برنامه جدول ASCII را طوری تغییر دهید که فقط حروف بزرگ انگلیسی را چاپ کند.
  3. برنامه‌ای بنویسید که مقدار یک عدد را در سه مبنای ده‌دهی، هگزادسیمال و اکتال چاپ کند.
  4. برنامه‌ای بنویسید که یک پیام عادی را با printf و یک پیام خطا را با fprintf(stderr, ...) نمایش دهد.
اطلاعات
9
0
0
اشتراک و حمایت
جلسات دیگر
آموزش

لیست پیوندی در C چیست؟ آموزش Singly Linked...

profile نویسنده: آرتین متخصص الکترونیک

مقالات بیشتر

slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله

خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله