Scanf C функциясының сипаттамасы
Scanf C функциясының сипаттамасы

Бейне: Scanf C функциясының сипаттамасы

Бейне: Scanf C функциясының сипаттамасы
Бейне: Байбактина А.Т. Программалау. Функция Си. 2024, Мамыр
Anonim

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

scanf C функциясы - сипаттама

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

scanf("%формат", &айнымалы1[, &айнымалы2, […]), мұнда айнымалылар мекенжайлар ретінде беріледі. Функцияға айнымалы мәндерді берудің бұл тәсілінің себебі түсінікті: жұмыс нәтижесінде ол қателердің бар екенін көрсететін мәнді қайтарады, сондықтанайнымалы мәндерді өзгертудің жалғыз жолы - мекенжай бойынша өту. Сондай-ақ, осы әдістің арқасында функция кез келген түрдегі деректерді өңдей алады.

Кейбір бағдарламашылар басқа тілдерге ұқсастығына байланысты 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

Бағдарлама таңбаны енгізуді күтуде. Жазылатын айнымалы таңба түріндегі 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 таңба жазылады.

Модификаторлартүрі (немесе дәлдігі)

шашырау коды
шашырау коды

Бұл енгізу үшін күтілетін деректер түрін өзгертетін арнайы жалаушалар. Жалау түр спецификаторының сол жағында көрсетілген:

  • L немесе l (кіші L) "l" d, i, o, u, x спецификаторларымен бірге пайдаланылғанда, жалауша бағдарламаға ұзын кіріс енгізу күтілетінін хабарлайды. e немесе f спецификаторымен «l» пайдаланған кезде жалауша бағдарламаға қос мәнді күту керектігін айтады. «L» әрпін пайдалану бағдарламаға ұзақ дубль күтілетінін айтады. «c» және «s» спецификаторларымен «l» пайдалану бағдарламаға 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 - айнымалының 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); // 5 таңба болғанша және таңбалар 0-ден 9-ға дейінгі сандар болғанша str ішіне символдар енгізіледі. 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-ке келесі шақыру сканерлеуге алдыңғы шақырудың жұмысы тоқтаған жерден кіріс ағынын оқуды жалғастырады. Алғашқы 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 сипаттамасы көптеген желілік көздерде, сондай-ақ оның мысалдарында бар екенін атап өткен жөн.пайдалану, функцияның жасына байланысты. Сондықтан, қажет болса, сіз әрқашан тақырыптық форумдардан жауапты таба аласыз.

Ұсынылған:

Редактордың таңдауы

Өз бизнесіңізді бастау үшін ең жақсы жас: оқу

NPF "Welfare" пен Алексей Тайхер "Трансфин-М"-ді 35 миллиард рубльге сату туралы келісімге қол қойды

Байкал целлюлоза-қағаз комбинаты: тұрақсыз өндіріс жаңғырығы

Тыңайтқыштар дегеніміз не: түрлері, жіктелуі, құрамы, тағайындалуы

Қара ет қосылған тауықтар: тұқым атауы, сипаттамасы бар фото

Туынды ГЭС: сипаттамасы, жұмыс істеу принципі, қай жерде қолданылады

Шыны қалай жасауға болады? Шыны өндіру технологиясы. шыныдан жасалған бұйымдар

«Aliexpress» арқылы нені қайта сатуға болады: тауарды таңдау бойынша кеңестер, күтілетін пайда

Томат «ұлы жауынгер»: сипаттамасы, сипаттамалары, шолулары

Американдық бизнес идеялар: жаңа, түпнұсқа, танымал

Tomato Etual: сорттың сипаттамасы, өнімділігі, фотосуреттері және шолулары

Үйде күркетауықты қалай ұстау керек: қажетті шарттар мен талаптар

Бизнесті дамыту бойынша кеңестер: Етке арналған гобилерді бордақылау

AirBitClub жобасы: пайдаланушы пікірлері

Welsumer тауық тұқымы: сипаттамасы, мазмұны, артықшылықтары мен кемшіліктері, шолулар