انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: نحوه کار تابع scanf  (دفعات بازدید: 563 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین 🇬🇧بریتانیای کبیر🇬🇧

  • High Hero Member
  • *
  • ارسال: 2658
  • جنسیت : پسر
  • GOD SAVE THE KING/QUEEN
نحوه کار تابع scanf
« : 04 آبان 1401، 10:10 ب‌ظ »
اصلا کلا مغز داغ کرده با این کارای scanf.
چرا اگه قبل از fgets  از تابع scanf  استفاده  کرده باشیم باید آخر رشته ثابت scanf  یک فاصله بذاریم و چرا این fgets رو مخ اگه کل آرایه پر نشه ته رشته یه n\ می‌‌‌ذاره؟
و درضمن چرا مثلا در حلقه scanf برای هر بار دریافت عدد در این خط کد نیاز به enter نداره؟
scanf("%1d",&num[n1]);
« آخرین ویرایش: 04 آبان 1401، 10:16 ب‌ظ توسط Queen Elizabeth II »
🇬🇧🏴󠁧󠁢󠁥󠁮󠁧󠁿🏴󠁧󠁢󠁷󠁬󠁳󠁿🏴󠁧󠁢󠁳󠁣󠁴󠁿🇬🇧

آنلاین esmaeelE

  • ناظر انجمن
  • *
  • ارسال: 1270
  • جنسیت : پسر
پاسخ : نحوه کار تابع scanf
« پاسخ #1 : 09 آبان 1401، 04:50 ب‌ظ »
برای اینکه درگیر مشکلات scanf نشید ازش استفاده نکنید.


چرا scanf گاهی اوقات رفتار عجیب دارد؟

نمونهٔ زیر را ببینید.

زمانی که مشخصه‌های قالب‌بندی (format specifier) که درون scanf استفاده شده است به درستی با ورودی هماهنگ نشود اجرای تابع scanf با خطا روبه رو می‌شود که این مورد را می‌توانید در مقدار بازگشتی آن که صفر است ببینید.

از طرفی مقدار خوانده شده از ورودی توسط تابع scanf به درستی مصرف نمی‌شود و کماکان در بافر ورودی باقی می‌ماند.

در اینجا اگر یکبار دیگر در ادامهٔ‌ برنامه scanf فراخوانی شود آن مقدار به عنوان ورودی به تابع داده می‌شود.

در هر دو مورد می‌توان برای جلوگیری از رفتار غیر قابل پیشبینی بررسی کنید اگر اجرای تابع scanf با خطا همراه بود بافر باقی مانده توسط getchar مصرف شود.



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

نقل‌قول
       fgets() reads in at most one less than size characters from stream and stores them into the
       buffer pointed to by s.  Reading stops after an EOF or a newline.  If a newline is read, it
       is stored into the buffer.  A terminating null byte ('\0') is stored after the last charac‐
       ter in the buffer.

در اینجا فایل خط به خط در یک بافر خوانده شده و سپس مقادیر لازم در هر خط در متغیرهای محلی ذخیره شده اند.

« آخرین ویرایش: 09 آبان 1401، 05:03 ب‌ظ توسط esmaeelE »