Scanf C funksiyasi tavsifi
Scanf C funksiyasi tavsifi

Video: Scanf C funksiyasi tavsifi

Video: Scanf C funksiyasi tavsifi
Video: Millionaire's Family Mansion in Belgium Left Abandoned - FOUND VALUABLES! 2024, May
Anonim

Ushbu maqolada scanf() funktsiyasi ma'lum bir standartga havolasiz umumiy shaklda ko'rib chiqiladi, shuning uchun har qanday C99, C11, C++11, C++14 standartlari ma'lumotlari bu erga kiritilgan. Ehtimol, ba'zi standartlarda funksiya maqolada keltirilgan materialdan farqlar bilan ishlaydi.

scanf C funksiyasi - tavsif

scanf() stdio.h(C) va cstdio(C++) sarlavha fayllarida joylashgan funksiya boʻlib, formatlangan dastur kiritish sifatida ham tanilgan. scanf standart kirish oqimidan (stdin) belgilarni o'qiydi va ularni formatga muvofiq o'zgartiradi, keyin ularni belgilangan o'zgaruvchilarga yozadi. Format - ma'lumotlar olingandan keyin ma'lum bir shaklga aylantirilishini anglatadi. Shunday qilib, scanf C funksiyasi tasvirlangan:

scanf("%format", &variable1[, &variable2, […]), bu yerda oʻzgaruvchilar manzil sifatida uzatiladi. O'zgaruvchilarni funktsiyaga o'tkazishning bunday usulining sababi aniq: ish natijasida u xatolar mavjudligini ko'rsatadigan qiymatni qaytaradi, shuning uchuno'zgaruvchilar qiymatlarini o'zgartirishning yagona yo'li manzil bo'yicha o'tishdir. Shuningdek, ushbu usul tufayli funksiya istalgan turdagi maʼlumotlarni qayta ishlay oladi.

Ba'zi dasturchilar boshqa tillarga oʻxshashligi sababli scanf() yoki printf() kabi funksiyalarga protsedura sifatida murojaat qilishadi.

Scanf barcha asosiy til turlarini kiritish imkonini beradi: char, int, float, string va hokazo. String tipidagi o'zgaruvchilarda manzil belgisini - "&" ni ko'rsatishning hojati yo'q, chunki satr tipidagi o'zgaruvchi massiv bo'lib, uning nomi esa kompyuter xotirasidagi massivning birinchi elementining manzilidir..

C++ da C dan foydalanish
C++ da C dan foydalanish

Ma'lumotlarni kiritish formati yoki boshqaruv qatori

Tavsifdagi scanf C funksiyasi misolini koʻrib chiqishdan boshlang.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); qaytish 0; //linux tizimlari uchun talab }

Kirish formati quyidagi toʻrtta parametrdan iborat: %[kenglik][modifikatorlar] turi. Bunday holda, "%" belgisi va turi majburiy parametrlardir. Ya'ni, minimal format quyidagicha ko'rinadi: "%s", "%d" va hokazo.

Umuman olganda, format qatorini tashkil etuvchi belgilar quyidagilarga bo'linadi:

  • format spetsifikatsiyalari - % bilan boshlanadigan hamma narsa;
  • ajratuvchi yoki boʻsh joy belgilari - ular boʻsh joy, tab(t), yangi qator (n);
  • boʻsh joydan boshqa belgilar.

Funksiya xavfsiz boʻlmasligi mumkin.

Scanf() oʻrniga scanf_s() dan foydalaning.

(Visual Studio xabari)

Tur yoki format aniqlagichlari, konversiya belgilari yoki boshqaruv belgilari

ikkilik kod
ikkilik kod

Scanf C deklaratsiyasida kamida "%" bilan boshlangan iboralar oxirida ko'rsatilgan format spetsifikatsiyasi bo'lishi kerak. U dasturga kirishda kutilishi kerak bo'lgan ma'lumotlar turini aytadi, odatda klaviaturadan. Quyidagi jadvaldagi barcha format spetsifikatsiyalari roʻyxati.

Tur

Manosi

1 %c Dastur belgilar kiritishni kutmoqda. Yoziladigan oʻzgaruvchi char xarakterli boʻlishi kerak.
2 %d Dastur butun son turidagi kasr sonini kiritishni kutadi. Oʻzgaruvchi int turida boʻlishi kerak.
3 %i Dastur butun son turidagi kasr sonini kiritishni kutadi. Oʻzgaruvchi int turida boʻlishi kerak.
4 %e, %E Dastur eksponensial shaklda suzuvchi nuqta (vergul) sonini kiritishni kutadi. Oʻzgaruvchi float turida boʻlishi kerak.
5 %f Dastur suzuvchi nuqtali raqamni (vergul) kutadi. Oʻzgaruvchi float turida boʻlishi kerak.
6 %g, %G Dastur suzuvchi nuqtali raqamni (vergul) kutadi. Oʻzgaruvchi float turida boʻlishi kerak.
7 %a Dastur suzuvchi nuqtali raqamni (vergul) kutadi. Oʻzgaruvchi float turida boʻlishi kerak.
8 %o Dastur sakkizlik sonni kutadi. Oʻzgaruvchi int turida boʻlishi kerak.
9 %s Dastur qator kiritilishini kutmoqda. Satr birinchi bo'luvchi belgigacha bo'lgan har qanday belgilar to'plamidir. Oʻzgaruvchi string turi boʻlishi kerak.
10 %x, %X Dastur oʻn oltilik raqamni kutmoqda. Oʻzgaruvchi int turida boʻlishi kerak.
11 %p Oʻzgaruvchi koʻrsatkich kiritishni kutadi. Oʻzgaruvchi koʻrsatkich turiga ega boʻlishi kerak.
12 %n

Oʻzgaruvchiga scanf funksiyasi tomonidan oʻqilgan belgilar soniga teng butun son qiymatini yozadi.

13 %u Dastur ishorasiz butun sonni oʻqiydi. Oʻzgaruvchi turi belgisiz butun son boʻlishi kerak.
14 %b Dastur ikkilik raqamni kutmoqda. Oʻzgaruvchi int turida boʻlishi kerak.
15 % Skanlangan belgilar toʻplami. Dastur belgilar kiritilishini kutmoqda.kvadrat qavslar orasida ko'rsatilgan cheklangan hovuzdan. scanf kirish oqimida belgilangan toʻplamdagi belgilar mavjud ekan ishlaydi.
16 %% “%” belgisi.

Format qatoridagi belgilar

C++ kodi
C++ kodi

Yulduzcha belgisi ()

Yulduzcha () belgilash operatsiyasini bostirish kerakligini bildiruvchi bayroqdir. Yulduzcha "%" belgisidan keyin darhol qo'yiladi. Masalan,


scanf("%d%c%d", &x, &y); //ikkita butun son orasidagi belgiga e'tibor bermaslik. scanf("%s%d%s", str, str2); //ikki satr orasidagi butun sonni e'tiborsiz qoldiring.

Ya'ni konsolda "45-20" qatorini kiritsangiz, dastur quyidagilarni bajaradi:

  1. "x" o'zgaruvchisiga 45 qiymati beriladi.
  2. "y" o'zgaruvchisiga 20 qiymati beriladi.
  3. Va minus belgisi (tire) "-" "%c" tufayli e'tiborga olinmaydi.

Eng (yoki maydon kengligi)

Bu joriy oʻqish jarayonida oʻqilishi kerak boʻlgan belgilarning maksimal sonini koʻrsatuvchi “%” belgisi va format koʻrsatkichi orasidagi butun son.


scanf("%20s", str); //kirish oqimidan dastlabki 20 ta belgini oʻqing

Bir nechta muhim narsalarni yodda tutish kerak:

  1. scanf, agar u 20 ta belgini hisobga olmasa ham, ajratuvchi belgiga duch kelsa, tugatiladi.
  2. Agar 20 dan ortiq belgi kiritilsa, str.ga faqat birinchi 20 ta belgi yoziladi

Modifikatorlarturi (yoki aniqligi)

chayqalish kodi
chayqalish kodi

Bular kiritish uchun kutilayotgan maʼlumotlar turini oʻzgartiruvchi maxsus belgilar. Bayroq tur spetsifikatsiyasining chap tomonida ko'rsatilgan:

  • L yoki l (kichik L) "l" d, i, o, u, x ko'rsatkichlari bilan ishlatilsa, bayroq dasturga long int kiritish kutilayotganligini bildiradi. E yoki f spetsifikatsiyasi bilan "l" dan foydalanilganda, bayroq dasturga ikki barobar qiymat kutish kerakligini aytadi. "L" dan foydalanish dasturga uzoq dubl kutilayotganligini bildiradi. "c" va "s" spetsifikatsiyalari bilan "l" dan foydalanish dasturga wchar_t kabi ikki baytli belgilar kutilganligini bildiradi. Masalan, "%lc", "%ls", "%l[asd]".
  • h - qisqa turni bildiruvchi bayroq.
  • hh - o'zgaruvchining imzolangan belgi yoki belgilanmagan belgi qiymatiga ko'rsatgich ekanligini bildiradi. Bayroq d, i, o, u, x, n spetsifikatsiyalari bilan ishlatilishi mumkin.
  • ll (ikkita kichik L) - o'zgaruvchining signed long long int yoki unsigned long long int tipidagi qiymatga ko'rsatgich ekanligini ko'rsatadi. Bayroq belgilovchilar bilan ishlatiladi: d, i, o, u, x, n.
  • j - o'zgaruvchining stdint.h sarlavha faylidan intmax_t yoki uintmax_t turiga ko'rsatgich ekanligini bildiradi. Belgilovchilar bilan ishlatiladi: d, i, o, u, x, n.
  • z - o'zgaruvchining ta'rifi stddef.h da joylashgan size_t turiga ko'rsatgich ekanligini bildiradi. Belgilovchilar bilan ishlatiladi: d, i, o, u, x, n.
  • t - o'zgaruvchining ptrdiff_t turiga ko'rsatgich ekanligini bildiradi. Ta'rif yoqilganbu tur stddef.h da joylashgan. Belgilovchilar bilan ishlatiladi: d, i, o, u, x, n.

Aniqroq qilib aytganda, oʻzgartirgichli rasmni jadval sifatida koʻrsatish mumkin. Dasturchilar uchun scanf C ning bunday tavsifi aniqroq bo'ladi.

Tip spetsifikatsiyalari va modifikatorlari
Tip spetsifikatsiyalari va modifikatorlari

Boshqa belgilar

Formatda duch kelgan har qanday belgilar oʻchirib tashlanadi. Shu bilan birga, shuni ta'kidlash kerakki, boshqaruv qatorida bo'shliq yoki ajratuvchi belgilar (yangi qator, bo'sh joy, yorliq) mavjudligi funktsiyaning har xil harakatiga olib kelishi mumkin. Bir versiyada scanf() ajratuvchidan boshqa belgiga duch kelmaguncha ajratuvchilar sonini saqlamasdan oʻqiydi, boshqa versiyada boʻshliqlar (faqat ular) rol oʻynamaydi va “%d + %d” ifodasi. “% d+%d” ga ekvivalent.

C++ kodiga misol
C++ kodiga misol

Misollar

Funksiya qanday ishlashini yaxshiroq tushunish va fikr yuritish uchun bir nechta misollarni koʻrib chiqamiz.


scanf("%3s", str); //agar siz konsolga "1d2s3d1;3" qatorini kiritsangiz, str scanf("%dminus%d", &x, &y); ga faqat "1d2" yoziladi; //ikki raqam orasidagi minus belgilar olib tashlanadi scanf("%5[0-9]", str); // belgilar 5 ta belgi bo'lgunga qadar str ga kiritiladi va belgilar 0 dan 9 gacha raqamlar bo'ladi. scanf("%lf", &d); //ikki marta kiritishni kuting scanf("%hd", &x); //turdagi kutilgan soni short scanf("%hu", &y); //imzosiz sonni kuting short scanf("lx", &z); //long int turining kutilgan soni

KimdanQuyidagi misollar kutilgan raqam turli belgilar yordamida qanday o‘zgarishini ko‘rsatadi.

scanf C - yangi boshlanuvchilar uchun tavsif

Ushbu bo'lim yangi boshlanuvchilar uchun foydali bo'ladi. Ko'pincha qo'lingizda scanf C ning to'liq tavsifi emas, balki funksiya qanday ishlashi tafsilotlari ham bo'lishi kerak.

  • Bu xususiyat biroz eskirgan. Turli versiyalardagi kutubxonalarda bir nechta turli xil ilovalar mavjud. Masalan, takomillashtirilgan scanf S C funksiyasi, uning tavsifini microsoft veb-saytida topish mumkin.
  • Formatdagi spetsifikatsiyalar soni funksiyaga uzatilgan argumentlar soniga mos kelishi kerak.
  • Kirish oqimi elementlari faqat ajratuvchi belgilar bilan ajratilishi kerak: boʻsh joy, tab, yangi qator. Vergul, nuqtali vergul, nuqta va boshqalar - bu belgilar scanf() funksiyasi uchun ajratuvchi emas.
  • Agar scanf ajratuvchi belgiga duch kelsa, kiritish toʻxtatiladi. Agar oʻqish uchun bir nechta oʻzgaruvchi boʻlsa, scanf keyingi oʻzgaruvchini oʻqishga oʻtadi.
  • Kirish ma'lumotlari formatidagi eng kichik nomuvofiqlik dasturning oldindan aytib bo'lmaydigan natijalariga olib keladi. Xo'sh, agar dastur faqat xato bilan tugasa. Lekin ko'pincha dastur ishlashda davom etadi va noto'g'ri qiladi.
  • scanf("%20s …", …); Agar kirish oqimi 20 ta belgidan oshsa, scanf birinchi 20 ta belgini o'qiydi va agar bittasi ko'rsatilgan bo'lsa, to'xtatadi yoki keyingi o'zgaruvchini o'qishga o'tadi. Bunday holda, scanf-ga keyingi qo'ng'iroq, scanf-ga oldingi qo'ng'iroqning ishi to'xtagan joydan kirish oqimini o'qishni davom ettiradi. Agar birinchi 20 ni o'qiyotgandabelgilar boʻlsa, ajratuvchi belgiga duch kelsa, scanf birinchi oʻzgaruvchi uchun 20 ta belgini oʻqimagan boʻlsa ham, keyingi oʻzgaruvchini toʻxtatadi yoki oʻqishni davom ettiradi. Bunday holda, barcha o‘qilmagan belgilar keyingi o‘zgaruvchiga biriktiriladi.
  • Agar skanerlangan belgilar toʻplami “^” bilan boshlansa, scanf maʼlumotlarni chegaralovchi belgi yoki toʻplamdagi belgiga duch kelmaguncha oʻqiydi. Masalan, “%[^A-E1-5]” oqimdagi maʼlumotlarni A dan E gacha boʻlgan bosh inglizcha belgilardan biri yoki 1 dan 5 gacha boʻlgan raqamlardan biriga duch kelmaguncha oʻqiydi.
  • Scanf C funksiyasi, ta'riflanganidek, o'zgaruvchilarga muvaffaqiyatli yozishlar soniga teng sonni qaytaradi. Agar scanf 3 ta o'zgaruvchini yozsa, u holda funktsiyaning muvaffaqiyat natijasi 3 raqamini qaytaradi. Agar scanf hech qanday o'zgaruvchini yoza olmasa, natija 0 bo'ladi. Va nihoyat, agar scanf biror sababga ko'ra umuman boshlana olmasa, natija EOF bo'ladi.
  • Agar scanf() funksiyasi notoʻgʻri tugagan boʻlsa. Masalan, scanf("%d", &x) - raqam kutilgan edi, lekin kirish sifatida belgilar qabul qilindi. Keyingi scanf() chaqiruvi oldingi funktsiya chaqiruvi tugagan kirish oqimidagi nuqtadan boshlanadi. Ushbu muammoni bartaraf etish uchun muammoli belgilardan xalos bo'lish kerak. Buni, masalan, scanf("%s") ni chaqirish orqali amalga oshirish mumkin. Ya'ni, funktsiya belgilar qatorini o'qiydi va uni tashlab yuboradi. Shu tarzda siz kerakli maʼlumotlarni kiritishda davom etishingiz mumkin.
  • Scanf() ning ba'zi ilovalarida skanerlangan belgilar to'plamida "-" belgisiga ruxsat berilmaydi.
  • "%c" spetsifikatsiyasi oqimdagi har bir belgini o'qiydi. Ya'ni, ajratuvchi belgini ham o'qiydi. Ajratuvchi belgini o'tkazib yuborish va kerakli belgini o'qishni davom ettirish uchun siz "%1s" dan foydalanishingiz mumkin.
  • "c" spetsifikatsiyasidan foydalanilganda "%10c" kengligidan foydalanish mumkin, lekin keyin char tipidagi elementlar massivi scanf funksiyasiga o'zgaruvchi sifatida uzatilishi kerak.
  • “%[a-z]” “ingliz alifbosining barcha kichik harflari” degan ma’noni anglatadi va “%[z-a]” atigi 3 ta belgidan iborat: ‘z’, ‘a’, ‘-’. Boshqacha qilib aytganda, "-" belgisi faqat to'g'ri tartibda joylashgan ikkita belgi orasida bo'lsa, diapazonni anglatadi. Agar "-" iboraning oxirida, boshida yoki ularning har ikki tomonidagi belgilarning noto'g'ri tartibida bo'lsa, u diapazon emas, shunchaki defis belgisidir.
C++ kodi
C++ kodi

Xulosa

Scanf C tavsifi shu bilan yakunlanadi. Bu kichik dasturlarda ishlash va protsessual dasturlash usulidan foydalanganda juda qulay xususiyatdir. Biroq, asosiy kamchilik - bu scanf-dan foydalanishda yuzaga kelishi mumkin bo'lgan oldindan aytib bo'lmaydigan xatolar soni. Shuning uchun, dasturlashda scanf C tavsifi sizning ko'zingiz oldida eng yaxshi saqlanadi. Katta professional loyihalarda iostreamlar qo'llaniladi, chunki ular yuqori darajadagi imkoniyatlarga ega, ular xatolarni yaxshiroq ushlash va boshqarish, shuningdek, katta hajmdagi ma'lumotlar bilan ishlashadi. Shuni ham ta'kidlash kerakki, rus tilidagi scanf C tavsifi ko'plab tarmoq manbalarida, shuningdek, unga misollar mavjud.funktsiyaning yoshi tufayli foydalanish. Shuning uchun, agar kerak bo'lsa, siz har doim mavzuli forumlarda javob topishingiz mumkin.

Tavsiya: