Wbudowane funkcje biblioteczne do wprowadzania danych przez użytkownika | sscanf, scanf_s, fscanf_s, sscanf_s
Język programowania C zapewnia różne wbudowane funkcje biblioteczne do wprowadzania danych przez użytkownika. W tym artykule dowiemy się o funkcjach bibliotecznych sscanf scanf_s fscanf_s sscanf_s w C.
1. Funkcja sscanf() w C
sscanf() służy do odczytywania sformatowanych danych wejściowych z ciągu. Obie funkcje scanf() i sscanf() są podobne, jedyna różnica między nimi polega na tym, że funkcja scanf() odczytuje dane wejściowe od użytkownika ze standardowego wejścia, takiego jak klawiatura, a funkcja sscanf() odczytuje dane wejściowe z ciągu znaków i przechowuje je w innym ciągu.
Składnia
int sscanf ( const char * str const char * format ...);
Parametry
- W przypadku powodzenia funkcja zwraca liczbę pomyślnie odczytanych wartości.
- W przypadku niepowodzenia wejściowego, zanim jakiekolwiek dane będą mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.
- W przypadku powodzenia funkcja zwraca liczbę odczytanych wartości.
- W przypadku błędu wejściowego, zanim jakiekolwiek dane mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.
- Jeżeli rozmiar bufora jest równy lub mniejszy od rozmiaru tablicy, wówczas wprowadzenie rozmiaru bufora większego lub równego spowoduje utratę danych, gdyż nadmiar danych zostanie obcięty i odczytane zostaną dane do rozmiaru bufora - 1.
- Jeśli rozmiar bufora jest większy niż rozmiar tablicy, to
- wprowadzenie rozmiaru mniejszego niż rozmiar bufora zadziała, ale spowoduje błąd
- wprowadzenie wartości większej niż rozmiar bufora doprowadzi do przepełnienia bufora i spowoduje ten sam błąd.
- W przypadku powodzenia funkcja zwraca liczbę pomyślnie odczytanych wartości.
- W przypadku błędu wejściowego, zanim jakiekolwiek dane mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.
- W przypadku powodzenia funkcja zwraca liczbę pomyślnie odczytanych wartości.
- W przypadku błędu wejściowego, zanim jakiekolwiek dane mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.
Wartość zwracana
Notatka : Powinno być co najmniej tyle argumentów, ile jest wartości przechowywanych przez specyfikatory formatu.
Przykład: program C ilustrujący funkcję sscanf
C // C program to illustrate sscanf statement #include int main () { // declaring array s char s [] = '3 red balls 2 blue balls' ; char str [ 10 ] str2 [ 10 ]; int i ; // %*s is used to skip a word sscanf ( s '%d %*s %*s %*s %s %s' & i str str2 ); printf ( '%d %s %s n ' i str str2 ); return 0 ; }
Wyjście
3 blue balls
2. Funkcja scanf_s() w C
Ta funkcja jest specyficzna dla kompilatorów Microsoft. Działa tak samo jak scanf, z tą różnicą, że nie powoduje przeciążenia bufora. Funkcja scanf_s() jest bezpieczniejsza niż funkcja scanf(), ponieważ udostępnia dodatkowy parametr określający rozmiar bufora, który pozwala uniknąć przepełnienia bufora.
Składnia
int scanf_s (const char *format [argument]...);
Parametry
Notatka : Tutaj możemy określić rozmiar bufora i faktycznie kontrolować limit danych wejściowych, aby cała aplikacja nie uległa awarii z powodu przepełnienia pamięci.
Wartość zwracana
Dlaczego warto używać scanf_s()?
scanf po prostu czyta dane wejściowe dostarczone z konsoli. C nie sprawdza, czy dane wprowadzone przez użytkownika zmieszczą się w wyznaczonej zmiennej. Jeśli masz tablicę o nazwie color[3] i użyjesz scanf dla ciągu Red, będzie działać dobrze, ale jeśli użytkownik wprowadzi więcej niż 3 znaki, scanf zacznie zapisywać w pamięci, która nie należy do tablicy kolorów.
C nie wyłapie tego ani nie ostrzeże, i może spowodować awarię programu lub nie, w zależności od tego, czy coś spróbuje uzyskać dostęp i zapisać w tym gnieździe pamięci, który nie należy do tablicy kolorów. Tutaj w grę wchodzi scanf_s. scanf_s sprawdza, czy dane wejściowe użytkownika zmieszczą się w danej przestrzeni pamięci.
Notatka : scanf_s() będzie działać tylko w Microsoft Visual Studio.
Przykład 1: Program C ilustrujący funkcję sscanf_s
C // C program to illustrate sscanf_s statement // scanf_s() will only work in Microsoft Visual Studio. #include #include int main () { char a [ 5 ]; // sizeof(a) is buffer size scanf_s ( '%s' a sizeof ( a )); printf ( ' n %s ' a ); return 0 ; }
Wejście 1
Red
Wyjście 1
Red
Wejście 2
Yellow
Wyjście 2
No Output
Przykład 2: Program w C ilustrujący relację pomiędzy rozmiarem bufora i rozmiarem tablicy.
C++ // C++ program // consumes the Enter key // (newline character) pressed after input #include int main () { // example char ch [ 100000 ]; printf ( 'Enter characters: ' ); scanf_s ( '%s' ch 99999 ); getchar (); return 0 ; }
C // C program // consumes the Enter key // (newline character) pressed after input #include int main () { char ch [ 100000 ]; printf ( 'Enter characters: ' ); scanf_s ( '%s' ch 99999 ); getchar (); return 0 ; }
3. Funkcja fscanf_s() w C
Różnica pomiędzy fscanf() i fscanf_s() jest taka sama jak w przypadku scanf() i scanf_s(). fscanf_s() to bezpieczna funkcja, która wymaga przekazania rozmiaru każdego pola typu c C s S i [ ] jako argumentu bezpośrednio po zmiennej.
Składnia
int fscanf_s( FILE *stream const char *format [argument ]... );
Parametry
Notatka : fscanf_s ma dodatkowy parametr określający rozmiar bufora i faktycznie kontrolujący limit danych wejściowych.
Wartość zwracana
Notatka : fscanf_s będzie działać tylko w studiu MS Visual.
Przykład: program C ilustrujący funkcję fscanf_s
C // C program to illustrate fscanf_s statement // This program will run on MS Visual studio #include #include int main () { char s1 [ 10 ] s2 [ 10 ] s3 [ 10 ]; int year ; // file pointer FILE * fp ; // Open file securely fopen_s ( & fp 'file.txt' 'w+' ); fputs ( 'Hello World its 2017' fp ); rewind ( fp ); // Using fscanf_s fscanf_s ( fp '%s' s1 sizeof ( s1 )); fscanf_s ( fp '%s' s2 sizeof ( s2 )); fscanf_s ( fp '%s' s3 sizeof ( s3 )); fscanf_s ( fp '%d' & year sizeof ( year )); printf ( 'String1 |%s| n ' s1 ); printf ( 'String2 |%s| n ' s2 ); printf ( 'String3 |%s| n ' s3 ); printf ( 'Integer |%d| n ' year ); fclose ( fp ); return ( 0 ); }
Wyjście
String1 |Hello| String2 |World| String3 |its| Integer |2017|
4. Funkcja sscanf_s() w C
sscanf_s() to bezpieczna funkcja sscanf(), a bezpieczne funkcje wymagają przekazania rozmiaru każdego pola c C s S i [ type jako argumentu bezpośrednio po zmiennej.
Składnia
int sscanf_s (const char * restrict buffer const char * restrict format ...);
Parametry
Notatka : sscanf_s ma dodatkowy parametr określający rozmiar bufora i faktycznie kontrolujący limit danych wejściowych.
Wartość zwracana
Notatka : sscanf_s() będzie działać tylko w Microsoft Visual Studio.
Przykład: program C ilustrujący funkcję sscanf_s
C // C program to illustrate sscanf_s statement // This program will run on MS Visual studio #include int main () { char s [] = '3 red balls 2 blue balls' ; char str [ 10 ] str2 [ 10 ]; int i ; // %*s is used to skip a word sscanf_s ( s '%d' & i sizeof ( i )); sscanf_s ( s '%*d %*s %*s %*s %s' str sizeof ( str )); sscanf_s ( s '%*d %*s %*s %*s %*s %s' str2 sizeof ( str2 )); printf ( '%d %s %s n ' i str str2 ); return 0 ; }
Wyjście
3 blue balls
Utwórz quiz