منبع اصلی نوشتار زیر در این لینک قرار دارد

ورودی و خروجی در زبان C

هر برنامه یک سری ورودی را دریافت و یک سری خروجی را ایجاد می کند. در سیستم عامل های شبه یونیکسی به صورت پیش فرض برنامه از ورودی استاندارد (Standard Input – Stdin) ورودی را دریافت می کند و خروجی را بر روی خروجی استاندارد (Standard Output – Stdout) می نویسد. حالت دیگر بروز خطا (Error) است که به صورت پیشفرض بر روی خطای استاندارد (Standard Error – Stderr) نوشته می شود. به طور کلی سه روش برای دریافت ورودی و نمایش خروجی وجود دارد.

  • دریافت ورودی از خط فرمان و نوشتن بر روی خط فرمان.
  • خواندن ورودی از فایل و نوشتن خروجی درون فایل.
  • دریافت ورودی و نمایش خروجی توسط رابط های گرافیکی (GUI).

مفهوم Redirection‌ در سیستم عامل های یونیکسی

 زبان C‌ دارای مجموعه ای توابع کتابخانه ای است که اجازه می دهد تا ورودی را از خط فرمان دریافت و خروجی را بر روی خط فرمان بنویسیم. همچنین توابعی برای خواندن از فایل و نوشتن بر روی فایل وجود دارد. در این مطلب تنها آن توابعی گفته می شوند که از خط فرمان ورودی می گیرند و بر روی خط فرمان خروجی را نمایش می دهند.

توابع ()scanf‌ و ()printf برای دریافت ورودی و نمایش خروجی

 در زبان برنامه نویسی C دو تابع ()scanf‌ و ()printf‌ به ترتیب برای دریافت ورودی و نمایش خروجی استفاده می شوند. توابع دیگری نیز به غیر از این دو تابع وجود دارند ولی این دو تابع بسیار پر استفاده و کاربردی هستند.

تابع ()scanf یک ورودی فرمت شده را از ورودی استاندارد (Stdin) دریافت می کند. با استفاده از این تابع می توانیم مقادیر صحیح، اعشاری، کاراکتر و آرایه را دریافت کنیم. فرم کلی این تابع به صورت زیر است :

int scanf(const char *format, argument list)

format string یک رشته است که می تواند شامل یا چند مورد ۱) کارکتر فضای خالی (مانند Space و Tab)، ۲) کارکترهای غیر فضای خالی (حروف، اعداد و کاراکترهای غیر عددی و حرفی) و ۳) کاراکترهای فرمت باشد. format string باید میان دو double quotes قرار بگیرد. کاراکترهای فرمت تعیین می کنند که چه نوعِ داده ای باید از ورودی دریافت شود. مهمترین این کارکترها عبارتند از :

  • c% برای دریافت کاراکتر از ورودی.
  • d% برای دریافت عدد صحیح از ورودی.
  • f%  برای دریافت عدد ممیز شناور (عدد اعشاری) از ورودی.
  • s%‌ برای دریافت رشته از ورودی.

argument list فهرستی از متغیرهایی است که با ویرگول (,)  از هم جدا شده اند و می خواهیم از ورودی برای آنها مقدار دریاف کنیم. دو نکته در مورد دریافت ورودی برای هر متغیر وجود دارد.

  • باید ترتیب کاراکترهای فرمت با نوع متغیرها در بخش argument list‌ متناسب باشند.
  • باید آدرس متغیر را به تابع scanf ارسال کنیم بنابراین پیش از نام هر متغیر در بخش argument list یک علامت &‌ قرار می گیرد.

برای این باید آدرس متغیر را ارسل کنیم تا دستور ()scanf‌ بتواند مقدار خوانده شده را در فضای حافظه اختصاص داده شده به متغیر قرار دهد. توجه کنید که با ایجاد یک متغیر کامپایلر فضایی از حافظه اصلی (RAM) را به آن اختصاص می دهد.

در مثال زیر چهار متغیر به ترتیب از نوع cahr, int, float و double تعریف کرده ایم و در بخش format string که بین دو double qoutes آمده است کاراکترهای فرمت به ترتیب برای وارد کردن نوع char, int, float و double  آورده شده اند.در بخش argument list نیز مطابق با ترتیب کاراکترهای فرمت، آدرس متغیرهای هم نوعِ کارکترهای فرمت فهرست شده اند.

همچنین میان کاراکترهای کنترلی یک Sapce (کاراکتر فضای خالی) وجود دارد که این فضای خالی باعث می شود در خط فرمان هر ورودی از ورودی قبلی خود با یک Space جدا و مشخص شود.

char c;
int i;
float f;
double d;    
scanf("%c %d %f %f", &c, &i, &f, &d);

در صورتی که ترتیب کاراکترهای فرمت و فهرست آدرس متغیرها همسان نباشد باعث بروز خطا یا وارد شدن اطلاعات نادرست می شود. تابع ()scanf‌ تعداد کارکترهای ورودی (یا به عبارتی تعداد ورودی) را باز می گرداند. قطعه کد زیر تعداد ورودی در متغیر count‌ از نوع int ذخیره می شود و سپس توسط تابع ()printf چاپ می شود.

int main()
{
    //printf("Current Directory is: %s\n", get_pwd());

    char c;
    int i;
    float f;
    double d;

    int count = scanf("%c %d %f %f", &c, &i, &f, &d);
    printf("Number of input characters is: %d", count);

}

قطعه کد ۱