شرح عملکرد Scanf C
شرح عملکرد Scanf C

تصویری: شرح عملکرد Scanf C

تصویری: شرح عملکرد Scanf C
تصویری: نرم افزار تعمیر و نگهداری ناوگان: 5 بهترین گزینه برای شما 2024, ممکن است
Anonim

در این مقاله، تابع scanf() به شکل کلی بدون ارجاع به استاندارد خاصی در نظر گرفته شده است، بنابراین داده‌های هر استاندارد C99، C11، C++11، C++14 در اینجا گنجانده شده است. شاید، در برخی استانداردها، عملکرد با تفاوت هایی با مطالب ارائه شده در مقاله کار می کند.

scanf تابع C - توضیحات

scanf() تابعی است که در فایل های هدر stdio.h(C) و cstdio(C++) قرار دارد که به عنوان ورودی برنامه فرمت شده نیز شناخته می شود. scanf کاراکترها را از جریان ورودی استاندارد (stdin) می خواند و آنها را مطابق فرمت تبدیل می کند، سپس آنها را روی متغیرهای مشخص شده می نویسد. فرمت - به این معنی است که داده ها پس از دریافت به فرم خاصی تبدیل می شوند. بنابراین، تابع scanf C شرح داده شده است:

scanf("%format"، &variable1[، &variable2، […])،

که در آن متغیرها به عنوان آدرس ارسال می شوند. دلیل این روش انتقال متغیرها به یک تابع واضح است: در نتیجه کار، مقداری را نشان می دهد که وجود خطا را نشان می دهد، بنابراینتنها راه تغییر مقادیر متغیرها عبور از آدرس است. همچنین، به لطف این روش، تابع می تواند داده ها را از هر نوع پردازش کند.

برخی از برنامه نویسان به دلیل تشابه با زبان های دیگر به توابعی مانند scanf() یا printf() به عنوان رویه ها اشاره می کنند.

Scanf اجازه ورود همه انواع زبان های اصلی را می دهد: char، int، float، string و غیره. در مورد متغیرهای نوع رشته، نیازی به تعیین علامت آدرس - "&" نیست، زیرا متغیر نوع رشته یک آرایه است و نام آن آدرس اولین عنصر آرایه در حافظه رایانه است..

استفاده از C در C++
استفاده از C در C++

قالب ورود داده یا رشته کنترل

با مشاهده مثال تابع scanf C از توضیحات شروع کنید.


include int main() { int x; while (scanf("%d"، &x)==1) printf("%d\n"، x); بازگشت 0; //نیاز برای سیستم های لینوکس }

قالب ورودی از چهار پارامتر زیر تشکیل شده است: نوع %[width][modifiers]. در این مورد، علامت "%" و نوع پارامترهای اجباری هستند. یعنی حداقل قالب به این صورت است: "%s"، "%d" و غیره.

به طور کلی، کاراکترهایی که رشته قالب را تشکیل می دهند به: تقسیم می شوند

  • مشخص‌کننده‌های قالب - هر چیزی که با %; شروع شود
  • جدا کردن یا فاصله کاراکترها - آنها space، tab(t)، newline (n); هستند.
  • نویسه غیر از فضای خالی.

ممکن است عملکرد ایمن نباشد.

استفاده از scanf_s() به جای scanf().

(پیام از Visual Studio)

مشخص‌کننده‌های نوع، یا قالب، یا نویسه‌های تبدیل، یا نویسه‌های کنترل

کد باینری
کد باینری

یک اعلان scanf C باید حداقل دارای یک مشخص کننده قالب باشد که در انتهای عباراتی که با "%" شروع می شوند مشخص شده است. به برنامه می‌گوید چه نوع داده‌هایی را که معمولاً از صفحه‌کلید وارد می‌کند، انتظار داشته باشد. فهرست همه فرمت‌های مشخص‌کننده در جدول زیر.

نوع معنا
1 %c برنامه منتظر یک ورودی کاراکتر است. متغیری که باید نوشته شود باید از نوع کاراکتر char باشد.
2 %d برنامه انتظار ورودی یک عدد اعشاری از نوع صحیح را دارد. متغیر باید از نوع int باشد.
3 %i برنامه انتظار ورودی یک عدد اعشاری از نوع صحیح را دارد. متغیر باید از نوع int باشد.
4 %e، %E برنامه انتظار دارد یک عدد ممیز شناور (کاما) را به صورت نمایی وارد کند. متغیر باید از نوع float باشد.
5 %f برنامه انتظار یک عدد ممیز شناور (کاما) دارد. متغیر باید از نوع float باشد.
6 %g، %G

برنامه انتظار یک عدد ممیز شناور (کاما) دارد.متغیر باید از نوع float باشد.

7 %a برنامه انتظار یک عدد ممیز شناور (کاما) دارد. متغیر باید از نوع float باشد.
8 %o برنامه انتظار یک عدد اکتال را دارد. متغیر باید از نوع int باشد.
9 %s برنامه منتظر است تا رشته ای وارد شود. رشته مجموعه‌ای از هر کاراکتر تا اولین کاراکتر جداکننده است. متغیر باید از نوع رشته باشد.
10 %x، %X برنامه منتظر یک عدد هگزادسیمال است. متغیر باید از نوع int باشد.
11 %p متغیر انتظار ورودی اشاره گر را دارد. متغیر باید از نوع اشاره گر باشد.
12 %n یک مقدار صحیح برابر با تعداد کاراکترهای خوانده شده توسط تابع scanf روی یک متغیر می نویسد.
13 %u برنامه یک عدد صحیح بدون علامت را می خواند. نوع متغیر باید عدد صحیح بدون علامت باشد.
14 %b برنامه منتظر یک عدد باینری است. متغیر باید از نوع int باشد.
15 % مجموعه کاراکترهای اسکن شده. برنامه منتظر است تا شخصیت ها وارد شوند.از استخر محدود مشخص شده بین براکت های مربع. scanf تا زمانی کار خواهد کرد که کاراکترهایی از مجموعه مشخص شده در جریان ورودی وجود داشته باشد.
16 %% علامت "%".

کاراکترها در رشته قالب

کد ++C
کد ++C

نماد ستاره ()

ستاره () پرچمی است که نشان می دهد عملیات انتساب باید سرکوب شود. یک ستاره بلافاصله بعد از علامت "%" قرار می گیرد. به عنوان مثال،


scanf("%d%c%d"، &x، &y); //نادیده گرفتن کاراکتر بین دو عدد صحیح. scanf("%s%d%s", str, str2); //عدد صحیح بین دو رشته را نادیده بگیرید.

یعنی اگر خط "45-20" را در کنسول وارد کنید، برنامه موارد زیر را انجام می دهد:

  1. متغیر "x" به مقدار 45 اختصاص می یابد.
  2. متغیر "y" به مقدار 20 اختصاص می یابد.
  3. و علامت منفی (خط) "-" به لطف "%c" نادیده گرفته می شود.

عرض (یا عرض میدان)

این یک عدد صحیح بین علامت "%" و تعیین کننده قالب است که حداکثر تعداد کاراکترهایی را برای خواندن در عملیات خواندن فعلی مشخص می کند.


scanf("%20s"، str); //خواندن 20 کاراکتر اول از جریان ورودی

چند نکته مهم وجود دارد که باید در نظر داشته باشید:

  1. scanf در صورت برخورد با یک نویسه جداکننده خاتمه می یابد، حتی اگر 20 کاراکتر را شمرده باشد.
  2. اگر بیش از 20 کاراکتر وارد شود، فقط 20 کاراکتر اول در str. نوشته می شود.

تغییر دهنده هانوع (یا دقت)

کد اسپلش
کد اسپلش

اینها پرچم‌های خاصی هستند که نوع داده‌های مورد انتظار برای ورودی را تغییر می‌دهند. پرچم در سمت چپ مشخص کننده نوع مشخص شده است:

  • L یا l (L کوچک) وقتی "l" با مشخص کننده های d، i، o، u، x استفاده می شود، پرچم به برنامه می گوید که ورودی int طولانی مورد انتظار است. هنگام استفاده از "l" با مشخص کننده e یا f، پرچم به برنامه می گوید که باید مقدار دو برابری را انتظار داشته باشد. استفاده از "L" به برنامه می گوید که انتظار می رود دو برابر طولانی شود. استفاده از "l" با مشخص کننده های "c" و "s" به برنامه می گوید که کاراکترهای دو بایتی مانند wchar_t مورد انتظار هستند. برای مثال، "%lc"، "%ls"، "%l[asd]".
  • h پرچمی است که نوع کوتاه را نشان می دهد.
  • hh - نشان می دهد که متغیر یک اشاره گر به یک علامت علامت یا مقدار کاراکتر بدون علامت است. پرچم را می توان با مشخص کننده های d, i, o, u, x, n استفاده کرد.
  • ll (دو L کوچک) - نشان می دهد که متغیر نشانگر مقداری از نوع signed long long int یا unsigned long long int است. پرچم با مشخص کننده ها استفاده می شود: d, i, o, u, x, n.
  • j - نشان می دهد که متغیر یک اشاره گر به نوع intmax_t یا uintmax_t از فایل هدر stdint.h است. مورد استفاده با مشخص کننده ها: d, i, o, u, x, n.
  • z - نشان می دهد که متغیر یک اشاره گر به نوع size_t است که تعریف آن در stddef.h است. مورد استفاده با مشخص کننده ها: d, i, o, u, x, n.
  • t - نشان می دهد که متغیر یک اشاره گر به نوع ptrdiff_t است. تعریف روشن استاین نوع در stddef.h است. مورد استفاده با مشخص کننده ها: d, i, o, u, x, n.

به طور واضح تر، تصویر با اصلاح کننده ها را می توان به عنوان یک جدول نشان داد. چنین توصیفی از scanf C برای برنامه نویسان واضح تر خواهد بود.

Type Specifiers و Modifiers
Type Specifiers و Modifiers

کاراکترهای دیگر

هر نویسه ای که در قالب با آن مواجه می شوید کنار گذاشته می شود. در عین حال، باید توجه داشت که وجود کاراکترهای خالی یا جداکننده (خط جدید، فاصله، تب) در رشته کنترل می‌تواند منجر به رفتار متفاوت تابع شود. در یک نسخه، scanf() بدون ذخیره کردن تعداد جداکننده می خواند تا زمانی که با کاراکتری غیر از جداکننده مواجه شود، و در نسخه دیگر، فاصله ها (فقط آنها) نقشی ندارند و عبارت "%d + %d" را بازی نمی کند. معادل "% d+%d" است.

نمونه کد C++
نمونه کد C++

نمونه

بیایید به چند مثال نگاه کنیم تا به شما کمک کند فکر کنید و نحوه عملکرد عملکرد را بهتر درک کنید.


scanf("%3s", str); //اگر رشته "1d2s3d1;3" را در کنسول وارد کنید، فقط "1d2" در str scanf نوشته می شود("%dminus%d", &x, &y); //کاراکترهای منهای بین دو عدد حذف خواهند شد scanf("%5[0-9]", str); // کاراکترها در str وارد می شوند تا زمانی که 5 کاراکتر وجود داشته باشد و کاراکترها اعدادی از 0 تا 9 باشند. scanf("%lf", &d); //expect double input scanf("%hd", &x); //تعداد مورد انتظار از نوع short scanf("%hu", &y); //expect number unsigned short scanf("lx", &z); //تعداد مورد انتظار از نوع long int

ازمثال‌های زیر نشان می‌دهند که چگونه عدد مورد انتظار با استفاده از نمادهای مختلف تغییر می‌کند.

scanf C - توضیحات برای مبتدیان

این بخش برای مبتدیان مفید خواهد بود. اغلب شما نیاز دارید که شرح کاملی از scanf C را در دسترس نداشته باشید، بلکه به جزئیات نحوه عملکرد عملکرد نیاز دارید.

  • این ویژگی تا حدودی منسوخ شده است. چندین پیاده سازی مختلف در کتابخانه های نسخه های مختلف وجود دارد. به عنوان مثال، عملکرد بهبود یافته scanf S C، که شرح آن را می توان در وب سایت مایکروسافت یافت.
  • تعداد مشخص‌کننده‌ها در قالب باید با تعداد آرگومان‌های ارسال شده به تابع مطابقت داشته باشد.
  • عناصر جریان ورودی باید فقط با کاراکترهای جداکننده از هم جدا شوند: فاصله، برگه، خط جدید. کاما، نقطه ویرگول، نقطه و غیره - این کاراکترها جداکننده تابع scanf() نیستند.
  • اگر scanf با یک کاراکتر جداکننده مواجه شود، ورودی متوقف خواهد شد. اگر بیش از یک متغیر برای خواندن وجود داشته باشد، scanf به خواندن متغیر بعدی می‌رود.
  • کوچکترین ناهماهنگی در قالب داده های ورودی منجر به نتایج غیرقابل پیش بینی برنامه می شود. خوب، اگر برنامه فقط با یک خطا به پایان برسد. اما اغلب برنامه به کار خود ادامه می دهد و آن را اشتباه انجام می دهد.
  • scanf("%20s…"، …); اگر جریان ورودی بیش از 20 کاراکتر باشد، scanf 20 کاراکتر اول را می خواند و در صورت مشخص شدن یکی، متغیر بعدی را لغو می کند یا به خواندن ادامه می دهد. در این حالت، تماس بعدی به scanf به خواندن جریان ورودی از نقطه‌ای که کار تماس قبلی با scanf متوقف شده است، ادامه می‌دهد. اگر هنگام خواندن 20 اولکاراکترها، با یک کاراکتر جداکننده مواجه می‌شوید، scanf متغیر بعدی را قطع می‌کند یا به خواندن ادامه می‌دهد، حتی اگر 20 کاراکتر را برای متغیر اول نخوانده باشد. در این حالت، تمام کاراکترهای خوانده نشده به متغیر بعدی متصل می شوند.
  • اگر مجموعه کاراکترهای اسکن شده با "^" شروع شود، scanf داده ها را تا زمانی که با یک کاراکتر جداکننده یا یک کاراکتر از مجموعه مواجه شود، می خواند. برای مثال، "%[^A-E1-5]" داده ها را از جریان می خواند تا زمانی که یکی از نویسه های انگلیسی بزرگ از A تا E یا یکی از اعداد 1 تا 5 مواجه شود.
  • تابع scanf C، همانطور که توضیح داده شد، عددی برابر با تعداد موفقیت آمیز نوشتن متغیرها برمی گرداند. اگر scanf 3 متغیر بنویسد، نتیجه موفقیت آمیز تابع عدد 3 را برمی گرداند. اگر scanf نتوانست هیچ متغیری را بنویسد، نتیجه 0 خواهد بود. و در نهایت، اگر scanf به دلایلی اصلاً شروع نشد، نتیجه EOF خواهد بود.
  • اگر تابع scanf() به اشتباه پایان یافته باشد. به عنوان مثال، scanf("%d"، &x) - یک عدد مورد انتظار بود، اما کاراکترها به عنوان ورودی دریافت شدند. فراخوانی scanf() بعدی از نقطه‌ای در جریان ورودی که فراخوانی تابع قبلی به پایان رسید شروع می‌شود. برای غلبه بر این مشکل، باید از شر شخصیت های مشکل خلاص شوید. این را می توان برای مثال با فراخوانی scanf("%s") انجام داد. یعنی تابع یک رشته از کاراکترها را می خواند و آن را دور می اندازد. در این راه دشوار، می توانید به وارد کردن داده های لازم ادامه دهید.
  • در برخی از پیاده سازی های scanf()، "-" در مجموعه کاراکترهای اسکن شده مجاز نیست.
  • مشخص کننده "%c" هر کاراکتر از جریان را می خواند. یعنی کاراکتر جداکننده را هم می خواند. برای رد شدن از کاراکتر جداکننده و ادامه خواندن کاراکتر مورد نظر، می توانید از "%1s" استفاده کنید.
  • هنگام استفاده از مشخص کننده "c"، استفاده از عرض "%10c" مجاز است، اما پس از آن آرایه ای از عناصر از نوع char باید به عنوان یک متغیر به تابع scanf ارسال شود.
  • "%[a-z]" به معنای "همه حروف کوچک الفبای انگلیسی" است، و "%[z-a]" به معنای فقط 3 کاراکتر است: "z"، "a"، "-". به عبارت دیگر، کاراکتر "-" تنها در صورتی به معنای یک محدوده است که بین دو کاراکتر به ترتیب صحیح باشد. اگر "-" در انتهای یک عبارت، در ابتدا، یا در ترتیب اشتباه کاراکترهای دو طرف آنها باشد، آنگاه فقط یک کاراکتر خط فاصله است، نه یک محدوده.
کد ++C
کد ++C

نتیجه گیری

این توضیحات scanf C را به پایان می رساند. این یک ویژگی مفید برای کار در برنامه های کوچک و هنگام استفاده از روش برنامه نویسی رویه ای است. با این حال، نقطه ضعف اصلی تعداد خطاهای غیرقابل پیش بینی است که می تواند هنگام استفاده از scanf رخ دهد. بنابراین، شرح scanf C هنگام برنامه نویسی بهتر است جلوی چشمان شما باشد. در پروژه های بزرگ حرفه ای از iostream ها استفاده می شود، به دلیل اینکه قابلیت های سطح بالاتری دارند، بهتر می توانند خطاها را بگیرند و رسیدگی کنند و همچنین با حجم قابل توجهی از اطلاعات کار می کنند. همچنین لازم به ذکر است که شرح scanf C به زبان روسی در بسیاری از منابع شبکه و همچنین نمونه هایی از آن موجود است.استفاده، با توجه به سن عملکرد. بنابراین، در صورت لزوم، همیشه می توانید پاسخ را در انجمن های موضوعی بیابید.

توصیه شده: