ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

ورودی و خروجی استاندارد(scanf و printf )

 
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming
View previous topic :: View next topic  
Author Message
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Wed Feb 23, 2005 8:20 am    Post subject: ورودی و خروجی استاندارد(scanf و printf ) Reply with quote

تابع scanf :
تابع scanf تابعی برای گرفتن یک مقدار از صفحه کلید است که انتهای آن را با دکمه Enter مشخص می شود و در صورت بروز خطا EOF توسط تابع برگردانده می شود و این تابع به صورت زیر استفاده می شود
scanf(“<عبارت1>,”<عبارت2>);

<عبارت2>آدرس متغییرهایی است که باید از ورودی خوانده شوند و <عبارت1> مشخص می کند که مقادیر ورودی چگونه باید خوانده شوند و در متغییرهای که آدرس آنها در <عبارت2> مشخص شده است قرار گیرند.<عبارت2> شامل سه نوع کاراکتر است:
الف) کاراکترهای فرمت ( d% و c% و f% و ld% و lf% و ... ) .
ب) کاراکتر فضای خالی که موجب می شود تابع scanf از فضای خالی ابتدای و یا صفر صرف نظر شود و البته کاراکترهای کنترلی نیز به عنوان فضای خالی در نظر گرفته می شود . کاراکتر فضای خالی باعث می شود تا هر تعداد فضای خالی و یا حتی صفر ها را که در ابتدای اولین کاراکتر غیر صفر یا غیر فضای خالی وجود دارد را خوانده ولی از آنها رد شود ( آنها را ذخیره نمی کند )
ج) کاراکتر غیر از فضای خالی و فرمت (%d,%d که باعث می شود یک عدد صحیح از ورودی خوانده سپس یک کاما خوانده و از آن صرف نظر شد عدد بعدی را بخواند).
نکته Exclamation:
در دستور scanf باید توجه داشت که در صورت لزوم حتما باید از علامت & استفاده کرد زیرا در صورت بروز این خطا کامپایر هیچ گونه خطایی را اعلام نمی کند ولی نتیجه شما هیچ گاه صحیح نیست !!!
تابع printf :
تابع printf برای نوشتن بروی صفحه نمایش به کار می رود و در صورت بروز خطا یک عدد منفی بر می گرداند نحوه کاربرد این تابع به صورت زیر است :
Printf(“<عبارت1>”,<عبارت2>);

در این تابع< عبارت 2 > اطلاعاتی است که باید به خروجی منتقل شوند و <عبارت1> میتواند شامل موارد زیر باشند :
الف) اطلاعاتی که باید عینا در خروجی چاپ شود .
ب) کاراکتر های تعیین کننده فرمت خروجی (n\موجب انتقال کنترل به خط بعد می شود t\موجب انتقال کنترل به 8 خط بعد می شود \\ که یک \ چاپ می کند و ... .

نکته Exclamation:
برای چاپ کارکترهای " و ' و ؟ و \ می بایست قبل از آنها یک علامت \ نوشته شود.
البته در Turbo C برای چاپ ' و ? نیازی به \ نیست
ج) کاراکتر های خروجی (%c برای چاپ کارکترها و %d برای چاپ اعداد صحیح و %f برای چاپ اعداد اعشاری و ... ).

نکتهExclamation:
الگو توابع printf و scanf در فایل سرآید ( heeder ) فایل stdio.h تعریف شده اند .


Last edited by arash on Fri Jan 20, 2006 6:42 pm; edited 6 times in total
Back to top
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Fri Nov 18, 2005 6:32 pm    Post subject: Reply with quote

نکته Exclamation:
گرفتن و نوشتن متغییر long int :
مشکلی که شاید شما هم با اون مواجه شده باشید اینکه در C اگه بخواهید عددی بزرگتر از 9999 بدید عدد منفی می شه
برای حل این مشکل کافیه که بجای d% از ld% استفاده کنید تا مشکلتون بر طرف شه
نکتهExclamation:
ld% هم در scanfو هم در printf قابل استفاده است .


Last edited by arash on Fri Nov 18, 2005 6:34 pm; edited 1 time in total
Back to top
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Fri Nov 18, 2005 6:33 pm    Post subject: Reply with quote

در مورد توابع scanf لازم به ذکر است که این تابع n\ ته یک مقدار دریافتی را بروی صفحه Echo می کند ولی این کاراکتر را از روی بافر ورودی بر نمی دارد . در زمانی که شما از تابع scanf استفاده می کنید این تابع از n\ های در اول مقادیر ورودی صرف نظر می کند و در انتها نیز یک عدد بر می گرداند که نشانگر تعداد متغییر های مقدار گرفته می باشد .
نکته Exclamation:
در صورتی که تابع scanf با اشکال برخورد کند ( مثلا به یک حرف برای یک متغییر عددی ) متغییر های قبل از آن اشکال را مقدار دهی کرده و مقدار صفر بر می گرداند
نکته Exclamation:
سعی کنید تابع scanf را با gets به کار نبرید چون تابع gets با دیدن مقدار n\ آن را به عنوان خروجی بر می گرداند. در صورتی که خیلی نیاز دارید بهتر است تابع gets را دو بار پشت سر هم بنویسید تا n\ قبلی که بر اثر scanf های قبلی به وجود آمده از بین برود.
خطا دز scanf :
در صورتی که تابع scanf با خطا رو برو شود از کارکتری که باعث خطا شده به بعد را در بافر ورودی باقی می گذارد تا در دستور ورودی بعدی آن را از روی بافر بردارد . حال اگر دستور بعدی نیز بخواهد متغییری از همان نوع را بخواند دوباره دچار خطا می شود .
برای مثال اگر ما از ورودی یک عدد بخواهیم و کاربر یک رشته وارد کند علاوه بر آنکه متغییر عددی مقدار دهی نمی شود رشته در درون بافر باقی می ماند و از هر چند دستور ( sanf("%d",&i بعدی می گزرد و هیچ کدام از آن متغییر های مقدار دهی نمی شود
برای جلوگیری از چنین BUG معمولی بهتر از ورودی رشته دریافت کرده ( چون معمولا رشته کمتر دچار اشکال می شود ) و سپس با توابع زیر رشته را به عدد مورد نظر تبدیل کنیم .( در صورتی که بخواهیم یک مقدار کوچک مثلا int از ورودی دریافت کنیم بهتر از توابعی که رشته را تبدیل به عدد long int تبدیل می کند استفاده می کنیم )
سه توابع اول :

double strtod(char *start,char **end);
long int strtol(char *start,char **end,int radix);
unsigned long strtoul(const char *start,char **end,int radix);

در این توابع متغییر start متغییری است که مخواهیم آن را به عدد تبدیل کنیم
متغییر end متغییری است که زمانی که اشکالی در تبدیل به وجود می آید آدرس جایی که در آن خطا رخ داده بر میگرداند
و متغییر radix نیز نشان می دهد ما عملیات را در چه مبنایی انجام می دهیم

سری دوم توابع :

long int atol(start);
int atoi(start);
flout atof(start);
long double _atold(start);
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum