C ++ vsnprintf () - C ++ biblioteka standardowa

Funkcja vsnprintf () w języku C ++ służy do zapisywania sformatowanego ciągu w buforze ciągów.

W przeciwieństwie do vsprintf (), maksymalna liczba znaków, które można zapisać w buforze, jest określona w vsnprintf().

prototyp vsnprintf ()

 int vsnprintf (char * bufor, size_t buf_size, const char * format, va_list vlist);

vsnprintf()Funkcja zapisuje łańcuch wskazywany przez format do bufora ciąg znaków. Maksymalna liczba znaków, które można zapisać, to buf_size. 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.

Format ciągu może zawierać specyfikatory formatu zaczynające się od%, które są zastępowane wartościami zmiennych, które są przekazywane jako lista vlist.

Jest zdefiniowany w pliku nagłówkowym.

vsnprintf () Parametry

  • bufor: wskaźnik do ciągu znaków, aby zapisać wynik.
  • buf_size: Maksymalna liczba znaków do zapisania.
  • 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

  • vlist: lista argumentów zawierających dane do zapisania.

vsnprintf () Wartość zwracana

  • Jeśli się powiedzie, vsnprintf()funkcja zwraca liczbę zapisanych znaków.
  • W przypadku niepowodzenia zwraca wartość ujemną.
  • Gdy długość sformatowanego łańcucha jest większa niż rozmiar buf_size, należy go obciąć. W takich przypadkach vsnprintf()funkcja zwraca całkowitą liczbę znaków z wyłączeniem kończącego znaku pustego, który zostałby zapisany, gdyby nie narzucono limitu buf_size.

Przykład: Jak działa funkcja vsnprintf ()

 #include #include void write(char* buf, int buf_size, const char *fmt,… ) ( va_list args; va_start(args, fmt); vsnprintf(buf, buf_size, fmt, args); va_end(args); ) int main () ( char buffer(100); char fname(20) = "Bjarne"; char lname(20) = "Stroustrup"; char lang(5) = "C++"; write(buffer, 27, "%s was created by %s %s", lang, fname, lname); printf("%s", buffer); return 0; )

Po uruchomieniu programu wynik będzie następujący:

 C ++ został stworzony przez Bjarne 

Interesujące artykuły...