Zauważyłem, że parametr n
funkcji snprintf ()
wydaje się być ignorowany w moim kodzie.
char asdf [10 ]; Serial1.println (snprintf (asdf, 2, "hello"));
Wypisuje 5, gdy spodziewałbym się wydrukowania 2. Co się dzieje?
Zauważyłem, że parametr n
funkcji snprintf ()
wydaje się być ignorowany w moim kodzie.
char asdf [10 ]; Serial1.println (snprintf (asdf, 2, "hello"));
Wypisuje 5, gdy spodziewałbym się wydrukowania 2. Co się dzieje?
snprintf () nie zapisze więcej znaków niż <size> (2d argument snprintf) do twojego bufora, ale zlicza (i odrzuca dodatkowe) znaki, które by napisał, gdyby było wystarczająco dużo miejsca i to jest liczba, którą zwroty. Tak, to może być mylące!
Zobacz tę dokumentację dotyczącą snprintf ().
Szkic testowy dla Arduino Uno:
char buffer [10]; void setup () {Serial.begin (9600); int n = snprintf (bufor, 2, "witaj"); Serial.println (n); Serial.println (buffer);} void loop () {}
Jak napisał @JRobert, kluczem jest „would have”. O ile wiem, tylko snprintf i vsnprintf zwracają liczbę „would have”.
Myślę, że powodem jest to, że mogę powiedzieć jeśli ciąg został obcięty. Załóżmy, że parametr „size” ma wartość 25, a ciąg formatu jest bardzo długi, wówczas wartość zwracaną można porównać z 25. Jeśli wartość zwracana wynosiła 26 (liczba bajtów „miałaby”), to ciąg został obcięty. Tej informacji nie można było pobrać, gdy numer „by miał” nie był dostępny.
Na koniec, strona podręcznika dla fprintf
stwierdza:
Funkcja snprintf () powinna być równoważna sprintf (), z dodatkiem argumentu n określającego rozmiar bufora, do którego odwołuje się s. Jeśli n wynosi zero, nic nie zostanie zapisane, a s może być pustym wskaźnikiem. W przeciwnym razie bajty wyjściowe poza n-pierwszym powinny zostać odrzucone zamiast zapisywane w tablicy, a bajt zerowy jest zapisywany na końcu bajtów faktycznie zapisanych w tablicy.
i , bardziej istotne:
Po pomyślnym zakończeniu funkcja snprintf () zwróci liczbę bajtów, które zostałyby zapisane w s, gdyby n było wystarczająco duże, z wyłączeniem kończącego bajtu zerowego.