نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • برنامه ها
  • خواندن یک فایل با استفاده از scanf در c. آموزش و استفاده از توابع printf() و scanf().

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

] SCANF #شامل int scanf(format-string[[, argument...]]); char *format-string. رشته کنترل فرمت شرح. تابع scanf داده ها را از جریان استاندارد stdin به مکان مشخص شده توسط آرگومان ها. هر آرگومان باید یک اشاره گر به یک مقدار با نوعی باشد که با نوع مشخص شده در رشته قالب مطابقت داشته باشد. رشته فرمت تبدیل فیلدهای ورودی را کنترل می کند. این رشته ممکن است شامل موارد زیر باشد: کاراکترهای "Whitespace", i.e. نویسه فاصله " "، tab \t، خط جدید"\n". برای توابع اسکنکاراکتر space مشخص می‌کند که تمام کاراکترهای فاصله بعدی که تا اولین کاراکتر غیر فاصله وارد می‌شوند خوانده می‌شوند، اما ذخیره نمی‌شوند. همانطور که شما تایپ می کنید، یک کاراکتر فاصله در رشته قالب با هر عددی، از جمله 0، یا هر ترکیبی از کاراکترهای فاصله مطابقت دارد. هر کاراکتر کنترلی که علامت فاصله یا علامت درصد نیست. سپس با استفاده از این نماد، تابع scanf خوانده می شود، اما بدون ذخیره نمادهای کنترلی مربوطه. اگر شخصیت بعدی در با کاراکترهای کنترل مطابقت ندارد، scanf کار خود را خاتمه می دهد. مشخصات قالب، با علامت % وارد شده است. در این حالت scanf کاراکترهای وارد شده را می خواند و به مقادیر ورودی تبدیل می کند. از این نوع، و مقادیر توسط آرگومان های مربوطه از لیست آرگومان تعیین می شوند. رشته قالب از چپ به راست خوانده می شود. فرض بر این است که کاراکترهای خارج از مشخصات قالب با توالی کاراکترها در stdin مطابقت دارند. این کاراکترهای منطبق در stdin اسکن می شوند اما به خاطر نمی آیند. اگر یک کاراکتر در stdin با رشته قالب تضاد داشته باشد، scanf خاتمه می یابد. این کاراکتر متضاد در stdin باقی می ماند زیرا قابل خواندن نیست. وقتی با اولین مشخصات قالب مواجه شد، سپس مقدار اولین فیلد ورودی مطابق مشخصات قالب تبدیل شده و در مکانی که توسط آرگومان اول مشخص شده است ذخیره می شود. طبق مشخصات فرمت دوم، فیلد ورودی دوم توسط آرگومان دوم تبدیل و ذخیره می شود. و به همین ترتیب تا پایان خط فرمت. فیلد ورودی به اولین کاراکتر "فضای سفید" یا اولین نویسه ای که نمی تواند به فرمت مشخص شده تبدیل شود یا مورد رسیدن محدود است. عرض فیلدها، که اول می آید. اگر مشخصات قالب انتخابی آرگومان های بیشتری از حد مورد نیاز داشته باشد، آرگومان های اضافی نادیده گرفته می شوند. مشخصات فرمت دارای فرم زیر است. % <.precision><{F:N:h:I}>. هر فیلد در قالب مشخصات یک کاراکتر یا عدد جداگانه است که گزینه قالب متفاوتی را بیان می کند. کاراکتر نوع که بعد از آخرین مورد ظاهر می شود فیلد اختیاریقالب، نوع فیلد ورودی را به صورت کاراکتر، رشته یا عددی تعیین می کند. ساده ترین فرمت مشخصات فقط شامل کاراکتر علامت درصد و کاراکتر نوع (مثلا %S) است. هر فیلد مشخصات فرمت در زیر توضیح داده شده است. اگر پس از علامت درصد، کاراکتری که یک کاراکتر کنترل قالب نیست، دنبال شود، این کاراکتر و کاراکترهای پس از آن، تا علامت % بعدی، به‌عنوان یک دنباله منظم از کاراکترها در نظر گرفته می‌شوند، یعنی. دنباله ای که باید وارد شود به عنوان مثال، برای وارد کردن کاراکتر علامت %، از %% استفاده کنید. یک ستاره (*) به دنبال علامت %، تعیین فیلد ورودی بعدی را که به عنوان یک فیلد تعریف شده بر اساس نوع مشخص شده است، حذف می کند. این فیلد اسکن می شود اما به خاطر نمی ماند. Widht یک عدد صحیح اعشاری مثبت است و حداکثر تعداد ممکن از کاراکترهای خوانده شده از stdin را کنترل می کند. فقط آن دسته از کاراکترهایی که از عرض تجاوز نمی کنند توسط آرگومان مربوطه تبدیل و ذخیره می شوند. اگر عرض شامل کاراکترهای "فضای سفید" باشد، به عنوان مثال. فاصله ها، برگه ها یا خطوط جدید، تا زمانی که به عرض نرسیده باشند، به فرمت انتخاب شده تبدیل نمی شوند. پیشوندهای اختیاری F و N به قرارداد آدرس دهی پیش فرض مدل های حافظه استفاده شده احترام نمی گذارند. F می تواند پیشوندی برای آرگومان باشد که به یک شی دور اشاره می کند. و N - به جسم نزدیک. پیشوند اختیاری l نشان می دهد که نسخه طولانی در حال استفاده است. و پیشوند h استفاده از نسخه کوتاه را نشان می دهد. آرگومان مربوطه به یک شی بلند یا دوتایی (با استفاده از پیشوند l) یا یک شی کوتاه (با استفاده از پیشوند h) اشاره می کند. اصلاح کننده های l و h را می توان همراه با انواع کاراکترهای d، i، o، x، u استفاده کرد. اصلاح کننده l را می توان با کاراکترهای نوع e و f نیز استفاده کرد. اگر نوع دیگری مشخص شده باشد، اصلاح کننده های l و h نادیده گرفته می شوند. نمادهای نوع و معانی آنها در جدول R.4 توضیح داده شده است. جدول R.4 انواع کاراکتر scanf نماد نوع در نظر گرفته شده ورودی استدلال نوع d نشانگر عدد صحیح اعشاری به int. D نشانگر عدد صحیح اعشاری به long. o نشانگر عدد صحیح هشتگانه به int. O نشانگر عدد صحیح هشتی به long. x نشانگر هگزادسیمال به int. عدد صحیح X نشانگر هگزادسیمال به long. عدد صحیح i اعشاری، oc یک اشاره گر به int است. عدد صحیح مریک یا هگزا دسیمال I اعشاری، نشانگر هشتی به بلند. عدد صحیح متریک یا هگزادسیمال u نشانگر اعشاری بدون علامت به عدد صحیح اعشاری بدون علامت int. نشانگر اعشاری بدون علامت U به یک عدد صحیح بدون علامت طولانی. e نشانگر شناور به یک شناور f حاوی یک علامت اختیاری ("+"، "-")، یک یا چند رقم اعشاری، معمولاً حاوی یک نقطه اعشار و یک توان ("e" "، "E")، که بعد از آن نوشته می شود. مقدار عدد صحیح امضا شده ج نمادین است. اشاره گر به نویسه ها: فاصله، برگه یا خط جدید، به اصطلاح کاراکترهای "فضای سفید" که معمولا نادیده گرفته می شوند، زمانی که این نوع مشخص شده باشد خوانده می شوند. برای خواندن نویسه بدون فضای سفید بعدی، از ترکیب %1s استفاده کنید. s رشته یک اشاره گر به یک آرایه نویسه به اندازه کافی بزرگ برای فیلد ورودی، با نویسه پایانی تهی "\0" به طور خودکار ظاهر می شود. n خواندن هنگام وارد کردن اشاره گر به int، در از جریان یا که بافر روی آن نوشته شده رخ نمی دهد، عدد با موفقیت خوانده می شود. کاراکترهای داده از جریان یا بافر، تا آنهایی که در تماس scanf مشخص شده است. مقدار p در نشانگر فرم به far- xxxx: yyyy، گروه داده کجاست. ارقام x و y ارقام هگزادسیمال بزرگ هستند. هنگام خواندن رشته هایی که با فضای خالی مشخص نشده اند، مجموعه کاراکترهای داخل کروشه باید با رشته نوع s جایگزین شود. فیلد ورودی مربوطه تا اولین کاراکتر که در مجموعه نویسه‌های محدود شده با کروشه مربع وجود ندارد خوانده می‌شود. اگر اولین کاراکتر در این مجموعه caret (^) باشد، نتیجه ذخیره می شود: فیلد ورودی تا اولین کاراکتر که در این مجموعه کاراکترها گنجانده نشده است خوانده می شود. برای به خاطر سپردن یک رشته بدون کاراکتر تهی "\0"، از مشخصات %nc استفاده می شود که n یک عدد صحیح اعشاری است. در این مورد، نوع کاراکتر s آرگومانی را تعریف می کند که به آرایه ای از کاراکترها اشاره می کند. n کاراکتر بعدی از جریان ورودی به یک مکان خاص خوانده می شود و کاراکتر null نوشته نمی شود. تابع scanf هر فیلد ورودی را کاراکتر به کاراکتر اسکن می کند. در صورت رسیدن به فیلد عرض، می‌تواند خواندن یک فیلد را با رسیدن به یک کاراکتر فاصله متوقف کند. یا کاراکتر ورودی بعدی را نمی توان با توجه به فرمت مشخص شده تبدیل کرد. یا کاراکتر بعدی با کاراکتر مربوطه خود در تضاد است خط کنترلقالب؛ یا کاراکتر بعدی در مجموعه کاراکترهای انتخاب شده نیست. هنگامی که فرآیند پایان خواندن اجباری رخ می دهد، فیلد ورودی بعدی از همان اولین کاراکتر متضاد در نظر گرفته می شود. این کاراکتر، در صورت وجود، خوانده نشده، یا به عنوان اولین کاراکتر فیلد ورودی بعدی یا به عنوان اولین کاراکتر در خواندن های بعدی از stdin در نظر گرفته می شود. ارزش برگشتی این تابع تعداد فیلدهایی که با موفقیت تبدیل و تخصیص یافته اند را برمی گرداند. مقدار بازگشتی شامل تعداد فیلدهای خوانده شده اما تخصیص نیافته نیست. تلاش برای خواندن انتهای فایل EOF را برمی گرداند. مقدار بازگشتی 0 نشان می دهد که هیچ فیلدی اختصاص داده نشده است. fscanf، printf، sscanf، vfprintf، vprintf، vsprintf را نیز ببینید. مثال 1. #شامل int i; float fp; char c, s; scanf("%d %f %c %s"، &i، &fp، و c، s); /* ورودی داده های مختلف */. مثال 2. #شامل main () /* تبدیل عدد صحیح هگزا دسیمال ** یا اکتال به ** عدد صحیح اعشاری */ ( int numassigned, val; pintf("# هگزادسیمال یا اکتال را وارد کنید، یا 00 را به گیت:\n")؛ انجام دهید ( printf("# = "); numassigned = scanf("%i"، &val); printf("# اعشاری = %i\n"، nal); ) while (val && numassigned); /* انتهای حلقه اگر مقدار ورودی 00 باشد، یا اگر scanf قادر به اختصاص فیلد */ نباشد. سپس خروجی به صورت زیر خواهد بود. هگزادسیمال یا اکتال #، یا 00 را به گیت وارد کنید: # = 0xf اعشاری # = 15 # = 0100 اعشاری # = 64 # = 00 اعشاری # = 0.

وقتی همه داده‌ها داده می‌شوند و نیازی به وارد کردن چیزی نیست، خیلی خوب است. اما، باور کنید، این عملا هرگز اتفاق نمی افتد. به یاد داشته باشید در مدرسه، زمانی که چیزهای خاصی را اندازه گرفتید و سپس مقادیر حاصل را در فرمول های لازم وارد کردید.

scanf

در زبان C علاوه بر تابع خروجی printf نیز وجود دارد عملکرد اسکنبرای ورودی اکنون عملکرد scanf را با جزئیات بیشتری بررسی خواهیم کرد:

int i;
scanf("%d"، &i);

به نظر می رسد بسیار شبیه به تابع printf است. همچنین موجود در نقل قول های دوگانه تعیین کننده فرمت، اما تفاوت دقیقاً در قسمت دوم تابع است. آیا متوجه علامت (&) شدید؟ پس این علامت به معنای گرفتن آدرس است. اکنون توضیح خواهم داد که چرا این مورد نیاز است.

مقدار وارد شده را نه در جای دیگری، بلکه دقیقاً در آدرسی که متغیر ما در آن قرار دارد، بنویسیم. آن ها بدون علامت (&)، مقدار وارد شده ما در تمام مکان‌ها به جز جایی که نیاز داریم پایان می‌یابد. بنابراین، هر زمان که نیاز به وارد کردن مقادیر از صفحه کلید داشتید، قبل از متغیر با علامت آدرس (&) قرار دهید.

مشخص کننده های قالب

خب حالا بریم مشخص کننده های قالب:
  1. %d - یک عدد صحیح را بخوانید
  2. int i;
    scanf("%d"، &i);

  3. %o - بخوانید عدد اکتال
  4. int i;
    scanf("%o"، &i);

  5. %x - عدد هگزادسیمال را بخوانید
  6. int i;
    scanf("%x"، &i);

  7. %e(%f) - یک عدد واقعی را بخوانید
  8. float t;
    scanf("%f"، &t);

  9. %s - خواندن کاراکتر
  10. char ch;
    scanf("%c"، &ch);

  11. %s - خواندن خط
  12. char *str;;
    scanf("%s", str);

    هنوز وارد کار با رشته ها نشوید. چرا علامت نشانی وجود ندارد؟ کمی بعد به این موضوع خواهیم پرداخت.

عملیات مقایسه

کامپیوتر در ابتدا مجهز به منطق بولی، یعنی همه چیز بر روی 0 و 1 ساخته شده است. اگر متوجه نمی شوید در مورد چه چیزی صحبت می کنیم، پس فیلم ماتریکس را تماشا کنید، جایی که هر محافظ صفحه نمایش سبز از این دو عدد جادویی تشکیل شده است.

البته 0 و 1 خوب هستند، اما ما به معنای منطقی نیاز داریم، بنابراین در عملیات منطقی 0 FALSE و 1 درست است. این مفاهیم TRUE و FALSE ارتباط نزدیکی با یکدیگر دارند عملیات مقایسه. برای شروع، ما عملیات مقایسه مختلفی را ارائه می دهیم:

اساساً، رایج‌ترین اشتباهی که تازه‌کارها مرتکب می‌شوند، اشتباه گرفتن عملگر انتساب (=) با آن است عملیات مقایسه(==). اینها چیزهای کاملاً متفاوتی هستند. اما در اولین مراحل کدنویسی، همه دقیقاً بر همین اساس با خطا مواجه می شوند، پس بیشتر مراقب باشید.

توابع printf() و scanf() توانایی تعامل با برنامه را به ما می دهند. ما آنها را توابع ورودی/خروجی می نامیم. اینها تنها توابعی نیستند که می‌توانیم برای ورودی و خروجی داده‌ها با استفاده از برنامه‌های C استفاده کنیم، اما همه کاره‌ترین آنها هستند. این توابع در توضیحات زبان C و در کتابخانه stdio.h آورده شده است. به طور معمول، توابع printf() و scanf() تقریباً به یک روش کار می کنند - هر کدام از یک رشته کنترل و لیستی از آرگومان ها استفاده می کنند. ابتدا نحوه عملکرد تابع printf() و سپس scanf() را بررسی خواهیم کرد.

قالب

نوع اطلاعات نمایش داده شده

عدد صحیح اعشاری

یک شخصیت

رشته کاراکتر

نماد نمایی

عدد ممیز شناور، نماد دهی

به جای %f یا %e استفاده می شود

عدد صحیح اعشاری بدون علامت

عدد صحیح هشتگانه بدون علامت

عدد صحیح هگزادسیمال بدون علامت

دستورالعمل‌هایی که به تابع printf() ارسال می‌شوند زمانی که می‌خواهیم یک متغیر را چاپ کنیم به نوع متغیر بستگی دارد. به عنوان مثال، هنگام چاپ یک عدد صحیح، فرمت %d و هنگام چاپ یک کاراکتر، فرمت %c است. فرمت ها در جدول ذکر شده است.

بیایید ببینیم چگونه از این فرم ها استفاده می شود:

/* مهر */

#عبارتند از

#define PI 3.14159

int number = 2003;

printf("دانشگاه اینترنت فناوری اطلاعات در %d سال \n افتتاح شد"، شماره)؛

printf("مقدار pi %f است.\n"، PI);

فرمت مشخص شده هنگام فراخوانی تابع printf() به صورت زیر است:

printf(رشته کنترل، argument1، argument2،_);

آرگومان 1، آرگومان 2 و غیره پارامترهای قابل چاپی هستند که می توانند متغیر، ثابت یا حتی باشند اصطلاحات، قبل از چاپ محاسبه می شود.

خط کنترل رشته ای از کاراکترها است که نحوه چاپ پارامترها را نشان می دهد. به عنوان مثال، در اپراتور

printf("%d دانش‌آموز نمره %f دریافت کردند.\n"،

رشته کنترل عبارتی در گیومه است و عدد و z آرگومان یا در هستند در این موردمقادیر دو متغیر

می بینیم که خط کنترل شامل دو نوع مختلف اطلاعات است:

    کاراکترهایی که به صورت متنی چاپ می شوند.

    شناسه داده ها نیز نامیده می شود مشخصات تبدیل .

هر آرگومان از لیست زیر رشته کنترل باید با یک آرگومان مطابقت داشته باشد مشخصات تبدیل. اگر نیاز به چاپ عبارتی دارید، دیگر نیازی به استفاده نیست مشخصات تبدیل; اگر فقط نیاز به چاپ داده ها دارید، می توانید بدون استفاده از نظر این کار را انجام دهید. بنابراین هر یک از اپراتورهازیر کاملا قابل قبول هستند:

printf("این کتاب خیلی گران نیست!\n");

printf("%c%d\n","$",cost);

اگر نیاز به چاپ نماد % داشته باشید، کامپایلر آن را به عنوان یک خطا در نظر می گیرد مشخصات تبدیل. راه خروج از این وضعیت یک راه حل نسبتا ساده است - دو درصد کاراکتر را پشت سر هم بنویسید.

مثلا:

printf("فقط %d%% از جمعیت قادر به یادگیری مستقل هستند!\n",i);

نتیجه برنامه به شکل زیر خواهد بود:

فقط 5 درصد از جمعیت قادر به تحصیل مستقل هستند!

ما می توانیم تعریف اولیه را گسترش دهیم مشخصات تبدیل، قرار دادن اصلاح کننده ها بین علامت % و نمادی که نوع تبدیل را مشخص می کند. هنگام استفاده از چندین اصلاح کننده به طور همزمان، آنها باید به ترتیبی که در جدول ذکر شده اند مشخص شوند.

اصلاح کننده ها

معنی

آرگومان از موقعیت فیلد سمت چپ چاپ خواهد شد عرض داده شده. معمولاً چاپ آرگومان در سمت راست ترین موقعیت فیلد به پایان می رسد. مثال: %10

رشته اعداد

حداقل عرض فیلد را تنظیم می کند. اگر عدد یا رشته ای که چاپ می شود در فیلد اصلی قرار نگیرد، از فیلد بزرگتر استفاده می شود. مثال: %4d

رشته اعداد

دقت را تعیین می کند: برای انواع داده های ممیز شناور، تعداد ارقامی که باید در سمت راست نقطه اعشار چاپ شوند. برای رشته های کاراکتر - حداکثر تعدادکاراکترهای قابل چاپ مثال:

%4.2f (دو رقم اعشاری برای یک میدان چهار کاراکتری)

عنصر داده مربوطه دارد نوع بلند, not int مثال: %ld

printf("/%d/\n",135);

printf("/%2d/\n",135);

printf("/%10d/\n",135);

printf("/%-10d/\n",135);

اولین مشخصات تبدیل%d هیچ تغییر دهنده ای ندارد. این به اصطلاح انتخاب پیش فرض است، یعنی نتیجه عمل کامپایلر در صورتی که هیچ دستورالعمل اضافی به آن نداده باشید. دومین مشخصات تبدیل- %2d. مشخص می کند که عرض فیلد باید 2 باشد، اما از آنجایی که عدد از سه رقم تشکیل شده است، فیلد به طور خودکار به اندازه مورد نیاز گسترش می یابد. بعد مشخصات%10d نشان می دهد که عرض فیلد 10 است. آخرین مشخصات-10d همچنین عرض فیلد 10 را مشخص می کند و علامت - باعث می شود کل عدد به چپ منتقل شود.

تابع scanf() یک رویه ورودی است همه منظوره، که داده ها را از stdin می خواند. او می تواند داده های همه را بخواند انواع اساسیو به صورت خودکار آنها را به فرمت داخلی مورد نظر تبدیل کنید. اگر printf() ورودی را به جای خروجی انجام می داد، می توان آن را آنالوگ scanf() نامید.

رشته کنترلی که توسط فرمت به آن اشاره می شود از سه نوع کاراکتر تشکیل شده است:

  • مشخص کننده های قالب
  • نمادهای خاص
  • شخصیت های دیگر (خاص نیست)

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

جدول: کدهای قالب بندی scanf()
کد معنی
٪با یک کاراکتر بشمار
%d
٪من شمردن عدد اعشارینوع کامل
%e
% f تعداد ممیز شناور را بشمارید
% g تعداد ممیز شناور را بشمارید
%O عدد اکتال را بشمار
%s خط شمارش
٪ایکس عدد هگزادسیمال را بشمارید
%R نشانگر شمارش
%n یک عدد صحیح برابر با تعداد کاراکترهای خوانده شده تا کنون می گیرد
%u یک عدد صحیح بدون علامت را می خواند
% مجموعه ای از شخصیت ها را مشاهده می کند
%% کاراکتر % را می خواند

برای مثال %s یک رشته را می خواند و %d یک متغیر عدد صحیح را می خواند.

رشته قالب از چپ به راست خوانده می شود و کدهای قالب را با آرگومان های لیست آرگومان تطبیق می دهد.

کاراکترهای خاص در خط کنترل باعث می‌شوند که scanf() یک یا چند مورد را رد کند شخصیت های خاصدر جریان ورودی کاراکترهای ویژه عبارتند از space، tab یا newline. یک کاراکتر ویژه در خط کنترل باعث می‌شود که scanf() بدون ذخیره کردن، هر تعداد (شامل صفر) از نویسه‌های ویژه متوالی را از جریان ورودی بخواند تا زمانی که با کاراکتری که کاراکتر خاصی نیست مواجه شود.

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

تمام متغیرهایی که برای دریافت مقادیر با استفاده از تابع scanf() استفاده می‌شوند باید با آدرس‌هایشان جستجو شوند. این بدان معنی است که همه آرگومان های تابع باید اشاره گر به متغیرها باشند. بنابراین، C توانایی ارسال با مرجع را ایجاد می کند و این به تابع اجازه می دهد تا محتوای آرگومان را تغییر دهد.

Scanf("%d"، &count);

رشته‌ها در آرایه‌های کاراکتری خوانده می‌شوند و نام آرایه، بدون اشاره‌گر، آدرس اولین عنصر آرایه است. بنابراین، برای خواندن یک رشته در آدرس آرایه کاراکتر، می توانید از دستور استفاده کنید

Scanf("%s"، آدرس);

در این حالت، آدرس نام از قبل یک اشاره گر است و به پیشوند & نیاز ندارد.

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

Scanf("%d%d"، &r، &с);

دنباله 10 20 پذیرفته می شود، اما دنباله 10،20 پذیرفته نمی شود. مشخص کننده های قالب scanf() به ترتیب متغیرهای موجود در لیست آرگومان هستند که مقادیر متغیرهای دریافتی را به آنها اختصاص می دهند.

علامت * بعد از % و قبل از تعیین‌کننده قالب، داده‌های نوع مشخص شده را می‌خواند، اما انتساب به آن را متوقف می‌کند. پس کد

Scanf("%d%*c%d"، &x، &y);

هنگامی که دنباله 10/20 را وارد می کنید، مقدار 10 را به متغیر x اختصاص می دهد، کاراکتر / را حذف می کند و مقدار 20 را به متغیر y اختصاص می دهد.

دستورات قالب بندی می توانند یک اصلاح کننده را مشخص کنند حداکثر عرضزمینه های. این یک عدد صحیح است که بین علامت % و مشخص کننده فرمت قرار می گیرد. تعداد کاراکترهای خوانده شده برای هر فیلد معین را محدود می کند. به عنوان مثال، اگر نیاز به خواندن بیش از 20 کاراکتر در آرایه آدرس ندارید، باید بنویسید

Scanf("%20s"، آدرس);

اگر جریان ورودی بیش از 20 کاراکتر داشته باشد، دفعه بعد که تابع ورودی فراخوانی می شود، ورودی را از جایی که ورودی در طول تماس فعلی متوقف شده است آغاز می کند. ورود به میدان ممکن است قبل از رسیدن قطع شود حداکثر طولفیلدها در صورت مواجه شدن با فاصله. در این حالت scanf() به فیلد بعدی منتقل می شود.

اگرچه فاصله ها، زبانه ها و خطوط جدید به عنوان جداکننده فیلد استفاده می شوند، اما هنگام وارد کردن یک کاراکتر، مانند هر کاراکتر دیگری خوانده می شوند. به عنوان مثال، با توجه به یک تابع جریان ورودی x y

Scanf("%c%c%c"، &a، &b، و c);

x را در متغیر a، فاصله را در متغیر b و y را در متغیر c قرار می دهد.

نکته ای که باید مراقب آن بود این است که هر کاراکتر دیگری در رشته کنترل - از جمله فاصله ها، تب ها و خطوط جدید - برای نشان دادن و حذف کاراکترها از جریان ورودی استفاده می شود. به عنوان مثال، با یک جریان ورودی 10t20، تابع

Scanf("%st%s"، &x، &y);

مکان های 10 در x و 20 در y. کاراکتر t کنار گذاشته می شود زیرا یک t در رشته کنترل وجود دارد.

یکی دیگر از ویژگی های تابع scanf() مجموعه اسکن نام دارد. مجموعه اسکن کاراکترهایی را تعریف می کند که توسط تابع scanf() خوانده شده و به عناصر آرایه کاراکتر مربوطه اختصاص داده می شود. برای تنظیم یک مجموعه اسکن، باید کاراکترهایی را که ورودی آنها قابل قبول است در براکت قرار دهید. قبل از اولین براکت مربعیک علامت درصد اضافه می شود. به عنوان مثال، لیست مجموعه اسکن زیر مشخص می کند که scanf() فقط کاراکترهای A، B و C را می خواند:

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

آرایه ای که توسط scanf() برگردانده می شود دارای یک رشته با پایان تهی خواهد بود. لیست کاراکترهای خوانده شده را می توان به صورت معکوس نیز مشخص کرد. برای انجام این کار، ^ را به عنوان اولین کاراکتر قرار دهید. سپس scanf() هر کاراکتری را که در مجموعه اسکن نباشد می پذیرد.

می توانید از علامت نقل قول برای تعیین محدوده کاراکترهایی که پذیرفته می شوند استفاده کنید. به عنوان مثال، عبارت زیر به scanf() دستور می دهد تا حروف "A" تا "Z" را بپذیرد:

چند اسکن بین حروف بزرگ و حروف کوچک. اگر می خواهید scanf() هر دو را بپذیرد، باید آنها را به طور جداگانه در مجموعه اسکن فهرست کنید.

تابع scanf() عددی برابر با تعداد فیلدهایی که مقادیر آنها در واقع به متغیرها اختصاص داده شده است را برمی گرداند. این شمارش شامل فیلدهایی نمی شود که خوانده شده اند اما مقادیر آنها به دلیل استفاده از اصلاح کننده * برای سرکوب تخصیص به چیزی اختصاص داده نشده است. اگر قبل از تخصیص اولین فیلد خطایی رخ داده باشد، EOF برگردانده می شود.

هنگام استفاده از Borland C++ در یک محیط 16 بیتی، می‌توانید مدل حافظه پیش‌فرض مورد استفاده برای کامپایل یک برنامه را تغییر دهید. نشانه صریحاندازه هر اشاره گر استفاده شده در فراخوانی scanf(). اشاره گر نزدیک توسط اصلاح کننده N و نشانگر دور توسط اصلاح کننده F مشخص می شود. (اگر برنامه برای مدل حافظه عظیم کامپایل شده باشد، نمی توانید از اصلاح کننده N استفاده کنید.)

تابع scanf() یک تابع چند منظوره است که به شما امکان می دهد هر نوع داده ای را وارد رایانه خود کنید. نام تابع هدف آن را منعکس می کند - عملکرد صفحه کلید را اسکن می کند (مشاهده می کند)، تعیین می کند که کدام کلیدها فشار داده شوند و سپس ورودی را بر اساس کاراکترهای قالب بندی شده SCAN تفسیر می کند. دقیقاً مانند تابع printf()، scanf() می‌تواند چندین آرگومان بگیرد و به شما امکان می‌دهد مقادیر متغیرهای عددی، کاراکتر و رشته‌ای را همزمان وارد کنید.

درست مانند لیست پارامترهای printf()، لیست پارامترهای تابع scanf() از دو بخش تشکیل شده است: یک رشته قالب و یک لیست داده (شکل 5.7). خط فرمت حاوی نشانگرهای قالب است، در اینجا آنها نامیده می شوند مبدل های کاراکتر*، که تعیین می کند چگونه داده های ورودی باید تفسیر شوند. لیست داده ها شامل متغیرهایی است که مقادیر وارد شده باید در آنها وارد شود.

برنج. 5.7. لیست پارامترهای تابع scanf() به دو قسمت تقسیم می شود

اندیکاتورهای قالب مشابه آنهایی هستند که توسط تابع printf() استفاده می شود:

هنگام وارد کردن داده های عددی یا کاراکتری، باید آدرس متغیر را در لیست داده تابع scanf() و نه فقط نام آن را مشخص کنید:

scanf("%f"، &amount);

* که دراصلیکاراکترهای تبدیل(تقریباً ترجمه)

در این مثال، تابع scanf() یک عدد ممیز شناور می گیرد و آن را در ناحیه حافظه رزرو شده برای مقدار متغیر قرار می دهد. هنگامی که یک عدد در این ناحیه حافظه قرار می گیرد، به طور خودکار به مقدار متغیر تبدیل می شود.

در حالی که تابع scanf() در حال اجرا است، اجرای برنامه به حالت تعلیق در می آید و برنامه منتظر ورود داده می شود. ورودی با فشار دادن کلید به پایان می رسد وارد.

اصل کار با داده های تابع scanf() اساساً با کار توابع gets() و getchar() متفاوت است. برای اینکه بفهمید وقتی با استفاده از scanf() تایپ می کنید دقیقاً چه اتفاقی می افتد، باید به این تفاوت ها با جزئیات نگاه کنید.

جریان ورودی

وقتی داده ها با استفاده از تابع gets() وارد می شوند، تمام کاراکترهایی که قبل از فشار دادن روی صفحه کلید تایپ شده اند وارد، تبدیل به مقدار متغیر می شود. هنگامی که یک کاراکتر با استفاده از تابع getchar() وارد می شود، فشار دادن یک کلید به طور خودکار باعث می شود که کاراکتر مربوطه به یک متغیر اختصاص داده شود.

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

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

تابع scanf() کاراکترهای غیر اطلاعاتی را نادیده می گیرد: فاصله ها، تب ها و خطوط جدید، مگر اینکه نوع داده فعلی char باشد. بیایید به برنامه نگاه کنیم:

puts("لطفا یک عدد وارد کنید:");

scanf("%d"، &count);

printf("عدد %d است"، count);

برنج. 5.8. تابع scanf() جریان ورودی را می خواند و تعیین می کند که چه داده هایی باید وارد شوند و چه داده هایی باید نادیده گرفته شوند.

قبل از وارد کردن یک عدد، می توانید فاصله را تا جایی که می خواهید فشار دهید - C فاصله ها را نادیده می گیرد و منتظر اولین کاراکتر مهم است. سپس C تلاش خواهد کرد تا کاراکترها را با توجه به فرمت‌های موجود در رشته فرمت تابع scanf() تبدیل کند. اگر این کاراکترها با فرمت مطابقت داشته باشند (در این مورد اگر اعداد باشند) در متغیر وارد می شوند. اگر با کاراکتری مواجه شوید که در قالب مورد انتظار نباشد، یعنی عدد نباشد، ورود داده متوقف می شود. به عنوان مثال، اگر دنباله "123abc" را روی صفحه کلید تایپ کنید، عدد 123 در مثال ما به متغیر count اختصاص داده می شود و حروف "abc" نادیده گرفته می شوند، همانطور که در شکل 5.9 نشان داده شده است. یک فاصله ممکن است باعث توقف ورود داده شود. به عنوان مثال، اگر "123" را تایپ کنید، به متغیر مقدار 12 اختصاص داده می شود و عدد 3 نادیده گرفته می شود.

برنج. 5.9. تابع scanf() وقتی با اولین کاراکتر غیر عددی روبرو می شود، وارد کردن داده را متوقف می کند.

اولین کاراکتر مهم باید با فرمت مشخص شده در آرگومان تابع ()scanf مطابقت داشته باشد. بنابراین، اگر دنباله "ABC123" را تایپ کنید، برنامه کل دنباله را نادیده می گیرد و شما را در مورد مقدار متغیر در تاریکی رها می کند.

کدام کاراکترها را برنامه به عنوان "مناسب" در نظر می گیرد به شاخص های قالب بستگی دارد. اگر نشانگر %d باشد، فقط اعداد و علامت منهای «مناسب» هستند. اگر نشانگر %x را قرار دهید، کاراکترهای 0123456789ABCDE با قالب مطابقت دارند، زیرا همه آنها هنگام نوشتن اعداد در سیستم اعداد هگزادسیمال استفاده می شوند. اگر نشانگر %c موجود باشد، هر کاراکتری پذیرفته می‌شود، حتی فضاهای داخل جریان ورودی توسط تابع scanf() در این مورد نادیده گرفته نمی‌شوند. اگر دستورالعمل بنویسید:

scanf("%c"، &letter);

و کلید فاصله را در ابتدای دنباله فشار دهید شخصیت های مهم، scanf() متغیر را روی یک فاصله تنظیم می کند و کاراکترهای بعدی را نادیده می گیرد. بنابراین، هنگام برخورد با نوع char، نمی توانید فاصله ها را قبل از سایر کاراکترها قرار دهید.

هنگام وارد کردن یک رشته، تابع scanf() شروع به تخصیص یک مقدار در اولین کاراکتر معنی دار می کند، فضاهای اصلی را نادیده می گیرد و زمانی که با اولین فاصله بین کاراکترهای مهم مواجه می شود، تخصیص را متوقف می کند. نگاهی به برنامه بیندازید:

puts("لطفا نام خود را وارد کنید:");

scanf("%s", name);

لطفاً توجه داشته باشید که عملگر دریافت آدرس با نام متغیر رشته ای استفاده نمی شود. اگر "Nancy" را روی صفحه کلید خود تایپ کنید و Enter را فشار دهید، آن کاراکترها به متغیر نام اختصاص داده می شوند. حتی اگر «Nancy Chasin» را تایپ کنید، scanf() شروع به تخصیص کاراکترها در اولین کاراکتر معنی دار می کند و زمانی که با اولین فاصله مواجه می شود متوقف می شود، بنابراین مقدار متغیر همچنان فقط نام نانسی خواهد بود و برنامه بقیه را نادیده می گیرد. (شکل 5.10).

برنج. 5.10. تابع scanf() خواندن کاراکترهای یک رشته را در اولین فاصله متوقف می کند

به دلیل این ویژگی تابع scanf() برای وارد کردن رشته ها چندان راحت نیست. در این موارد بهتر است از تابع gets() استفاده کنید.

بهترین مقالات در این زمینه