Opis funkcji skanowania C
Opis funkcji skanowania C

Wideo: Opis funkcji skanowania C

Wideo: Opis funkcji skanowania C
Wideo: Marketing STP, czyli strategia segmentacji, targetowania i pozycjonowania 🤓 2024, Może
Anonim

W tym artykule funkcja scanf() jest rozpatrywana w formie ogólnej, bez odniesienia do konkretnego standardu, dlatego są tu zawarte dane z dowolnych standardów C99, C11, C++11, C++14. Być może w niektórych standardach funkcja działa z różnicami w materiale przedstawionym w artykule.

skanuj funkcję C - opis

scanf() to funkcja zlokalizowana w plikach nagłówkowych stdio.h(C) i cstdio(C++), znana również jako sformatowane wejście programu. scanf odczytuje znaki ze standardowego strumienia wejściowego (stdin) i konwertuje je zgodnie z formatem, a następnie zapisuje je do określonych zmiennych. Format - oznacza, że po otrzymaniu dane są konwertowane do określonej postaci. Tak więc funkcja scanf C jest opisana:

scanf("%format", &zmienna1[, &zmienna2, […]), gdzie zmienne są przekazywane jako adresy. Powód takiego sposobu przekazywania zmiennych do funkcji jest oczywisty: w wyniku pracy zwraca wartość wskazującą na obecność błędów, czylijedynym sposobem zmiany wartości zmiennych jest przekazanie przez adres. Również dzięki tej metodzie funkcja może przetwarzać dane dowolnego typu.

Niektórzy programiści odnoszą się do funkcji takich jak scanf() lub printf() jako procedur z powodu analogii z innymi językami.

Scanf umożliwia wprowadzanie wszystkich podstawowych typów języków: char, int, float, string itp. W przypadku zmiennych typu string nie ma potrzeby podawania znaku adresu - „&”, ponieważ zmienna typu string jest tablicą, a jej nazwą jest adres pierwszego elementu tablicy w pamięci komputera.

Używanie C w C++
Używanie C w C++

Format wprowadzania danych lub ciąg kontrolny

Zacznij od obejrzenia przykładu funkcji scanf C z opisu.


dołącz int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); zwróć 0; //wymaganie dla systemów linux }

Format wejściowy składa się z następujących czterech parametrów: %[szerokość][modyfikatory]. W tym przypadku znak „%” i typ są parametrami obowiązkowymi. Oznacza to, że minimalny format wygląda tak: „%s”, „%d” i tak dalej.

Zazwyczaj znaki tworzące ciąg formatujący są podzielone na:

  • specyfikatory formatu - wszystko zaczynające się od %;
  • znaki rozdzielające lub spacje - są to spacja, tabulacja(t), znak nowej linii (n);
  • znaki inne niż spacje.

Funkcja może nie być bezpieczna.

Użyj scanf_s() zamiast scanf().

(wiadomość z programu Visual Studio)

Specyfikatory typu lub formatu, znaki konwersji lub znaki kontrolne

kod binarny
kod binarny

Deklaracja scanf C musi zawierać przynajmniej specyfikator formatu, który jest określony na końcu wyrażeń zaczynających się od „%”. Informuje program o typie danych, których należy oczekiwać podczas wprowadzania, zwykle z klawiatury. Lista wszystkich specyfikatorów formatu w poniższej tabeli.

Typ Znaczenie
1 %c Program czeka na wprowadzenie znaku. Zapisywana zmienna musi być typu znakowego char.
2 %d Program oczekuje wprowadzenia liczby dziesiętnej typu integer. Zmienna musi być typu int.
3 %i

Program oczekuje wprowadzenia liczby dziesiętnej typu integer. Zmienna musi być typu int.

4 %e, %E Program oczekuje wprowadzenia liczby zmiennoprzecinkowej (przecinka) w formie wykładniczej. Zmienna musi być typu float.
5 %f Program oczekuje liczby zmiennoprzecinkowej (przecinka). Zmienna musi być typu float.
6 %g, %G Program oczekuje liczby zmiennoprzecinkowej (przecinka). Zmienna musi być typu float.
7 %a Program oczekuje liczby zmiennoprzecinkowej (przecinka). Zmienna musi być typu float.
8 %o Program oczekuje liczby ósemkowej. Zmienna musi być typu int.
9 %s Program czeka na wprowadzenie ciągu. Ciąg znaków to zestaw dowolnych znaków do pierwszego napotkanego znaku separatora. Zmienna musi być typu string.
10 %x, %X Program czeka na liczbę szesnastkową. Zmienna musi być typu int.
11 %p Zmienna oczekuje na wprowadzenie wskaźnika. Zmienna musi być typu wskaźnikowego.
12 %n Zapisuje do zmiennej liczbę całkowitą równą liczbie znaków odczytanych do tej pory przez funkcję scanf.
13 %u Program odczytuje liczbę całkowitą bez znaku. Typ zmiennej musi być liczbą całkowitą bez znaku.
14 %b Program czeka na liczbę binarną. Zmienna musi być typu int.
15 %

Zestaw zeskanowanych znaków. Program czeka na wpisanie znaków.z ograniczonej puli określonej w nawiasach kwadratowych. scanf będzie działać tak długo, jak w strumieniu wejściowym znajdują się znaki z określonego zestawu.

16 %% Podpisz "%".

Znaki w ciągu formatu

Kod C++
Kod C++

Symbol gwiazdy ()

Gwiazdka () to flaga wskazująca, że operacja przypisania powinna zostać pominięta. Gwiazdka jest umieszczana bezpośrednio po znaku „%”. Na przykład


scanf("%d%c%d", &x, &y); //ignoruj znak między dwiema liczbami całkowitymi. scanf("%s%d%s", str, str2); //ignoruj liczbę całkowitą między dwoma ciągami.

Oznacza to, że jeśli wpiszesz w konsoli linię „45-20”, program wykona następujące czynności:

  1. Zmiennej „x” zostanie przypisana wartość 45.
  2. Zmiennej „y” zostanie przypisana wartość 20.
  3. A znak minus (myślnik) „-” zostanie zignorowany dzięki „%c”.

Szerokość (lub szerokość pola)

Jest to liczba całkowita między znakiem „%” a specyfikatorem formatu, który określa maksymalną liczbę znaków do odczytania w bieżącej operacji odczytu.


scanf("%20s", str); //odczytaj pierwsze 20 znaków ze strumienia wejściowego

Należy pamiętać o kilku ważnych rzeczach:

  1. scanf zakończy się, jeśli napotka znak separatora, nawet jeśli nie liczył 20 znaków.
  2. Jeśli wprowadzono więcej niż 20 znaków, tylko pierwsze 20 znaków zostanie zapisanych do str.

Modyfikatorytyp (lub precyzja)

kod powitalny
kod powitalny

Są to specjalne flagi, które modyfikują typ danych oczekiwanych do wprowadzenia. Flaga jest określona po lewej stronie specyfikatora typu:

  • L lub l (małe L) Kiedy "l" jest używane ze specyfikatorami d, i, o, u, x, flaga mówi programowi, że oczekuje się długiego wejścia int. Używając "l" ze specyfikatorem e lub f, flaga mówi programowi, że powinien oczekiwać podwójnej wartości. Użycie "L" mówi programowi, że oczekiwany jest długi dublet. Użycie "l" ze specyfikatorami "c" i "s" mówi programowi, że oczekuje się znaków dwubajtowych, takich jak wchar_t. Na przykład "% lc", "% ls", "% l[asd]".
  • h to flaga wskazująca krótki typ.
  • hh - wskazuje, że zmienna jest wskaźnikiem do wartości znaku ze znakiem lub znaku bez znaku. Flaga może być używana ze specyfikatorami d, i, o, u, x, n.
  • ll (dwa małe L) - wskazuje, że zmienna jest wskaźnikiem do wartości typu signed long long int lub unsigned long long int. Flaga jest używana ze specyfikatorami: d, i, o, u, x, n.
  • j - wskazuje, że zmienna jest wskaźnikiem do typu intmax_t lub uintmax_t z pliku nagłówkowego stdint.h. Używany ze specyfikatorami: d, i, o, u, x, n.
  • z - wskazuje, że zmienna jest wskaźnikiem do typu size_t, którego definicja znajduje się w stddef.h. Używany ze specyfikatorami: d, i, o, u, x, n.
  • t - wskazuje, że zmienna jest wskaźnikiem do typu ptrdiff_t. Definicja włączonaten typ znajduje się w stddef.h. Używany ze specyfikatorami: d, i, o, u, x, n.

Bardziej wyraźnie obraz z modyfikatorami można przedstawić w formie tabeli. Taki opis scanf C dla programistów będzie jaśniejszy.

Specyfikatory i modyfikatory typu
Specyfikatory i modyfikatory typu

Inne postacie

Wszelkie znaki napotkane w formacie zostaną odrzucone. Jednocześnie należy zauważyć, że obecność spacji lub znaków separatora (nowej linii, spacji, tabulatora) w ciągu sterującym może prowadzić do odmiennego zachowania funkcji. W jednej wersji scanf() będzie czytać bez zapisywania żadnej liczby separatorów, dopóki nie napotka znaku innego niż separator, aw innej wersji spacje (tylko one) nie odgrywają roli, a wyrażenie „%d + %d” jest równoważne "% d+%d".

Przykład kodu C++
Przykład kodu C++

Przykłady

Spójrzmy na kilka przykładów, które pomogą Ci myśleć i lepiej zrozumieć, jak działa ta funkcja.


scanf("%3s", str); //jeśli wpiszesz ciąg "1d2s3d1;3" w konsoli, tylko "1d2" zostanie zapisane w str scanf("%dminus%d", &x, &y); //minus znaki między dwiema liczbami zostaną odrzucone scanf("%5[0-9]", str); // znaki będą wprowadzane do str, dopóki nie będzie 5 znaków, a znaki będą cyframi od 0 do 9. scanf("%lf", &d); //oczekiwanie podwójnego wejścia scanf("%hd", &x); //oczekiwana liczba typu short scanf("%hu", &y); //oczekiwanie liczby bez znaku short scanf("lx", &z); //oczekiwana liczba typu long int

OdPoniższe przykłady pokazują, jak zmienia się oczekiwana liczba za pomocą różnych symboli.

skanuj C - opis dla początkujących

Ta sekcja będzie przydatna dla początkujących. Często trzeba mieć pod ręką nie tyle pełny opis scanf C, ile szczegóły działania funkcji.

  • Ta funkcja jest nieco przestarzała. Istnieje kilka różnych implementacji w bibliotekach różnych wersji. Na przykład ulepszona funkcja scanf S C, której opis można znaleźć na stronie microsoft.
  • Liczba specyfikatorów w formacie musi odpowiadać liczbie argumentów przekazanych do funkcji.
  • Elementy strumienia wejściowego muszą być oddzielone tylko znakami separatora: spacją, tabulatorem, nowym wierszem. Przecinek, średnik, kropka itp. - te znaki nie są separatorami dla funkcji scanf().
  • Jeśli scanf napotka znak separatora, wejście zostanie zatrzymane. Jeśli jest więcej niż jedna zmienna do odczytania, scanf przejdzie do czytania następnej zmiennej.
  • Najmniejsza niespójność w formacie danych wejściowych prowadzi do nieprzewidywalnych wyników programu. Cóż, jeśli program po prostu kończy się błędem. Ale często program nadal działa i robi to źle.
  • scanf("%20s…",…); Jeżeli strumień wejściowy przekracza 20 znaków, to scanf odczyta pierwsze 20 znaków i albo przerwie, albo przejdzie do czytania następnej zmiennej, jeśli jest ona określona. W takim przypadku następne wywołanie scanf będzie kontynuowało odczytywanie strumienia wejściowego od punktu, w którym zakończyło się działanie poprzedniego wywołania scanf. Jeśli czytając pierwsze 20znaków, napotkano znak ogranicznika, scanf przerwie lub będzie kontynuował odczytywanie następnej zmiennej, nawet jeśli nie odczytał 20 znaków dla pierwszej zmiennej. W takim przypadku wszystkie nieprzeczytane znaki zostaną dołączone do następnej zmiennej.
  • Jeżeli zestaw zeskanowanych znaków zaczyna się od "^", to scanf będzie czytać dane, dopóki nie napotka znaku ogranicznika lub znaku z zestawu. Na przykład „%[^A-E1-5]” będzie odczytywać dane ze strumienia, dopóki nie zostanie napotkany jeden z wielkich znaków angielskich od A do E lub jedna z cyfr od 1 do 5.
  • Funkcja scanf C, zgodnie z opisem, zwraca liczbę równą pomyślnej liczbie zapisów do zmiennych. Jeśli scanf zapisze 3 zmienne, to wynik powodzenia funkcji zwróci liczbę 3. Jeśli scanf nie mógł zapisać żadnych zmiennych, wynik będzie równy 0. I na koniec, jeśli z jakiegoś powodu scanf nie mógł się w ogóle uruchomić, wynikiem będzie EOF.
  • Jeśli funkcja scanf() zakończyła się niepoprawnie. Na przykład scanf("%d", &x) - oczekiwano liczby, ale znaki zostały odebrane jako dane wejściowe. Następne wywołanie scanf() rozpocznie się w punkcie w strumieniu wejściowym, w którym zakończyło się poprzednie wywołanie funkcji. Aby rozwiązać ten problem, konieczne jest pozbycie się problematycznych postaci. Można to zrobić, na przykład, wywołując scanf("%s"). Oznacza to, że funkcja odczyta ciąg znaków i wyrzuci go. W ten trudny sposób możesz kontynuować wprowadzanie niezbędnych danych.
  • W niektórych implementacjach scanf(), "-" nie jest dozwolone w skanowanym zestawie znaków.
  • Specyfikator "%c" odczytuje każdy znak ze strumienia. Oznacza to, że odczytuje również znak separatora. Aby pominąć znak ogranicznika i kontynuować czytanie żądanego znaku, możesz użyć „%1s”.
  • Podczas używania specyfikatora "c" dozwolone jest użycie szerokości "%10c", ale wtedy tablica elementów typu char musi być przekazana jako zmienna do funkcji scanf.
  • „%[a-z]” oznacza „wszystkie małe litery alfabetu angielskiego”, a „%[z-a]” oznacza tylko 3 znaki: „z”, „a”, „-”. Innymi słowy, znak „-” oznacza zakres tylko wtedy, gdy znajduje się między dwoma znakami we właściwej kolejności. Jeśli „-” znajduje się na końcu wyrażenia, na początku lub w niewłaściwej kolejności znaków po obu stronach wyrażenia, to jest to tylko znak łącznika, a nie zakres.
Kod C++
Kod C++

Wniosek

To kończy opis scanf C. Jest to przydatna funkcja do pracy w małych programach i podczas korzystania z metody programowania proceduralnego. Jednak główną wadą jest liczba nieprzewidywalnych błędów, które mogą wystąpić podczas korzystania z scanf. Dlatego opis scanf C podczas programowania najlepiej mieć przed oczami. W dużych profesjonalnych projektach wykorzystywane są iostreamy, ze względu na to, że mają możliwości wyższego poziomu, są w stanie lepiej wyłapywać i obsługiwać błędy, a także pracować ze znaczną ilością informacji. Należy również zauważyć, że opis scanf C w języku rosyjskim jest dostępny w wielu źródłach sieciowych, a także jego przykładyużytkowania, ze względu na wiek funkcji. Dlatego w razie potrzeby zawsze możesz znaleźć odpowiedź na forach tematycznych.

Zalecana: