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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: 🇬🇧بریتانیای کبیر🇬🇧 در 04 آبان 1401، 10:10 ب‌ظ

عنوان: نحوه کار تابع scanf
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 04 آبان 1401، 10:10 ب‌ظ
اصلا کلا مغز داغ کرده با این کارای scanf.
چرا اگه قبل از fgets  از تابع scanf  استفاده  کرده باشیم باید آخر رشته ثابت scanf  یک فاصله بذاریم و چرا این fgets رو مخ اگه کل آرایه پر نشه ته رشته یه n\ می‌‌‌ذاره؟
و درضمن چرا مثلا در حلقه scanf برای هر بار دریافت عدد در این خط کد نیاز به enter نداره؟
scanf("%1d",&num[n1]);
عنوان: پاسخ : نحوه کار تابع scanf
ارسال شده توسط: esmaeelE در 09 آبان 1401، 04:50 ب‌ظ
برای اینکه درگیر مشکلات scanf نشید ازش استفاده نکنید.

https://stackoverflow.com/a/3852844/7508077

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

نمونهٔ زیر را ببینید.
https://stackoverflow.com/a/59041782/7508077

زمانی که مشخصه‌های قالب‌بندی (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.

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

https://stackoverflow.com/a/59806256/7508077