Scanf C ֆունկցիայի նկարագրություն
Scanf C ֆունկցիայի նկարագրություն

Video: Scanf C ֆունկցիայի նկարագրություն

Video: Scanf C ֆունկցիայի նկարագրություն
Video: Ինչպես նվազեցնել եկամտահարկը. վարչապետի առաջարկները 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 և այլն: String տիպի փոփոխականների դեպքում կարիք չկա նշել հասցեի նշանը՝ «&», քանի որ տիպի string փոփոխականը զանգված է, իսկ անունը՝ զանգվածի առաջին տարրի հասցեն համակարգչի հիշողության մեջ։.

C-ի օգտագործումը C++-ում
C-ի օգտագործումը C++-ում

Տվյալների մուտքագրման ձևաչափ կամ կառավարման տող

Սկսեք դիտելով scanf C ֆունկցիայի օրինակը նկարագրությունից:


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); վերադարձ 0; // linux համակարգերի պահանջ }

Մուտքային ձևաչափը բաղկացած է հետևյալ չորս պարամետրերից՝ %[width][modifiers] տեսակը: Այս դեպքում «%» նշանը և տեսակը պարտադիր պարամետրեր են: Այսինքն՝ նվազագույն ձևաչափն ունի հետևյալ տեսքը՝ «%s», «%d» և այլն։

Ընդհանուր առմամբ, ֆորմատի տողը կազմող նիշերը բաժանվում են՝

  • ձևաչափի ցուցիչներ՝ %;-ով սկսվող ցանկացած բան
  • տարանջատող կամ բացատ նիշեր - դրանք space, tab(t), new line (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 Ծրագիրը սպասում է տողի մուտքագրմանը: Տողը ցանկացած նիշերի հավաքածու է մինչև հանդիպած առաջին բաժանարար նիշը: Փոփոխականը պետք է լինի string տիպի։
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", փող); //կարդա մուտքագրված հոսքի առաջին 20 նիշերը

Կան մի քանի կարևոր բան, որ պետք է հիշել.

  1. scanf-ը կդադարեցվի, եթե հանդիպի բաժանարար նիշի, նույնիսկ եթե այն չհաշվի 20 նիշ:
  2. Եթե մուտքագրվում է ավելի քան 20 նիշ, ապա միայն առաջին 20 նիշերը կգրվեն փող.

Փոփոխիչներտեսակը (կամ ճշգրտությունը)

splash կոդը
splash կոդը

Սրանք հատուկ դրոշակներ են, որոնք փոփոխում են մուտքագրման համար սպասվող տվյալների տեսակը: Դրոշը նշված է տիպի ցուցիչի ձախ կողմում՝

  • L կամ l (փոքր L) Երբ «l»-ն օգտագործվում է d, i, o, u, x ցուցիչների հետ, դրոշը ցույց է տալիս ծրագրին, որ ակնկալվում է երկարատև մուտքագրում: Երբ օգտագործում եք «l» e կամ f ցուցիչով, դրոշակն ասում է ծրագրին, որ այն պետք է կրկնակի արժեք ակնկալի: «L»-ի օգտագործումը հաղորդում է ծրագրին, որ սպասվում է երկար կրկնապատկում: «l»-ի օգտագործումը «c» և «s» ցուցիչներով ծրագրին ասում է, որ սպասվում են wchar_t-ի նման երկու բայթ նիշեր: Օրինակ՝ «%lc», «%ls», «%l[asd]»:
  • h-ը դրոշակ է, որը ցույց է տալիս կարճ տեսակը:
  • hh - ցույց է տալիս, որ փոփոխականը ցուցիչ է դեպի ստորագրված նիշ կամ անստորագիր նիշ արժեք: Դրոշը կարող է օգտագործվել d, i, o, u, x, n բնութագրիչների հետ:
  • ll (երկու փոքր L) - ցույց է տալիս, որ փոփոխականը ցուցիչ է նշանավոր long long int կամ անստորագիր 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", փող); //եթե կոնսոլում մուտքագրեք «1d2s3d1;3» տողը, str scanf-ում կգրվի միայն «1d2» ("%dminus%d", &x, &y); //2 թվերի միջև մինուս նիշերը կհեռացվեն scanf("%5[0-9]", str); // նիշերը մուտքագրվելու են str-ի մեջ այնքան ժամանակ, մինչև 5 նիշ լինի, իսկ նիշերը լինեն 0-ից մինչև 9 թվեր: scanf("%lf", &d); //ակնկալում է կրկնակի մուտքագրում ("%hd", &x); //տիպի ակնկալվող թիվը short scanf("%hu", &y); //ակնկալել անստորագիր թվի կարճ scanf("lx", &z); //տիպի ակնկալվող թիվը երկար int

-իցՍտորև բերված օրինակները ցույց են տալիս, թե ինչպես է փոխվում սպասվող թիվը՝ օգտագործելով տարբեր նշաններ:

scanf C - նկարագրություն սկսնակների համար

Այս բաժինը օգտակար կլինի սկսնակների համար: Հաճախ անհրաժեշտ է ունենալ ոչ այնքան scanf C-ի ամբողջական նկարագրությունը, որքան գործառույթի աշխատանքի մանրամասները:

  • Այս հատկությունը որոշ չափով հնացած է: Տարբեր տարբերակների գրադարաններում կան մի քանի տարբեր իրականացումներ: Օրինակ՝ բարելավված scanf S C ֆունկցիան, որի նկարագրությունը կարելի է գտնել microsoft-ի կայքում։
  • Ձևաչափի ցուցիչների թիվը պետք է համապատասխանի ֆունկցիային փոխանցված արգումենտների քանակին:
  • Մուտքային հոսքի տարրերը պետք է առանձնացվեն միայն բաժանարար նիշերով՝ բացատ, ներդիր, նոր տող: Ստորակետ, կետ-ստորակետ, կետ և այլն. այս նիշերը բաժանող չեն scanf() ֆունկցիայի համար:
  • Եթե scanf-ը հանդիպի բաժանարար նիշի, մուտքագրումը կդադարեցվի: Եթե մեկից ավելի փոփոխական կա կարդալու, ապա scanf-ը կանցնի հաջորդ փոփոխականի ընթերցմանը:
  • Մուտքային տվյալների ձևաչափի ամենափոքր անհամապատասխանությունը հանգեցնում է ծրագրի անկանխատեսելի արդյունքների: Դե, եթե ծրագիրը պարզապես ավարտվում է սխալով: Բայց հաճախ ծրագիրը շարունակում է աշխատել և սխալ է անում:
  • scanf ("%20s…", …); Եթե մուտքագրման հոսքը գերազանցում է 20 նիշը, ապա scanf-ը կկարդա առաջին 20 նիշերը և կամ կդադարեցնի կամ կանցնի հաջորդ փոփոխականի ընթերցմանը, եթե նշված է մեկը: Այս դեպքում սկանավորման հաջորդ կանչը կշարունակի մուտքագրման հոսքի ընթերցումը այն կետից, որտեղ դադարել է սկանավորման նախորդ կանչի աշխատանքը: Եթե առաջին 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-ի ռուսերեն նկարագրությունը հասանելի է բազմաթիվ ցանցային աղբյուրներում, ինչպես նաև դրա օրինակները.օգտագործել՝ պայմանավորված ֆունկցիայի տարիքով։ Հետևաբար, անհրաժեշտության դեպքում, պատասխանը միշտ կարող եք գտնել թեմատիկ ֆորումներում։

Խորհուրդ ենք տալիս: