Maelezo ya chaguo la kukokotoa la Scanf C
Maelezo ya chaguo la kukokotoa la Scanf C

Video: Maelezo ya chaguo la kukokotoa la Scanf C

Video: Maelezo ya chaguo la kukokotoa la Scanf C
Video: HISTORIA YA SARAFU NA MAAJABU YAKE TANZANIA JIONEE...... 2024, Novemba
Anonim

Katika makala haya, chaguo za kukokotoa za scanf() huzingatiwa katika muundo wa jumla bila kurejelea kiwango mahususi, kwa hivyo data kutoka viwango vyovyote vya C99, C11, C++11, C++14 imejumuishwa hapa. Pengine, katika viwango vingine, chaguo la kukokotoa hufanya kazi na tofauti kutoka kwa nyenzo iliyotolewa katika makala.

scanf C - maelezo

scanf() ni chaguo za kukokotoa zinazopatikana katika faili za vichwa vya stdio.h(C) na cstdio(C++), pia hujulikana kama uingizaji wa programu ulioumbizwa. scanf husoma herufi kutoka kwa mkondo wa kawaida wa ingizo (stdin) na kuzibadilisha kulingana na umbizo, kisha kuziandika kwa anuwai maalum. Umbizo - inamaanisha kuwa data inabadilishwa kuwa fomu fulani baada ya kupokelewa. Kwa hivyo, utendakazi wa scanf C umefafanuliwa:

scanf("%format", &variable1[, &variable2, […]), ambapo vigezo vinapitishwa kama anwani. Sababu ya njia hii ya kupitisha vigezo kwa kazi ni dhahiri: kama matokeo ya kazi, inarudisha thamani inayoonyesha uwepo wa makosa, kwa hivyo.njia pekee ya kubadilisha maadili ya vigezo ni kwa kupita kwa anwani. Pia, kutokana na mbinu hii, chaguo la kukokotoa linaweza kuchakata data ya aina yoyote.

Baadhi ya watayarishaji programu hurejelea vitendaji kama vile scanf() au printf() kama taratibu kwa sababu ya mlinganisho na lugha nyingine.

Scanf huruhusu uingizaji wa aina zote za lugha msingi: char, int, float, string, nk. Katika kesi ya vigezo vya aina ya kamba, hakuna haja ya kutaja ishara ya anwani - "&", kwa kuwa kutofautiana kwa kamba ya aina ni safu, na jina lake ni anwani ya kipengele cha kwanza cha safu kwenye kumbukumbu ya kompyuta..

Kutumia C katika C++
Kutumia C katika C++

Muundo wa kuingiza data au mfuatano wa kudhibiti

Anza kwa kuangalia mfano wa chaguo la kukokotoa wa scanf kutoka kwa maelezo.


include int main() { int x; huku (scanf("%d", &x)==1) printf("%d\n", x); kurudi 0; //mahitaji ya mifumo ya linux }

Muundo wa ingizo unajumuisha vigezo vinne vifuatavyo: %[upana][modifiers] aina. Katika kesi hii, ishara "%" na aina ni vigezo vya lazima. Hiyo ni, umbizo la chini kabisa linaonekana kama hii: “%s”, “%d” na kadhalika.

Kwa ujumla, herufi zinazounda mfuatano wa umbizo zimegawanywa katika:

  • vibainishi vya umbizo - chochote kinachoanza na %;
  • kutenganisha au herufi za nafasi - ni nafasi, kichupo(t), mstari mpya (n);
  • herufi zaidi ya nafasi nyeupe.

Utendaji huenda si salama.

Tumia scanf_s() badala ya scanf().

(ujumbe kutoka Visual Studio)

Aina, au viambishi vya umbizo, au vibambo vya ubadilishaji, au vibambo vya kudhibiti

msimbo wa binary
msimbo wa binary

Tamko la scanf lazima liwe na angalau kibainishi cha umbizo, ambacho kimebainishwa mwishoni mwa maneno yanayoanza na "%". Inaambia programu aina ya data ya kutarajia wakati wa kuingia, kwa kawaida kutoka kwa kibodi. Orodha ya viambishi vyote vya umbizo katika jedwali lililo hapa chini.

Aina Maana

1

%c Programu inasubiri ingizo la herufi. Kigezo kitakachoandikwa lazima kiwe cha aina ya herufi char.
2 %d Mpango unatarajia uingizaji wa nambari ya desimali ya aina kamili. Tofauti lazima iwe ya aina int.
3 %i Mpango unatarajia uingizaji wa nambari ya desimali ya aina kamili. Tofauti lazima iwe ya aina int.
4 %e, %E Programu inatarajia kuingiza nambari ya sehemu inayoelea (koma) katika umbo la kielelezo. Tofauti lazima iwe ya aina ya kuelea.
5 %f Programu inatarajia nambari ya uhakika inayoelea (koma). Tofauti lazima iwe ya aina ya kuelea.
6 %g, %G Programu inatarajia nambari ya uhakika inayoelea (koma). Tofauti lazima iwe ya aina ya kuelea.
7 %a Programu inatarajia nambari ya uhakika inayoelea (koma). Tofauti lazima iwe ya aina ya kuelea.
8 %o Mpango unatarajia nambari ya octal. Tofauti lazima iwe ya aina int.
9 %s Programu inasubiri mfuatano kuandikwa. Mfuatano ni seti ya herufi zozote hadi herufi ya kitenganishi cha kwanza kupatikana. Tofauti lazima iwe ya aina ya mfuatano.
10 %x, %X Programu inasubiri nambari ya heksadesimali. Tofauti lazima iwe ya aina int.
11 %p Variable inatarajia uingizaji wa kielekezi. Tofauti lazima iwe ya aina ya kielekezi.
12 %n

Huandika kwa kigezo thamani kamili sawa na idadi ya herufi zilizosomwa hadi sasa na chaguo la kukokotoa la scanf.

13 %u Programu inasoma nambari kamili ambayo haijatiwa saini. Aina tofauti lazima iwe nambari kamili isiyotiwa saini.
14 %b Programu inasubiri nambari ya mfumo wa jozi. Tofauti lazima iwe ya aina int.
15 % Seti ya vibambo vilivyochanganuliwa. Programu inasubiri wahusika kuingizwa.kutoka kwa bwawa dogo lililobainishwa kati ya mabano ya mraba. scanf itafanya kazi mradi tu kuna vibambo kutoka kwa seti iliyobainishwa kwenye mkondo wa kuingiza data.
16 %% saini "%".

Herufi katika mfuatano wa umbizo

Msimbo wa C++
Msimbo wa C++

Alama ya nyota ()

Nyota () ni bendera inayoonyesha kwamba utendakazi wa mgawo unapaswa kukandamizwa. Nyota huwekwa mara baada ya ishara "%". Kwa mfano,


scaf("%d%c%d", &x, &y); //puuza herufi kati ya nambari mbili kamili. scanf("%s%d%s", str, str2); //puuza nambari kamili kati ya mifuatano miwili.

Yaani ukiingiza mstari "45-20" kwenye kiweko, programu itafanya yafuatayo:

  1. Kigezo "x" kitapewa thamani 45.
  2. Kigezo "y" kitapewa thamani 20.
  3. Na alama ya minus (dashi) "-" itapuuzwa kutokana na "%c".

Upana (au upana wa uwanja)

Hii ni nambari kamili kati ya ishara "%" na kiambishi cha umbizo ambacho hubainisha idadi ya juu zaidi ya herufi za kusoma katika utendakazi wa sasa wa kusoma.


scaf("%20s", str); //soma herufi 20 za kwanza kutoka kwa mkondo wa kuingiza sauti

Kuna mambo machache muhimu ya kuzingatia:

  1. scanf itakoma ikiwa itakutana na herufi ya kitenganishi, hata kama haikuhesabu herufi 20.
  2. Ikiwa zaidi ya vibambo 20 vimeingizwa, ni herufi 20 pekee ndizo zitakazoandikwa kwa str.

Virekebishajiaina (au usahihi)

msimbo wa splash
msimbo wa splash

Hizi ni alama maalum ambazo hurekebisha aina ya data inayotarajiwa kuingizwa. Bendera imebainishwa upande wa kushoto wa kibainishi cha aina:

  • L au l (L ndogo) Wakati "l" inatumiwa pamoja na viambishi d, i, o, u, x, bendera huambia programu kwamba uingizaji wa int mrefu unatarajiwa. Unapotumia "l" na kibainishi cha e au f, bendera huambia programu kwamba inapaswa kutarajia thamani maradufu. Matumizi ya "L" huambia programu kuwa mara mbili ndefu inatarajiwa. Matumizi ya "l" na vibainishi vya "c" na "s" huambia programu kuwa herufi za baiti mbili kama vile wchar_t zinatarajiwa. Kwa mfano, "%lc", "%ls", "%l[asd]".
  • h ni bendera inayoonyesha aina fupi.
  • hh - inaonyesha kuwa kigezo ni kiashirio cha char iliyotiwa sahihi au thamani ya char ambayo haijatiwa saini. Bendera inaweza kutumika pamoja na viambishi d, i, o, u, x, n.
  • ll (L mbili ndogo) - inaonyesha kuwa kigezo ni kielekezi cha thamani ya aina iliyotiwa saini int ndefu au int ndefu isiyo na saini. Bendera hutumiwa pamoja na viambishi: d, i, o, u, x, n.
  • j - inaonyesha kuwa kigezo ni kielekezi cha aina ya intmax_t au uintmax_t kutoka kwa faili ya kichwa cha stdint.h. Inatumika pamoja na vibainishi: d, i, o, u, x, n.
  • z - inaonyesha kuwa kigezo ni kielekezi kwa aina ya size_t, ambayo ufafanuzi wake uko katika stddef.h. Inatumika pamoja na vibainishi: d, i, o, u, x, n.
  • t - inaonyesha kuwa kigezo ni kiashirio cha aina ya ptrdiff_t. Ufafanuzi umewashwaaina hii ni katika stddef.h. Inatumika pamoja na vibainishi: d, i, o, u, x, n.

Kwa uwazi zaidi, picha iliyo na virekebishaji inaweza kuwakilishwa kama jedwali. Maelezo kama haya ya scanf C kwa watayarishaji programu yatakuwa wazi zaidi.

Vibainishi vya Aina na Virekebishaji
Vibainishi vya Aina na Virekebishaji

Wahusika wengine

Vibambo vyovyote vilivyopatikana katika umbizo vitatupwa. Wakati huo huo, ni lazima ieleweke kwamba kuwepo kwa wahusika wa wazungu au watenganishaji (line mpya, nafasi, tab) katika kamba ya kudhibiti inaweza kusababisha tabia tofauti ya kazi. Katika toleo moja, scanf() itasoma bila kuhifadhi idadi yoyote ya vitenganishi hadi itakapokutana na mhusika mwingine isipokuwa kitenganishi, na katika toleo lingine, nafasi (wao pekee) hazina jukumu na usemi "%d + %d" ni sawa na "% d+%d".

Mfano wa nambari ya C++
Mfano wa nambari ya C++

Mifano

Hebu tuangalie baadhi ya mifano ili kukusaidia kufikiria na kuelewa vyema jinsi chaguo la kukokotoa linavyofanya kazi.


scanf("%3s", str); // ukiingiza kamba "1d2s3d1;3" kwenye dashibodi, "1d2" pekee ndiyo itakayoandikwa kwa str scanf("%dminus%d", &x, &y); //minus herufi kati ya nambari mbili zitatupwa scanf("%5[0-9]", str); herufi // zitaingizwa kwenye str hadi kuwe na herufi 5 na herufi ni nambari kutoka 0 hadi 9. scanf("%lf", &d); //tarajie skanf ingizo maradufu("%hd", &x); // nambari inayotarajiwa ya aina fupi ya scanf("%hu", &y); //tarajie scanf fupi ya nambari ambayo haijatiwa sahihi("lx", &z); //nambari inayotarajiwa ya aina ndefu int

KutokaMifano hapa chini inaonyesha jinsi nambari inayotarajiwa inavyobadilika kwa kutumia alama tofauti.

scaf C - maelezo kwa wanaoanza

Sehemu hii itakuwa muhimu kwa wanaoanza. Mara nyingi huhitaji kuwa na maelezo kamili ya scanf C kama maelezo ya jinsi chaguo hili la kukokotoa linavyofanya kazi.

  • Kipengele hiki kimepitwa na wakati kwa kiasi. Kuna utekelezaji kadhaa tofauti katika maktaba za matoleo tofauti. Kwa mfano, utendakazi wa scanf S C ulioboreshwa, maelezo yake yanaweza kupatikana kwenye tovuti ya Microsoft.
  • Nambari ya viambishi katika umbizo lazima ilingane na idadi ya hoja zinazopitishwa kwenye chaguo la kukokotoa.
  • Vipengele vya mtiririko wa ingizo lazima vitenganishwe na vibambo vya kitenganishi: nafasi, kichupo, laini mpya. Koma, nusu koloni, kipindi, n.k. - herufi hizi si vitenganishi vya chaguo la kukokotoa la scanf().
  • Ikiwa scanf itakumbana na herufi ya kitenganishi, ingizo litasimamishwa. Ikiwa kuna kigezo zaidi ya kimoja cha kusoma, basi scanf itaendelea na kusoma kigezo kifuatacho.
  • Kutofautiana kidogo katika umbizo la data ya ingizo husababisha matokeo yasiyotabirika ya programu. Kweli, ikiwa programu itaisha na hitilafu. Lakini mara nyingi programu huendelea kufanya kazi na kuifanya vibaya.
  • scanf("%20s …", …); Iwapo mtiririko wa ingizo unazidi herufi 20, basi scanf itasoma vibambo 20 vya kwanza na ama kuacha au kuendelea na kusoma kigezo kifuatacho, ikiwa kimoja kimebainishwa. Katika hali hii, simu inayofuata kwa scanf itaendelea kusoma mtiririko wa ingizo kutoka mahali ambapo kazi ya simu ya awali ya scanf ilisimama. Ikiwa wakati wa kusoma 20 ya kwanzaherufi, herufi ya kutofautisha inakabiliwa, scanf itaacha au itaendelea kusoma kigezo kifuatacho, hata kama haikusoma herufi 20 kwa kigezo cha kwanza. Katika hali hii, herufi zote ambazo hazijasomwa zitaambatishwa kwa kigezo kifuatacho.
  • Ikiwa seti ya herufi zilizochanganuliwa itaanza na "^", basi scanf itasoma data hadi ikutane na herufi ya kuweka kikomo au herufi kutoka kwa seti. Kwa mfano, "%[^A-E1-5]" itasoma data kutoka kwa mkondo hadi mojawapo ya herufi kubwa za Kiingereza kutoka A hadi E au mojawapo ya nambari kutoka 1 hadi 5 ipatikane.
  • Kitendakazi cha scanf C, kama ilivyofafanuliwa, hurejesha nambari sawa na nambari iliyofaulu ya kuandika kwa vigeu. Ikiwa scanf inaandika vigezo 3, basi matokeo ya mafanikio ya kazi yatarudi namba 3. Ikiwa scanf haikuweza kuandika vigezo vyovyote, basi matokeo yatakuwa 0. Na, hatimaye, ikiwa scanf haikuweza kuanza kabisa kwa sababu fulani, matokeo yatakuwa EOF.
  • Ikiwa chaguo za kukokotoa za scanf() zilimalizika vibaya. Kwa mfano, scanf("%d", &x) - nambari ilitarajiwa, lakini herufi zilipokelewa kama ingizo. Simu inayofuata ya scanf() itaanza katika sehemu ya mkondo wa kuingiza sauti ambapo simu ya awali ya chaguo la kukokotoa iliishia. Ili kuondokana na tatizo hili, ni muhimu kuondokana na wahusika wa tatizo. Hii inaweza kufanyika, kwa mfano, kwa kupiga simu scanf("%s"). Hiyo ni, kazi itasoma safu ya wahusika na kuitupa. Kwa njia hii ya ujanja, unaweza kuendelea kuingiza data muhimu.
  • Katika baadhi ya utekelezaji wa scanf(), "-" hairuhusiwi katika seti ya herufi iliyochanganuliwa.
  • Kibainishi cha "%c" husoma kila herufi kutoka kwa mkondo. Hiyo ni, pia inasoma tabia ya kitenganishi. Ili kuruka kibambo cha kuweka mipaka na kuendelea kusoma herufi unayotaka, unaweza kutumia "%1s".
  • Unapotumia kibainishi cha "c", inaruhusiwa kutumia upana "%10c", lakini safu ya vipengee vya aina ya char lazima ipitishwe kama kigezo cha chaguo za kukokotoa cha scanf.
  • “%[a-z]” inamaanisha "herufi zote ndogo za alfabeti ya Kiingereza", na "%[z-a]" inamaanisha herufi 3 tu: 'z', 'a', '-'. Kwa maneno mengine, herufi "-" inamaanisha safu ikiwa tu iko kati ya herufi mbili ambazo ziko katika mpangilio sahihi. Ikiwa "-" iko mwisho wa usemi, mwanzoni, au katika mpangilio mbaya wa herufi katika pande zote mbili, basi ni herufi ya kistari, si safu.
Msimbo wa C++
Msimbo wa C++

Hitimisho

Hii inahitimisha maelezo ya scanf C. Hiki ni kipengele kizuri cha kufanya kazi katika programu ndogo na wakati wa kutumia mbinu ya utayarishaji ya utaratibu. Hata hivyo, hasara kuu ni idadi ya makosa ambayo haitabiriki ambayo yanaweza kutokea wakati wa kutumia scanf. Kwa hiyo, maelezo ya scanf C wakati programu ni bora kuwekwa mbele ya macho yako. Katika miradi mikubwa ya kitaaluma, iostreams hutumiwa, kutokana na ukweli kwamba wana uwezo wa juu, wana uwezo wa kukamata na kushughulikia makosa, na pia hufanya kazi kwa kiasi kikubwa cha habari. Inapaswa pia kuzingatiwa kuwa maelezo ya scanf C kwa Kirusi yanapatikana kwenye vyanzo vingi vya mtandao, pamoja na mifano yake.tumia, kwa sababu ya umri wa kazi. Kwa hivyo, ikiwa ni lazima, unaweza kupata jibu kila wakati kwenye mabaraza ya mada.

Ilipendekeza: