این تابع برای شمارش یک کاراکتر روی خروجی استاندارد که معمولاً صفحه نمایش است به کار میرود و نقش آن مشابه تابع getchar اما در جهت عکس است. طبیعی است کاراکتری که انتقال مییابد به صورت ثابت کاراکتر یا متغیری از نوع کاراکتر که آرگومان تابع مزبور است به کار میرود. شکل کلی این تابع به صورت زیر است.
putchar (character variable) ;
; (متغیر کاراکتری) putchar
البته میتوان ثابت کاراکتری را نیز به عنوان آرگومان تابع مزبور به کار برد. این تابع با استفاده از آرایه یک رشته را در خروجی چاپ میکند.
مثال ۳ـ۱۳ برنامه زیر به تدریج در هر بار یک کاراکتر میخواند و سپس آن را در خروجی چاپ میکند.
#include<stdio.h>
main ()
{
char ch ;
while (1)
{
ch = getchar() ;
putchar(ch) ;
}
}
در این برنامه ch کاراکتر اعلان شده است. هر بار که یک کاراکتر از طریق دستگاه ورودی استاندارد خوانده میشود، به همان طریق به خروجی انتقال مییابد. اما به لحاظ اینکه عبارت مربوط به while، یعنی مقدار داخل پرانتز بعد از while، برابر “۱” و همیشه غیرصفر است، براساس قوانین زبان C، این عبارت همیشه درست یا true است. بنابراین ساختار while(1) حلقهای بینهایت است و تنها راه متوقف ساختن برنامه وقفهای است که با کلیدهای control-c عملی خواهد شد.
راه دیگر برای نوشتن برنامه بالا به صورت زیر است.
#include<stdio.h>
main ()
{
int ch ;
while ((ch=getchar()) != EOF)
putchar(ch) ;
}
این برنامه ترکیب دو عمل در یک دستور را در حلقه نشان میدهد. گفتیم EOF در برنامه بالا علامت سمبولیک پایان فایل است. آنچه در واقعیت نشانه پایان فایل را نشان میدهد تابع سیستم است. برای این کار اغلب عدد ۱- به کار میرود، ولی سیستمهای مختلف ممکن است مقادیر متفاوتی داشته باشند. با گنجانیدن فایل stdio.h و به کار بردن ثابت سمبولیکی EOF، برنامه را قابل حمل یا قابل اجرا ساختهایم. یعنی، فایل مبنا روی سیستمهای مختلف بدون تغییر اجرا میشود.
ملاحظه میکنید که در روش اخیر، متغیر ch به جای char به صورت int معرفی شده است. هرچه برای نشان دادن پایان فایل به کار میرود، نمیتواند مقداری باشد که یک کاراکتر را معرفی نماید. حال چون C بهصورت int معرفی شده است، میتواند مقادیر تمام کاراکترهای ممکن و همین طور مقدار ویژه EOF را نگهداری کند.
همان طور که گفتیم، هر دو تابع getchar و putchar در فایل stdio.h تعریف شدهاند و ممکن است در بعضی سیستمها در فایلهای دیگری نیز مانند فایل conio.h تعریف شده باشند.
مثال ۳ـ۱۴ برنامه زیر یک خط متن را از ورودی با حروف کوچک دریافت و آن را به حروف بزرگ تبدیل میکند.
#include<stdio.h>
main ()
{
char line[80] ;
int count , k ;
/* read in the line */
for (k=0 ; (line[k]=getchar())!=’\n’ ; + + k) ;
count = k ;
/* write out the line in upper-case */
for(k=0 ; k<count ; + +k)
putchar(toupper(line[k])) ;
}
در برنامه بالا از حلقه for و تابع کتابخانهای toupper استفاده شده است. نقش این تابع آن است که حروف کوچک را به بزرگ تبدیل میکند. بنابراین اگر حروف ورودی هنگام تایپ حروف بزرگ یا ارقام و مشابه آن باشند، به شکل اولیه خود نمایش داده خواهند شد. برای مثال اگر ورودی به صورت Advanced programming باشد، خروجی به صورت ADVANCED PROGRAMMING خواهد بود.
مثال ۳ـ۱۵ برنامه زیر یک خط از متن را میخواند و در آن هر کاراکتر را (به غیر از کاراکتر فضای خالی یا space) به کاراکتر بعدی تبدیل میکند و نمایش میدهد (درواقع متن را به شکلی به صورت رمز در میآورد و نمایش میدهد).
#include<stdio.h>
#define space ’ ’
main ()
{
char ch ;
ch = getchar () ; /* read a character from i/o */
while(ch!=’\n’) /*while not end of line */
{
if (ch= =space) /* leave the space */
putchar(ch) ; /* character unchanged */
else
putchar(ch+1) ; /* change other characters */
ch = getchar() ; /* get next character */
}
}
برای مثال اگر computer science2 ورودی باشد، خروجی dpnqvufs tdjfodf3 خواهد بود.
با ترکیب دو دستور خواندن و تست کردن پایان متن در یک عبارت، برنامه مزبور را میتوان به صورت ساده و فشردهتر زیر نوشت.
#include<stdio.h>
#define space ’ ’
main ()
{
char ch ;
while ((ch=getchar()) != ’\n’)
{
if (ch = = space) /* leave the space */
putchar(ch) ; /* character unchanged */
else
putchar(ch+1) ; /* change other characters */
}
}
که در این برنامه دستور while ((ch=getchar()) != ’\n’) ترکیب دو عمل در یک دستور را نشان میدهد که روشی متداول در زبان C است. این دو عمل آن است که اول به کمک تابع getchar مقداری به ch نسبت داده میشود و سپس مقدار ch با کاراکتر خط جدید مقایسه میشود. وجود پرانتز دور عبارت ch = getchar() آن را اپراند چپ اپراتور != میسازد. اگر آن را حذف کنیم نتیجه مطلوب به دست نمیآید زیرا اپراتور != نسبت به اپراتور = تقدم بالاتری دارد. بنابراین اگر دستور مزبور را به صورت while (ch = getchar()!= ’\n’) بنویسیم، اول عبارت ’\n’ getchar()!= ارزیابی میشود که عبارتی رابطهای است (بنابراین کاراکتر خط جدید برنمیگرداند، بلکه یک مقدار برمیگرداند) که ارزش آن یک یا صفر (درست یا نادرست یعنی true یا false) خواهد بود. سپس این مقدار به ch نسبت داده میشود که هدف مورد نظر ما را از دستور مزبور تأمین نمیکند.
مثال ۳ـ۱۶ برنامه زیر کاراکترها را از طریق ورودی صفحهکلید دریافت میکند و آنها را به صفحه نمایش میفرستد. این برنامه با دریافت کاراکتر $ از ورودی خاتمه میپذیرد.
#include<stdio.h>
main ()
{
char ch ;
while ((ch=getchar()) != ’$’)
putchar(ch) ;
}
در این برنامه نیز از ترکیب دو دستور در یک دستور در درون حلقه while استفاده شده است.
در زبان C علاوه بر تابع getchar دو تابع getch و getche نیز برای خواندن یک کاراکتر از ورودی به کار میرود که در ادامه بررسی میکنیم.