Scanf C функциясынын сүрөттөмөсү
Scanf C функциясынын сүрөттөмөсү

Video: Scanf C функциясынын сүрөттөмөсү

Video: Scanf C функциясынын сүрөттөмөсү
Video: ҰБТ жаңа формат 0350 нұсқа. Математика 2024, Май
Anonim

Бул макалада scanf() функциясы белгилүү бир стандартка шилтеме жасабастан жалпы формада каралат, ошондуктан бул жерде каалаган C99, C11, C++11, C++14 стандарттарынын маалыматтары камтылган. Балким, кээ бир стандарттарда функция макалада берилген материалдан айырмачылыктар менен иштейт.

scanf C функциясы - сүрөттөмө

scanf() stdio.h(C) жана cstdio(C++) баш файлдарында жайгашкан функция, форматталган программа киргизүү катары да белгилүү. scanf стандарттык киргизүү агымынан (stdin) символдорду окуйт жана аларды форматка ылайык өзгөртөт, андан кийин аларды көрсөтүлгөн өзгөрмөлөргө жазат. Формат - маалыматтар алынгандан кийин белгилүү бир формага айландырылат дегенди билдирет. Ошентип, scanf C функциясы сүрөттөлөт:

scanf("%формат", &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; //linux системаларына талап }

Киргизүү форматы төмөнкү төрт параметрден турат: %[туурасы][модификаторлор] түрү. Бул учурда, "%" белгиси жана түрү милдеттүү параметрлер болуп саналат. Башкача айтканда, минималдуу формат төмөнкүдөй көрүнөт: “%s”, “%d” жана башкалар.

Жалпысынан формат сабын түзгөн символдор төмөнкүлөргө бөлүнөт:

  • формат аныктагычтары - % менен башталган бардык нерсе;
  • бөлүүчү же боштук символдору - алар боштук, өтмөк(t), жаңы сап (n);
  • боштуктан башка символдор.

Функция коопсуз эмес болушу мүмкүн.

scanf() ордуна scanf_s() колдонуңуз.

(Visual Studioдон билдирүү)

Тип, же формат спецификациялары, же конверсия символдору же башкаруу символдору

бинардык код
бинардык код

Scanf C декларациясы жок дегенде "%" менен башталган туюнтмалардын аягында көрсөтүлгөн формат спецификациясын камтышы керек. Ал программага кирүүдө күтүлүүчү маалыматтардын түрүн айтат, адатта клавиатурадан. Төмөнкү таблицада бардык формат спецификаторлорунун тизмеси.

Түр Мааниси
1 %c

Программа символ киргизүүнү күтүп жатат. Жазыла турган өзгөрмө символ тибинде болушу керек.

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 Variable көрсөткүч киргизүүнү күтөт. Өзгөрмө көрсөткүч түрүндө болушу керек.
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 символ гана жазылат

Модификаторлортүрү (же тактык)

чачуу коду
чачуу коду

Бул киргизүү үчүн күтүлгөн берилиштердин түрүн өзгөрткөн атайын желектер. Желек тип спецификациясынын сол жагында көрсөтүлгөн:

  • L же l (кичинекей L) d, i, o, u, x спецификаторлору менен "l" колдонулганда, желек программага long int киргизүү күтүлүп жатканын айтат. e же f спецификатору менен "l" колдонгондо, желек программага кош маанини күтүшү керектигин айтат. "L" колдонуу программасы узак кош күтүлүп жатканын айтат. "c" жана "s" спецификаторлору менен "l" колдонуу программага wchar_t сыяктуу эки байттык символдор күтүлгөнүн билдирет. Мисалы, "%lc", "%ls", "%l[asd]".
  • h – кыска түрүн көрсөткөн желек.
  • hh - өзгөрмө кол коюлган символдун же кол коюлбаган символдун көрсөткүчү экенин көрсөтөт. Желек d, i, o, u, x, n спецификаторлору менен колдонулушу мүмкүн.
  • ll (эки кичинекей L) - өзгөрмө кол коюлган long long int же unsigned long long int түрүндөгү мааниге көрсөткүч экенин көрсөтөт. Желек спецификаторлор менен колдонулат: d, i, o, u, x, n.
  • j - өзгөрмө stdint.h баш файлынан intmax_t же uintmax_t түрүнө көрсөткүч экенин көрсөтөт. Белгилөөчүлөр менен колдонулат: 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тин мындай сүрөттөлүшү такыраак болот.

Түр спецификаторлору жана өзгөрткүчтөрү
Түр спецификаторлору жана өзгөрткүчтөрү

Башка каармандар

Форматта кездешкен бардык символдор жок кылынат. Ошол эле учурда, башкаруу сапта боштук же бөлүүчү символдордун (жаңы сап, боштук, кошумча) болушу функциянын ар кандай жүрүм-турумуна алып келиши мүмкүн экенин белгилей кетүү керек. Бир версияда scanf() бөлүүчүдөн башка символго туш болмоюнча эч кандай сандагы бөлгүчтөрдү сактабастан окуйт, ал эми башка версияда боштуктар (алар гана) роль ойнобойт жана "%d + %d" туюнтмасы "% d+%d" дегенге барабар.

C++ кодунун мисалы
C++ кодунун мисалы

Мисалдар

Функция кантип иштээрин жакшыраак түшүнүүгө жана ойлонууга жардам берүү үчүн кээ бир мисалдарды карап көрөлү.


scanf("%3s", str); //эгер сиз консолго "1d2s3d1;3" сабын киргизсеңиз, str scanf("%dminus%d", &x, &y); "1d2" гана жазылат; //эки сандын ортосундагы минус символдор жокко чыгарылат scanf("%5[0-9]", str); // символдор str ичине 5 символ болмоюнча киргизилет жана символдор 0дөн 9га чейинки сандар. scanf("%lf", &d); //эксперт кош киргизүү scanf("%hd", &x); //түрүнүн күтүлгөн саны short scanf("%hu", &y); //күтүлүүчү кол коюлбаган сан short scanf("lx", &z); //long int түрүнүн күтүлгөн саны

КимденТөмөнкү мисалдар күтүлгөн сандын ар кандай символдорду колдонуу менен өзгөрүшүн көрсөтөт.

scanf C - үйрөнчүктөр үчүн сүрөттөмө

Бул бөлүм үйрөнчүктөр үчүн пайдалуу болот. Көбүнчө сиздин колуңузда scanf Cнин толук сүрөттөлүшү эмес, функциянын иштешинин чоо-жайы болушу керек.

  • Бул функция бир аз эскирген. Ар кандай версиялардын китепканаларында бир нече түрдүү ишке ашыруулар бар. Мисалы, жакшыртылган scanf S C функциясы, анын сүрөттөмөсүн microsoft веб-сайтынан тапса болот.
  • Форматтагы спецификаторлордун саны функцияга берилген аргументтердин санына дал келиши керек.
  • Киргизүү агымынын элементтери бөлүүчү символдор менен гана бөлүнүшү керек: боштук, өтмөк, жаңы сап. Үтүр, чекит, чекит ж.б. - бул символдор scanf() функциясы үчүн бөлгүч эмес.
  • Эгер scanf бөлүүчү белгиге туш келсе, киргизүү токтотулат. Эгер окуу үчүн бирден ашык өзгөрмө болсо, scanf кийинки өзгөрмөнү окууга өтөт.
  • Киргизилген маалымат форматындагы кичине эле дал келбестик программанын күтүлбөгөн натыйжаларына алып келет. Ооба, эгерде программа жөн гана ката менен аяктаса. Бирок көп учурда программа иштей берет жана туура эмес кылат.
  • scanf("%20s …", …); Эгерде киргизүү агымы 20 белгиден ашса, анда scanf биринчи 20 символду окуйт жана эгер бирөө көрсөтүлгөн болсо, кийинки өзгөрмөнү окууну токтотот же окууга өтөт. Бул учурда, scanfге кийинки чакыруу, scanfге мурунку чалуунун иши токтогон жерден кириш агымын окууну улантат. Эгерде биринчи 20ны окуп жаткандасимволдор болсо, бөлүүчү символ кездешсе, scanf биринчи өзгөрмө үчүн 20 символду окубаса дагы, кийинки өзгөрмөнү окууну токтотот же улантат. Бул учурда, бардык окула элек символдор кийинки өзгөрмөгө тиркелет.
  • Эгер сканерленген символдордун жыйындысы "^" менен башталса, анда scanf бөлүүчү белгиге же топтомдогу белгиге жолукмайынча дайындарды окуйт. Мисалы, "%[^A-E1-5]" агымдагы маалыматтарды Адан Еге чейинки чоң тамгалардагы англис тамгаларынын бири же 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 сыпаттамасы сиздин көз алдыңызда жакшы сакталат. Ири профессионалдык долбоорлордо iostreams колдонулат, анткени алардын жогорку деңгээлдеги мүмкүнчүлүктөрү бар, алар каталарды жакшыраак кармап, башкара алышат, ошондой эле олуттуу көлөмдөгү маалымат менен иштей алышат. Ошондой эле, орус тилиндеги scanf C сыпаттамасы көптөгөн тармак булактарында, ошондой эле анын мисалдарында бар экенин белгилей кетүү керек.колдонуу, функциянын жашына байланыштуу. Ошондуктан, керек болсо, тематикалык форумдардан ар дайым жооп таба аласыз.

Сунушталууда:

Редактордун тандоосу

Бөлүп төлөнүүчү товарлар, "M-Video": керектөөчүлөрдүн сын-пикирлери

Home Кредитин бөлүп төлөө кредиттик картасы: кардарлардын шарттары боюнча сын-пикирлери

Адамдын банкта насыясы бар же жок экенин кантип билсе болот?

Мыкты керектөө насыясы: банктардын сунуштары

Программа "KIA Easy!" - сын-пикирлер, шарттар жана өзгөчөлүктөрү

Москвада жана областта кредитти кайдан алса болот

Мөөнөтүнөн мурда төлөө үчүн кредиттин калдыгын кантип эсептөө керек

Санкт-Петербургдагы кредиттерди кайра каржылоо: банктар, шарттар, документтер

Совкомбанкта кайра каржылоо жүргүзүлөбү?

«ВТБ 24» пенсионерлерге кредит: шарттары, пайыздары

Эки документ аркылуу кредиттик картаны кантип чыгаруу керек

Банктык эсеп келишими – бул Келишимдин түшүнүгү, шарттары жана шарттары

Citibank кредит картасы: кредиттик сын-пикирлер

CreditPlus: карыз алуучулардын пикирлери. Кредит плюс

Ким кепил боло алат? Кредитке кепилдик берүүчү