muzruno.com

Функция Scanf C: описание

В тази статия, scanf функцията () се счита в общи линии без позоваване на определен стандарт, така че тук включва данни от всички стандарти С99, С11, C ++ 11, C ++ 14. Може би в някои стандарти функцията работи с различия от материала, посочен в статията.

Функция Scanf C - описание

scanf () - функция намира в stdio.h заглавния файл (С) и cstdio (C ++), то се нарича също форматирани входните данни на програмата. scanf чете символи от стандартния входен поток (stdin) и ги преобразува в съответствие с формата и ги записва в посочените променливи. Формат - означава, че данните за допускане се дават на конкретен тип. По този начин функцията scanf C е описана:

scanf ("% format", variable1 [ променлива2, [hellip-]]),

където променливите се предават като адреси. Причината за този начин на предаване на променливи на функция е очевидна: в резултат на работата тя връща стойност, показваща грешки, така че единственият начин да промените стойностите на променливите е да ги изпратите на адреса. Също така благодарение на този метод функцията може да обработва данни от всякакъв вид.

Някои програмисти, поради аналогията с други езици, извикват функции като scanf () или printf (), процедури.

Scanf ви позволява да въведете всички основни типове езици: char, int, float, string и др. В случай на променлива от тип низ не е необходимо да се уточни знака на адрес - "" като променлива от тип низ е масив, а името му е адресът на първия елемент на масива в паметта на компютъра.

Използване на C в C ++

Формат за въвеждане на данни или контролна линия

Нека да започнем с пример за използване на функцията scanf C от описанието.

#include int main () {int x-while (scanf ("% d", x) == 1) printf ("% d n", x) -отново 0- // изискване linux-systems}

Форматът за въвеждане се състои от следните четири параметъра: тип

  • [ширина] [модификатори]. Знакът "%" и типът са задължителни параметри. Това означава, че минималният формат изглежда така: "% s", "% d" и т.н.

    По принцип символите, които съставят структурния низ са разделени на:

    • форматиращи спецификатори - всичко, което започва със знака%;
    • разделяне или празно пространство - те са пространство, раздел ( t), нов ред ( 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

    % а

    Програмата чака да се въведе номера с плаваща запетая (запетая). Променливата трябва да бъде от типа float.

    8

    % o



    Програмата чака октаново число. Променливата трябва да бъде от тип int.

    9

    % s

    Програмата чака линия. Низът е съвкупност от символи преди дефинирането на първия знак. Променливата трябва да бъде от тип низ.

    10

    % x,% X

    Програмата чака шестнадесетично число. Променливата трябва да бъде от тип int.

    11

    % p

    Променливата чака показалецът да влезе. Променливата трябва да има тип указател.

    12

    % n

    Задава цяло число на променливата, равна на броя на сканираните преди текущия момент от функцията scanf.

    13

    % u

    Програмата чете неписано цяло число. Типът на променливата трябва да е нечетен цяло число.

    14

    % b

    Програмата очаква да въведе двоично число. Променливата трябва да бъде от тип int.

    15

    % []

    Набор от сканирани знаци. Програмата чака въвеждането на знаци от ограничения басейн, определен между тях квадратни скоби. scanf ще работи толкова дълго, колкото са налице символи от определената зададена във входния поток.

    16

    %%

    Знакът "%".

    Знаци във формат низ

    C ++ код

    Знакът със звездичка (*)

    Звездичка (*) е знак, показващ, че операцията по задаване трябва да бъде потискана. Звездичката се поставя непосредствено след знака "%". Например,

    scanf ("% d% * c% d", х, y) - / / ignore the character между две числа. / / ignore the integer между два реда.

    Това означава, че ако въведете "45-20" в конзолата, програмата прави следното:

    1. Променливата "x" ще бъде зададена на 45.
    2. Променливата "y" ще бъде зададена на 20.
    3. А знакът минус ";" ще бъде пренебрегнат благодарение на "% * c".

    Ширина (или широчина на полето)

    Това е цяло число между знака "%" и спецификатора на формата, който определя максималния брой знаци, които да се четат за текущата операция за четене.

    scanf ("% 20s", str) - // прочете първите 20 знака от входния поток

    Трябва да се имат предвид няколко важни въпроса:

    1. scanf ще спре да работи, ако срещне разделител, дори и да не брои 20 знака.
    2. Ако въведете повече от 20 знака, само първите 20 от тях ще бъдат записани на променливата str.

    Модификатори от типа (или точността)

    Код за скрийнсейвър

    Това са специални знамена, които променят вида данни, които се очаква да бъдат въведени. Знакът е вляво от типа на спецификатора:

    • L или л (малък L) При използване на «л» с проектантите г, аз, о, ф, х, флаг казва програмата, която се очаква да влезе тип данни дълго Int. Ако използвате "l" със спецификатора e или f, флагът казва на програмата, че трябва да изчака двойна стойност. Използването на "L" показва на програмата, че се очаква дълга двойна стойност. Използването на "l" със спецификациите "c" и "s" показва на програмата, че се очакват двубайтови знаци от типа wchar_t. Например "% lc", "% ls", "% l [asd]".
    • h е знак, показващ типа на късата.
    • hh - показва, че променливата е показалец на стойност на типа с подписан знак или неподписан знак. Знакът може да се използва със спецификациите d, i, o, u, x, n.
    • ll (две малки L) - показва, че променливата е показалец на стойност на подписания тип дълго дълго int или неподписан 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 ".

    Примерно C ++ код

    примери

    Нека разгледаме няколко примера, които ни позволяват да разсъждаваме и да разбираме по-точно работата на функцията.

    scanf ("% 3s", str) - // ако въведете "1d2s3d1-3" в конзолата, само "1d2" scanf ("% dminus% d" х, у) - // характер «минус» между двете числа ще otbroshenyscanf ( "% 5 [0-9]", ул) - // въведете символи в ул ще се случат толкова дълго, колкото те няма да са 5, а символи са числата от 0 до 9.scanf ("% lf", d) - // се очаква да въведе данни от тип doublescanf ("% hd", x) - // очаквайте редица видове shortscanf ("% hu", y) - // очаквайте редица типове неподписани shortscanf ("lx", z) - // очакват броя на тип int int

    От дадените примери можете да видите как очакваното число се различава при използването на различни символи.

    scanf C - описание за начинаещи

    Този раздел ще бъде полезен за начинаещи. Често трябва да имате не толкова подробно описание на Scanf C, колкото и детайлите на функцията.

    • Функцията е донякъде остаряла. Има няколко различни реализации в библиотеките с различни версии. Например, функцията за разширено сканиране S C, описание на която може да се намери на уебсайта на Microsoft.
    • Броят на спецификаторите във формата трябва да съответства на броя аргументи, предавани на функцията.
    • Елементите на входния поток трябва да се разделят само чрез разделяне на символите: интервал, раздел, нов ред. Кома, точка и запетая, период и т.н. - тези знаци не са отделими за функцията scanf ().
    • Ако scanf срещне разделител, входът ще бъде спрян. Ако има повече от една променлива за четене, тогава scanf ще продължи да чете следващата променлива.
    • Най-малкото несъответствие във формата на входните данни води до непредвидими резултати от програмата. Е, ако програмата просто завърши с грешка. Но често програмата продължава да работи и го прави неправилно.
    • scanf ("% 20s hellip- ", Ако входният поток надвиши 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", но след това под формата на променливата scanf, трябва да прехвърлите масив от char елементи.
    • "% [A-z]" означава "всички малки букви на английската азбука" и "% [z-a]" означава само 3 символа: lsquo-zrsquo-, lsquo-arsquo-, lsquo-rsquo. С други думи, символът ";" означава обхват само ако е между два знака, които са в правилната последователност. Ако ";" е в края на израза, в началото или в грешен ред на символите от двете му страни, то е просто тире на тирета, а не диапазон.
    C ++ код

    заключение

    Това завършва описанието на scanf C. Това е приятна удобна функция за работа в малки програми и използване на процедурен метод за програмиране. Основният недостатък обаче е количеството непредсказуеми грешки, които могат да възникнат при използването на scanf. Следователно, описанието на scanf C в програмирането е най-добре да се запази пред очите. При големи професионални проекти се използват потоци от iostream, тъй като те разполагат с възможности на по-високо ниво, по-добре могат да улавят и обработват грешки, а също така да работят със значителни количества информация. Трябва също така да се отбележи, че описанието на scanf C на руски език е налице в много мрежови източници, както и примери за неговата употреба поради възрастта на функцията. Ето защо, ако е необходимо, винаги можете да намерите отговор на тематичните форуми.

    Споделяне в социалните мрежи:

    сроден