Описание на функцията Scanf C
Описание на функцията Scanf C

Видео: Описание на функцията Scanf C

Видео: Описание на функцията Scanf C
Видео: #9. Функция scanf() для форматированного ввода | Язык C для начинающих 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, няма нужда да посочвате адресния знак - "&", тъй като променливата от тип низ е масив, а името й е адресът на първия елемент от масива в паметта на компютъра.

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

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

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


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); връщане на 0; //изискване за linux системи }

Входният формат се състои от следните четири параметъра: тип %[ширина][модификатори]. В този случай знакът "%" и типът са задължителни параметри. Тоест минималният формат изглежда така: „%s“, „%d“и така нататък.

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

  • спецификатори на формат - всичко, започващо с %;
  • разделителни или интервални знаци - те са интервал, табулатор (t), нов ред (n);
  • символи, различни от интервал.

Функцията може да не е безопасна.

Използвайте scanf_s() вместо scanf().

(съобщение от Visual Studio)

Указатели за тип или формат, или знаци за преобразуване, или контролни знаци

двоичен код
двоичен код

Декларацията за сканиране 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 Програмата чака въвеждане на низ. Низът е набор от всякакви знаци до първия срещнат разделителен знак. Променливата трябва да е от тип низ.
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", str); //прочетете първите 20 знака от входния поток

Има няколко важни неща, които трябва да имате предвид:

  1. scanf ще се прекрати, ако срещне разделителен знак, дори ако не е преброил 20 знака.
  2. Ако са въведени повече от 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".

Пример за C++ код
Пример за C++ код

Примери

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


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

ОтПримерите по-долу показват как се променя очакваното число с помощта на различни символи.

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

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

  • Тази функция е малко остаряла. Има няколко различни реализации в библиотеки с различни версии. Например подобрената функция scanf S C, описание на която можете да намерите на уебсайта на Microsoft.
  • Броят на спецификаторите във формата трябва да съответства на броя на аргументите, предадени на функцията.
  • Елементите на входния поток трябва да бъдат разделени само с разделителни знаци: интервал, табулатор, нов ред. Запетая, точка и запетая, точка и т.н. - тези знаци не са разделители за функцията scanf().
  • Ако scanf срещне разделителен знак, въвеждането ще бъде спряно. Ако има повече от една променлива за четене, тогава scanf ще премине към четене на следващата променлива.
  • Най-малкото несъответствие във формата на входните данни води до непредвидими резултати на програмата. Е, ако програмата просто завърши с грешка. Но често програмата продължава да работи и греши.
  • scanf("%20s …", …); Ако входният поток надвишава 20 знака, тогава scanf ще прочете първите 20 знака и или ще прекрати, или ще премине към четене на следващата променлива, ако е посочена такава. В този случай следващото извикване на scanf ще продължи да чете входния поток от точката, където работата на предишното извикване на scanf е спряна. Ако при четене на първите 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 при програмиране е най-добре да се държи пред очите ви. В големите професионални проекти се използват iostreams, поради факта, че имат възможности от по-високо ниво, те са по-способни да улавят и обработват грешки, а също и да работят със значителни количества информация. Трябва също да се отбележи, че описанието на scanf C на руски език е достъпно в много мрежови източници, както и примери за негоупотреба, поради възрастта на функцията. Ето защо, ако е необходимо, винаги можете да намерите отговора в тематичните форуми.

Препоръчано:

Избор на редакторите

Отпускане в заем в Сбербанк заем, заем за кола: прегледи. Възможно ли е да се направи допълнително кредитиране в Сбербанк?

Застраховка на жилище с ипотека: цена, необходимо ли е, документи

TSZhZ за войник. Натрупано-ипотечна система за жилища за военнослужещи

Социална ипотека в Казан. Социална ипотека за млади семейства

Мога ли да взема ипотека без първоначална вноска в Сбербанк?

Връщане на лихва по ипотеката. Как да възстановите платената лихва по ипотеката

Какво е ипотека и как да я вземем? Документи, първоначална вноска, лихва, погасяване на ипотечен кредит

Ипотека за изграждане на частна къща. Как да получите ипотека: инструкции стъпка по стъпка

Задължителна ли е ипотечната застраховка живот или не?

Най-ниска лихва по ипотека: плюсове и минуси

Ипотечният съкредитополучател е Кредитополучател и съкредитополучател

Ипотека за поземлен имот: тънкостите на регистрацията и съвети за избор на банка

Трябва ли да взема ипотека сега? Струва ли си да теглите ипотека сега?

Ипотека, рецензии ("VTB 24"). Ипотека "VTB 24": условия, първоначална вноска

Какво е рефинансиране на заем