Scanf C funksiyasının təsviri
Scanf C funksiyasının təsviri

Video: Scanf C funksiyasının təsviri

Video: Scanf C funksiyasının təsviri
Video: Çin, Hindistan və Yaponiya XlX-XX əsrin əvvəllərində. 2024, Bilər
Anonim

Bu məqalədə scanf() funksiyası xüsusi standarta istinad etmədən ümumi formada nəzərdən keçirilir, ona görə də hər hansı C99, C11, C++11, C++14 standartlarından məlumatlar buraya daxil edilir. Ola bilsin ki, bəzi standartlarda funksiya məqalədə təqdim olunan materialdan fərqli olaraq işləyir.

scanf C funksiyası - təsvir

scanf() stdio.h(C) və cstdio(C++) başlıq fayllarında yerləşən və formatlaşdırılmış proqram girişi kimi də tanınan funksiyadır. scanf standart giriş axınından (stdin) simvolları oxuyur və onları formata uyğun olaraq çevirir, sonra onları müəyyən edilmiş dəyişənlərə yazır. Format - məlumatların alındıqdan sonra müəyyən bir formaya çevrilməsi deməkdir. Beləliklə, scanf C funksiyası təsvir edilmişdir:

scanf("%format", &dəyişən1[, &dəyişən2, […]), burada dəyişənlər ünvan kimi ötürülür. Dəyişənlərin funksiyaya bu şəkildə ötürülməsinin səbəbi aydındır: iş nəticəsində o, xətaların mövcudluğunu göstərən dəyər qaytarır, buna görə dədəyişənlərin dəyərlərini dəyişdirməyin yeganə yolu ünvandan keçməkdir. Həmçinin, bu üsul sayəsində funksiya istənilən növ məlumatları emal edə bilər.

Bəzi proqramçılar scanf() və ya printf() kimi funksiyaları digər dillərlə bənzətdiyinə görə prosedurlar kimi adlandırırlar.

Scanf bütün əsas dil növlərini daxil etməyə imkan verir: char, int, float, string və s. Sətir tipli dəyişənlər üçün ünvan işarəsini - "&" göstərməyə ehtiyac yoxdur, çünki sətir tipli dəyişən massivdir və onun adı kompüterin yaddaşında massivin birinci elementinin ünvanıdır..

C++ dilində C-dən istifadə
C++ dilində C-dən istifadə

Məlumat daxiletmə formatı və ya nəzarət sətri

Təsvirdən scanf C funksiyası nümunəsinə baxaraq başlayın.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); 0 qaytarmaq; //linux sistemləri üçün tələb }

Daxiletmə formatı aşağıdakı dörd parametrdən ibarətdir: %[width][modifiers] type. Bu halda, "%" işarəsi və növü məcburi parametrlərdir. Yəni minimum format belə görünür: “%s”, “%d” və s.

Ümumilikdə format sətirini təşkil edən simvollar aşağıdakılara bölünür:

  • format təyinediciləri - % ilə başlayan hər şey;
  • ayırıcı və ya boşluq simvolları - bunlar boşluq, tab(t), yeni sətir (n);
  • boşluqdan başqa simvol.

Funksiya təhlükəsiz olmaya bilər.

Scanf() yerinə scanf_s() istifadə edin.

(Visual Studio-dan mesaj)

Növ və ya format spesifikatorları, yaxud konversiya simvolları və ya nəzarət simvolları

ikili kod
ikili kod

Scanf C bəyannaməsində ən azı "%" ilə başlayan ifadələrin sonunda göstərilən format təyinedicisi olmalıdır. O, proqrama adətən klaviaturadan daxil olan zaman gözlənilən məlumat növünü bildirir. Aşağıdakı cədvəldə bütün format təyinedicilərinin siyahısı.

Növ Məna
1 %c Proqram simvol daxil edilməsini gözləyir. Yazılacaq dəyişən simvol tipində olmalıdır.
2 %d Proqram tam ədəd tipli onluq ədədin daxil edilməsini gözləyir. Dəyişən int tipli olmalıdır.
3 %i

Proqram tam ədəd tipli onluq ədədin daxil edilməsini gözləyir. Dəyişən int tipli olmalıdır.

4 %e, %E Proqram eksponensial formada üzən nöqtə (vergül) nömrə daxil etməyi gözləyir. Dəyişən float tipli olmalıdır.
5 %f Proqram üzən nöqtə sayı (vergül) gözləyir. Dəyişən float tipli olmalıdır.
6 %g, %G Proqram üzən nöqtə sayı (vergül) gözləyir. Dəyişən float tipli olmalıdır.
7 %a Proqram üzən nöqtə sayı (vergül) gözləyir. Dəyişən float tipli olmalıdır.
8 %o Proqram səkkizlik nömrə gözləyir. Dəyişən int tipli olmalıdır.
9 %s Proqram sətirin daxil edilməsini gözləyir. Sətir rast gələn ilk ayırıcı simvola qədər hər hansı simvollar toplusudur. Dəyişən sətir tipli olmalıdır.
10 %x, %X Proqram on altılıq nömrəni gözləyir. Dəyişən int tipli olmalıdır.
11 %p Dəyişən göstərici daxiletməsini gözləyir. Dəyişən göstərici tipli olmalıdır.
12 %n Dəyişənə scanf funksiyası tərəfindən indiyə qədər oxunan simvolların sayına bərabər tam dəyər yazır.
13 %u Proqram işarəsiz tam ədədi oxuyur. Dəyişən növü işarəsiz tam ədəd olmalıdır.
14 %b Proqram ikili nömrəni gözləyir. Dəyişən int tipli olmalıdır.
15 % Skan edilmiş simvol dəsti. Proqram simvolların daxil edilməsini gözləyir.kvadrat mötərizə arasında göstərilən məhdud hovuzdan. scanf daxiletmə axınında göstərilən dəstdən simvollar olduğu müddətdə işləyəcək.

16

%% "%" işarəsi qoyun.

Format sətirindəki simvollar

C++ kodu
C++ kodu

Ulduz simvolu ()

Ulduz işarəsi () təyinat əməliyyatının dayandırılmalı olduğunu göstərən bayraqdır. "%" işarəsindən dərhal sonra ulduz işarəsi qoyulur. Məsələn,


scanf("%d%c%d", &x, &y); //iki tam ədəd arasındakı simvolu nəzərə alma. scanf("%s%d%s", küç, str2); //iki sətir arasındakı tam ədədi rədd edin.

Yəni konsolda "45-20" sətrini daxil etsəniz, proqram aşağıdakıları edəcək:

  1. "x" dəyişəninə 45 dəyəri təyin ediləcək.
  2. "y" dəyişəninə 20 dəyəri təyin ediləcək.
  3. Və mənfi işarəsi (tire) "-" "%c" sayəsində nəzərə alınmayacaq.

Eni (və ya sahə eni)

Bu, cari oxu əməliyyatında oxunacaq simvolların maksimum sayını təyin edən "%" işarəsi ilə format təyinedicisi arasındakı tam ədəddir.


scanf("%20s", küç); //giriş axınından ilk 20 simvolu oxuyun

Bir neçə vacib şeyi yadda saxlamaq lazımdır:

  1. scanf, hətta 20 simvolu saymasa belə, ayırıcı simvolla qarşılaşarsa, dayandırılacaq.
  2. 20-dən çox simvol daxil edilərsə, yalnız ilk 20 simvol küç.-ə yazılacaq.

Dəyişdiricilərnöv (və ya dəqiqlik)

sıçrama kodu
sıçrama kodu

Bunlar daxiletmə üçün gözlənilən məlumat növünü dəyişdirən xüsusi bayraqlardır. Bayraq tip spesifikatorunun solunda göstərilib:

  • L və ya l (kiçik L) "l" d, i, o, u, x təyinediciləri ilə istifadə edildikdə, bayraq proqrama uzun int girişinin gözlənildiyini bildirir. e və ya f təyinedicisi ilə "l" istifadə edərkən, bayraq proqrama ikiqat dəyər gözləməli olduğunu bildirir. "L" hərfinin istifadəsi proqrama uzun dublun gözlənildiyini bildirir. "c" və "s" təyinediciləri ilə "l" istifadə edilməsi proqrama wchar_t kimi iki baytlıq simvolların gözlənildiyini bildirir. Məsələn, "%lc", "%ls", "%l[asd]".
  • h qısa növü göstərən bayraqdır.
  • hh - dəyişənin işarəli simvol və ya işarəsiz simvol dəyərinə göstərici olduğunu göstərir. Bayraq d, i, o, u, x, n təyinediciləri ilə istifadə edilə bilər.
  • ll (iki kiçik L) - dəyişənin signed long long int və ya unsigned long long int tipli qiymətə göstərici olduğunu göstərir. Bayraq təyinedicilərlə istifadə olunur: d, i, o, u, x, n.
  • j - dəyişənin stdint.h başlıq faylından intmax_t və ya uintmax_t tipinə göstərici olduğunu göstərir. Müəyyənedicilərlə istifadə olunur: d, i, o, u, x, n.
  • z - dəyişənin size_t tipinə göstərici olduğunu göstərir, onun tərifi stddef.h-dədir. Müəyyənedicilərlə istifadə olunur: d, i, o, u, x, n.
  • t - dəyişənin ptrdiff_t növü üçün göstərici olduğunu göstərir. Tərif açıqdırbu tip stddef.h-dədir. Müəyyənedicilərlə istifadə olunur: d, i, o, u, x, n.

Daha aydın şəkildə dəyişdiriciləri olan şəkil cədvəl şəklində təqdim edilə bilər. Proqramçılar üçün scanf C-nin belə təsviri daha aydın olacaq.

Tip təyinediciləri və dəyişdiriciləri
Tip təyinediciləri və dəyişdiriciləri

Digər simvollar

Formatda rast gəlinən hər hansı simvol silinəcək. Eyni zamanda qeyd etmək lazımdır ki, idarəetmə sətirində boşluq və ya ayırıcı simvolların (yeni sətir, boşluq, tab) olması funksiyanın fərqli davranışına səbəb ola bilər. Bir versiyada scanf() ayırıcıdan başqa simvolla qarşılaşana qədər heç bir sayda ayırıcı saxlamadan oxuyacaq, digər versiyada isə boşluqlar (yalnız onlar) rol oynamır və "%d + %d" ifadəsi "% d+%d" ilə bərabərdir.

C++ kodu nümunəsi
C++ kodu nümunəsi

Nümunələr

Funksiyanın necə işlədiyini düşünməyə və daha yaxşı başa düşməyə kömək etmək üçün bəzi nümunələrə baxaq.


scanf("%3s", küç); //konsolda "1d2s3d1;3" sətirini daxil etsəniz, str scanf("%dminus%d", &x, &y); //iki ədəd arasındakı mənfi simvollar silinəcək scanf("%5[0-9]", str); // simvollar 5 simvol olana və simvollar 0-dan 9-a qədər rəqəmlər olana qədər str-ə daxil ediləcək. scanf("%lf", &d); //ikiqat daxiletməni gözləyin scanf("%hd", &x); //gözlənilən sayı short scanf("%hu", &y); //imzasız nömrəni gözləyin short scanf("lx", &z); //uzun int növünün gözlənilən sayı

KimdənAşağıdakı nümunələr gözlənilən rəqəmin müxtəlif simvollardan istifadə edərək necə dəyişdiyini göstərir.

scanf C - yeni başlayanlar üçün təsvir

Bu bölmə yeni başlayanlar üçün faydalı olacaq. Çox vaxt əlinizdə scanf C-nin tam təsviri deyil, funksiyanın necə işlədiyinin təfərrüatları olmalıdır.

  • Bu funksiya bir qədər köhnəlib. Müxtəlif versiyaların kitabxanalarında bir neçə fərqli tətbiqetmə var. Məsələn, təsviri microsoft saytında tapıla bilən təkmilləşdirilmiş scanf S C funksiyası.
  • Formatdakı təyinedicilərin sayı funksiyaya ötürülən arqumentlərin sayına uyğun olmalıdır.
  • Daxiletmə axını elementləri yalnız ayırıcı simvollarla ayrılmalıdır: boşluq, nişan, yeni sətir. Vergül, nöqtəli vergül, nöqtə və s. - bu simvollar scanf() funksiyası üçün ayırıcı deyil.
  • Scanf ayırıcı simvolla qarşılaşarsa, daxiletmə dayandırılacaq. Oxumaq üçün birdən çox dəyişən varsa, scanf növbəti dəyişəni oxumağa davam edəcək.
  • Giriş məlumatı formatında ən kiçik uyğunsuzluq proqramın gözlənilməz nəticələrinə gətirib çıxarır. Yaxşı, proqram sadəcə bir səhvlə başa çatırsa. Lakin çox vaxt proqram işləməyə davam edir və səhv edir.
  • scanf("%20s …", …); Əgər daxiletmə axını 20 simvoldan çox olarsa, scanf ilk 20 simvolu oxuyacaq və ya ləğv edəcək, ya da biri göstərilibsə, növbəti dəyişəni oxumağa davam edəcək. Bu halda, scanf-ə növbəti çağırış, scanf-ə əvvəlki çağırışın işinin dayandığı nöqtədən giriş axınını oxumağa davam edəcək. İlk 20-ni oxuyarkənsimvollar, ayırıcı simvolla qarşılaşdıqda, scanf ilk dəyişən üçün 20 simvol oxumasa belə, növbəti dəyişəni dayandıracaq və ya oxumağa davam edəcək. Bu halda, bütün oxunmamış simvollar növbəti dəyişənə əlavə olunacaq.
  • Skan edilmiş simvollar dəsti "^" ilə başlayırsa, o zaman scanf məlumatı ayırıcı simvol və ya çoxluqdakı simvolla qarşılaşana qədər oxuyacaq. Məsələn, "%[^A-E1-5]" A-dan E-yə qədər böyük hərflərlə yazılmış ingilis hərflərindən biri və ya 1-dən 5-ə qədər rəqəmlərdən birinə rast gəlinənə qədər yayımdan verilənləri oxuyacaq.
  • Scanf C funksiyası təsvir edildiyi kimi, dəyişənlərə uğurlu yazıların sayına bərabər ədəd qaytarır. Əgər scanf 3 dəyişən yazırsa, o zaman funksiyanın müvəffəqiyyət nəticəsi 3 rəqəmini qaytaracaq. Əgər scanf heç bir dəyişən yaza bilmədisə, nəticə 0 olacaq. Və nəhayət, əgər scanf nədənsə heç başlaya bilmirsə, nəticə EOF olacaq.
  • Scanf() funksiyası səhv başa çatıbsa. Məsələn, scanf("%d", &x) - rəqəm gözlənilən idi, lakin simvollar giriş kimi qəbul edildi. Növbəti scanf() çağırışı əvvəlki funksiya çağırışının bitdiyi giriş axınının nöqtəsində başlayacaq. Bu problemi aradan qaldırmaq üçün problem simvollarından xilas olmaq lazımdır. Bu, məsələn, scanf("%s") çağırmaqla edilə bilər. Yəni, funksiya simvollar sətirini oxuyacaq və onu atacaq. Bu çətin üsulla siz lazımi məlumatları daxil etməyə davam edə bilərsiniz.
  • Scanf() funksiyasının bəzi tətbiqlərində skan edilmiş simvol dəstində "-" işarəsinə icazə verilmir.
  • "%c" spesifikatoru axındakı hər simvolu oxuyur. Yəni ayırıcı simvolu da oxuyur. Ayırıcı simvolu keçmək və istədiyiniz simvolu oxumağa davam etmək üçün "%1s" istifadə edə bilərsiniz.
  • "c" spesifikatorundan istifadə edərkən "%10c" genişliyindən istifadə etməyə icazə verilir, lakin sonra char tipli elementlər massivi scanf funksiyasına dəyişən kimi ötürülməlidir.
  • “%[a-z]” “İngilis əlifbasının bütün kiçik hərfləri” deməkdir və “%[z-a]” sadəcə 3 simvol deməkdir: ‘z’, ‘a’, ‘-’. Başqa sözlə, "-" simvolu yalnız düzgün ardıcıllıqda olan iki simvol arasında olduqda diapazon deməkdir. Əgər "-" ifadənin sonunda, əvvəlində və ya hər iki tərəfindəki simvolların səhv ardıcıllığındadırsa, o, diapazon deyil, sadəcə defis simvoludur.
C++ kodu
C++ kodu

Nəticə

Bu, scanf C-nin təsvirini yekunlaşdırır. Bu, kiçik proqramlarda işləmək və prosedur proqramlaşdırma metodundan istifadə etmək üçün gözəl lazımlı funksiyadır. Bununla belə, əsas çatışmazlıq scanf istifadə edərkən baş verə biləcək gözlənilməz səhvlərin sayıdır. Buna görə də, proqramlaşdırma zamanı scanf C təsviri ən yaxşı şəkildə gözünüzün qarşısında saxlanılır. Böyük peşəkar layihələrdə iostreams istifadə olunur, çünki daha yüksək səviyyəli imkanlara malikdirlər, səhvləri daha yaxşı tuta və idarə edə bilirlər, həmçinin əhəmiyyətli miqdarda məlumatlarla işləyirlər. Onu da qeyd etmək lazımdır ki, scanf C-nin rus dilində təsviri bir çox şəbəkə mənbələrində, eləcə də onun nümunələrində mövcuddur.funksiyanın yaşına görə istifadə edin. Buna görə də, lazım gələrsə, həmişə tematik forumlarda cavab tapa bilərsiniz.

Tövsiyə: