2024 ავტორი: Howard Calhoun | [email protected]. ბოლოს შეცვლილი: 2024-01-17 18:57
ამ სტატიაში 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 არის მასივი, ხოლო მისი სახელი არის მასივის პირველი ელემენტის მისამართი კომპიუტერის მეხსიერებაში..
მონაცემთა შეყვანის ფორმატი ან კონტროლის სტრიქონი
დაიწყეთ scanf C ფუნქციის მაგალითის აღწერიდან.
include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); დაბრუნება 0; //მოთხოვნა ლინუქსის სისტემებისთვის }
შეყვანის ფორმატი შედგება შემდეგი ოთხი პარამეტრისგან: %[width][modifiers] ტიპი. ამ შემთხვევაში "%" ნიშანი და ტიპი სავალდებულო პარამეტრებია. ანუ მინიმალური ფორმატი ასე გამოიყურება: „%s“, „%d“და ასე შემდეგ.
ზოგადად, სიმბოლოები, რომლებიც ქმნიან ფორმატის სტრიქონს, იყოფა:
- ფორმატის სპეციფიკატორები - ყველაფერი, რომელიც იწყება %;-ით
- გამყოფი ან ინტერვალის სიმბოლოები - ეს არის space, tab(t), newline (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 |
%% | მოწერა "%". |
სიმბოლოები ფორმატის სტრიქონში
ვარსკვლავის სიმბოლო ()
ვარსკვლავი () არის დროშა, რომელიც მიუთითებს, რომ მინიჭების ოპერაცია უნდა იყოს ჩახშობილი. ვარსკვლავი მოთავსებულია "%" ნიშნის შემდეგ. მაგალითად,
scanf("%d%c%d", &x, &y); //გმირის იგნორირება ორ მთელ რიცხვს შორის. scanf("%s%d%s", str, str2); //მთელი რიცხვის იგნორირება ორ სტრიქონს შორის.
ანუ, თუ კონსოლში შეიყვანთ ხაზს "45-20", პროგრამა გააკეთებს შემდეგს:
- ცვლადს "x" მიენიჭება მნიშვნელობა 45.
- ცვლადს "y" მიენიჭება მნიშვნელობა 20.
- და მინუს ნიშანი (ტირე) "-" იგნორირებული იქნება "%c"-ის წყალობით.
სიგანე (ან ველის სიგანე)
ეს არის მთელი რიცხვი "%" ნიშანსა და ფორმატის სპეციფიკატორს შორის, რომელიც განსაზღვრავს სიმბოლოების მაქსიმალურ რაოდენობას წასაკითხად მიმდინარე წაკითხვის ოპერაციაში.
scanf("%20s", str); //წაიკითხეთ პირველი 20 სიმბოლო შეყვანის ნაკადიდან
არის რამდენიმე მნიშვნელოვანი რამ, რაც უნდა გახსოვდეთ:
- scanf შეწყდება, თუ ის შეხვდება გამყოფ სიმბოლოს, მაშინაც კი, თუ ის არ ითვლიდა 20 სიმბოლოს.
- თუ შეყვანილია 20 სიმბოლოზე მეტი, მხოლოდ პირველი 20 სიმბოლო ჩაიწერება str.
მოდიფიკატორებიტიპი (ან სიზუსტე)
ეს არის სპეციალური დროშები, რომლებიც ცვლის შესაყვანად მოსალოდნელი მონაცემების ტიპს. დროშა მითითებულია ტიპის დამახასიათებლის მარცხნივ:
- L ან l (პატარა L) როდესაც "l" გამოიყენება d, i, o, u, x მითითებებთან ერთად, დროშა ეუბნება პროგრამას, რომ მოსალოდნელია ხანგრძლივი int შეყვანა. "l"-ის გამოყენებისას e ან f მითითებით, დროშა ეუბნება პროგრამას, რომ მას უნდა მოელოდოს ორმაგი მნიშვნელობა. "L"-ის გამოყენება ეუბნება პროგრამას, რომ მოსალოდნელია ხანგრძლივი ორმაგი. "l"-ის გამოყენება "c" და "s" დამახასიათებლებით ეუბნება პროგრამას, რომ მოსალოდნელია ორ ბაიტიანი სიმბოლოები, როგორიცაა 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 - მიუთითებს, რომ ცვლადი არის მაჩვენებელი intmax_t ან uintmax_t ტიპის stdint.h სათაურის ფაილიდან. გამოიყენება სპეციფიკაციებით: 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".
მაგალითები
მოდით გადავხედოთ რამდენიმე მაგალითს, რათა დაგეხმაროთ აზროვნებაში და უკეთ გაიგოთ, თუ როგორ მუშაობს ფუნქცია.
scanf("%3s", str); //თუ კონსოლში შეიყვანთ სტრიქონს "1d2s3d1;3", მხოლოდ "1d2" ჩაიწერება str scanf("%dminus%d", &x, &y); //მინუს სიმბოლოები ორ რიცხვს შორის იქნება გაუქმებული scanf("%5[0-9]", str); // სიმბოლოები შეიტანება str-ში მანამ, სანამ არ იქნება 5 სიმბოლო და სიმბოლოები იქნება რიცხვები 0-დან 9-მდე. scanf("%lf", &d); //მოველით ორმაგი შეყვანის სკანფს("%hd", &x); //type short scanf-ის მოსალოდნელი რაოდენობა("%hu", &y); //მოველით ხელმოუწერელ რიცხვს მოკლე scanf("lx", &z); //ტიპის მოსალოდნელი რაოდენობა long int
დანქვემოთ მოყვანილი მაგალითები აჩვენებს, თუ როგორ იცვლება მოსალოდნელი რიცხვი სხვადასხვა სიმბოლოების გამოყენებით.
scanf C - აღწერა დამწყებთათვის
ეს განყოფილება სასარგებლო იქნება დამწყებთათვის. ხშირად თქვენ უნდა გქონდეთ სკანფის 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", "-". სხვა სიტყვებით რომ ვთქვათ, სიმბოლო "-" ნიშნავს დიაპაზონს მხოლოდ იმ შემთხვევაში, თუ ის ორ სიმბოლოს შორისაა, რომლებიც სწორი თანმიმდევრობით არიან. თუ "-" არის გამოხატვის ბოლოს, დასაწყისში, ან სიმბოლოების არასწორი თანმიმდევრობით ორივე მხარეს, მაშინ ეს მხოლოდ დეფისის სიმბოლოა და არა დიაპაზონი.
დასკვნა
ეს ამთავრებს scanf C-ის აღწერას. ეს არის კარგი მოსახერხებელი ფუნქცია მცირე პროგრამებში მუშაობისთვის და პროცედურული პროგრამირების მეთოდის გამოყენებისას. თუმცა, მთავარი მინუსი არის არაპროგნოზირებადი შეცდომების რაოდენობა, რომელიც შეიძლება მოხდეს სკანფის გამოყენებისას. ამიტომ, პროგრამირებისას scanf C-ის აღწერა საუკეთესოდ ინახება თქვენს თვალწინ. მსხვილ პროფესიულ პროექტებში გამოიყენება iostreams, იმის გამო, რომ მათ აქვთ უფრო მაღალი დონის შესაძლებლობები, უკეთესად ახერხებენ შეცდომების დაჭერას და დამუშავებას, ასევე მნიშვნელოვანი რაოდენობით ინფორმაციის მუშაობას. ასევე უნდა აღინიშნოს, რომ scanf C-ის აღწერა რუსულ ენაზე ხელმისაწვდომია ბევრ ქსელურ წყაროზე, ისევე როგორც მისი მაგალითები.გამოყენება, ფუნქციის ასაკის გამო. ამიტომ, საჭიროების შემთხვევაში, ყოველთვის შეგიძლიათ იპოვოთ პასუხი თემატურ ფორუმებზე.
გირჩევთ:
გაყიდვების სართულის კონტროლერის სამუშაოს აღწერა: მოვალეობები, სამუშაოს აღწერა და მოთხოვნები
ასობით სხვადასხვა პროფესია არსებობს და გაყიდვების სართულის კონტროლერი ერთ-ერთი მათგანია. ამ პროფესიას ძნელად შეიძლება ეწოდოს პრესტიჟული. ამაზე არ ოცნებობენ, სკოლის სკამიდან დაწყებული. მაგრამ ეს არის ერთ-ერთი ძირითადი. მისი წარმომადგენლების შრომა არც ისე შესამჩნევი და აშკარაა, მაგრამ საზოგადოებისთვის მომგებიანია. მოდით გავიგოთ მეტი გაყიდვების სართულის კონტროლერის სამუშაო პასუხისმგებლობისა და ამ პროფესიის სხვა მახასიათებლების შესახებ
ფსიქოლოგის სამუშაოს აღწერა - მოვალეობები, სამუშაოს აღწერა და მოთხოვნები
ყველა ადამიანმა არ იცის ფსიქოლოგის მოვალეობები. ბევრს უჭირს წარმოდგენა, რას აკეთებს ეს სპეციალისტი. რა მოთხოვნები აქვს მას სხვადასხვა ორგანიზაციაში. რა უფლებები აქვს ფსიქოლოგს? ვინ არის შესაფერისი ამ პროფესიისთვის
პროდუქტის აღწერა: მაგალითი იმისა, თუ როგორ უნდა დაწეროთ დეტალური აღწერა, დაწეროთ ბიზნეს გეგმა
თუ ვერ იპოვნეთ ბიზნეს გეგმა აღწერით, პროდუქტის მახასიათებლებით, რომლის პოპულარიზაციასაც აპირებთ, მაშინ თქვენ თავად უნდა დაიწყოთ მისი შედგენა. რა სექციებს მოიცავს ბიზნეს გეგმა? როგორია მისი მომზადების ეტაპები? და ბოლოს, როგორ უნდა აღვძრათ ინვესტორების გულწრფელი ინტერესი? ყველა ეს და სხვა თანაბრად საინტერესო კითხვა განიხილება სტატიაში
ელექტრო და გაზის შემდუღებლის სამუშაოს აღწერა. ტიპიური სამუშაოს აღწერა
მომსახურების ინსტრუქცია - მარეგულირებელი დოკუმენტი, რომელიც აწესებს საწარმოს თანამშრომლების ვალდებულებებს, პრივილეგიებსა და პასუხისმგებლობებს მის თანამდებობაზე შესაბამისი საქმიანობის განხორციელებისას
რეზერვების კლასიფიკაცია სტრუქტურისა და ფუნქციის მიხედვით
რა არის მარტივი, წარმოების მარაგი? მათი ძირითადი ჯიშები. რეზერვების დაყოფა ჯგუფებად მათი დანიშნულების მიხედვით. კლასიფიკაცია ლოჯისტიკურ ჯაჭვში ადგილის მიხედვით, ლოჯისტიკურ ოპერაციებთან მიმართებაში, ფუნქციური მიზნების მიხედვით, ლოგისტიკურ სისტემასთან მიმართებაში, დროის მიხედვით