Funkcja snprintf () w C ++ służy do zapisywania sformatowanego ciągu w buforze ciągu znaków.
W przeciwieństwie do sprintf (), maksymalna liczba znaków, które można zapisać w buforze, jest określona w snprintf()
.
prototyp snprintf ()
int snprintf (char * bufor, size_t buf_size, const char * format,…);
snprintf()
Funkcja zapisuje łańcuch wskazywany przez format bufora. Maksymalna liczba znaków, które można zapisać, to (buf_size-1)
.
Po zapisaniu znaków dodawany jest kończący znak null. Jeśli buf_size jest równe zero, nic nie jest zapisywane, a bufor może być pustym wskaźnikiem.
Jest zdefiniowany w pliku nagłówkowym.
Parametry snprintf ()
- bufor: wskaźnik do bufora ciągu, aby zapisać wynik.
- buf_size: Określ maksymalną liczbę znaków do zapisania w buforze, który wynosi buf_size-1.
- format: wskaźnik do łańcucha zakończonego znakiem null, który jest zapisywany w strumieniu pliku. Składa się ze znaków wraz z opcjonalnymi specyfikatorami formatu zaczynającymi się od%.
Specyfikatory formatu są zastępowane wartościami odpowiednich zmiennych występujących po ciągu formatu.
Specyfikator formatu składa się z następujących części:
- Wiodący znak%
- Flagi: opcjonalnie jedna lub więcej flag, które modyfikują zachowanie konwersji.
- -: Wyrównaj wynik do lewej w polu. Domyślnie jest wyjustowany do prawej.
- +: Znak wyniku jest dołączany na początku wartości, nawet w przypadku wyników dodatnich.
- Spacja: jeśli nie ma znaku, na początku wyniku jest umieszczana spacja.
- #: Wykonywana jest alternatywna forma konwersji.
- 0: jest używany do liczb całkowitych i zmiennoprzecinkowych. Zera wiodące służą do wypełniania liczb zamiast spacji.
- Szerokość: opcjonalna * lub wartość całkowita używana do określenia pola o minimalnej szerokości.
- Precyzja: opcjonalne pole składające się z. po którym następuje * lub liczba całkowita lub nic, aby określić dokładność.
- Długość: opcjonalny modyfikator długości, który określa rozmiar argumentu.
- Specifier: specyfikator formatu konwersji. Dostępne specyfikatory formatu są następujące:
Specyfikator formatu Opis % Drukuje% do Zapisuje pojedynczy znak s Zapisuje ciąg znaków d lub i Konwertuje liczbę całkowitą ze znakiem na reprezentację dziesiętną o Konwertuje liczbę całkowitą bez znaku na reprezentację ósemkową X lub x Konwertuje liczbę całkowitą bez znaku na reprezentację szesnastkową u Konwertuje liczbę całkowitą bez znaku na reprezentację dziesiętną F lub f Konwertuje liczbę zmiennoprzecinkową na reprezentację dziesiętną E lub e Konwertuje liczbę zmiennoprzecinkową na dziesiętną notację wykładniczą A lub a Konwertuje liczbę zmiennoprzecinkową na wykładnik szesnastkowy G lub g Konwertuje liczbę zmiennoprzecinkową na dziesiętną lub dziesiętną notację wykładniczą n Zwraca liczbę znaków zapisanych do tej pory przez to wywołanie funkcji. Wynik jest zapisywany do wartości wskazywanej przez argument p Zapisuje sekwencję znaków zdefiniowaną w implementacji definiującą wskaźnik. Zatem ogólny format specyfikatora formatu to:
%(flags)(width)(.precision)(length)specifier
- …: Inne dodatkowe argumenty określające dane do wydrukowania. Występują w sekwencji zgodnie ze specyfikatorem formatu.
snprintf () Zwracana wartość
Jeśli się powiedzie, snprintf()
funkcja zwraca liczbę znaków, które zostałyby zapisane dla wystarczająco dużego buforu, z wyłączeniem kończącego znaku null. W przypadku niepowodzenia zwraca wartość ujemną.
Wynik jest uważany za zapisany w całości wtedy i tylko wtedy, gdy zwrócona wartość jest nieujemna i mniejsza od buf_size.
Przykład: Jak działa funkcja snprintf ()
#include #include using namespace std; int main() ( char buffer(100); int retVal, buf_size = 100; char name() = "Max"; int age = 23; retVal = snprintf(buffer, buf_size, "Hi, I am %s and I am %d years old", name, age); if (retVal> 0 && retVal < buf_size) ( cout << buffer << endl; cout << "Number of characters written = " << retVal << endl; ) else cout << "Error writing to buffer" << endl; return 0; )
Po uruchomieniu programu wynik będzie następujący:
Cześć, jestem Max i mam 23 lata. Liczba wpisanych znaków = 34