Snprintf-Nutzung und eine kleine Zusammenfassung nach der Verwendung

        snprintf () kann als aktualisierte Version von sprintf () betrachtet werden, verfügt jedoch über einen Parameter mehr als sprintf (), mit dem die Länge der zu schreibenden Zeichenfolge gesteuert werden kann, was sicherer ist. Solange Sie darauf achten, ist dies der Fall verursacht keinen Pufferüberlauf. Daher verwenden wir im Allgemeinen häufiger snprintf.

1. Einführung in die SNPRINTF-Funktion und -Parameter

#include <stdio.h>

int snprintf(char *str, size_t size, char * format [, argument, …]);

Funktion: Formatieren Sie den variablen Parameter „…“ entsprechend dem Formatformat in eine Zeichenfolge und kopieren Sie ihn dann nach str.

Parameter:

  • str: der Buff, der in der endgültigen formatierten Zeichenfolge gespeichert ist
  • Größe: Die Länge des Buff-Pufferbereichs, einschließlich des Zeichenfolgenendzeichens „\0“ (Hinweis: „\0“ wird automatisch hinzugefügt, unabhängig davon, ob die nachfolgende Selbstzeichenfolge „\0“ enthält) , das heißt, es kann sein Ausgabe an str Gültige Zeichengrößen sind: Größe - 1
  • Format: variabler Parameter, ähnlich dem „%d“-Format in printf

Rückgabewert: Wenn der Aufruf fehlschlägt, ist der Rückgabewert eine negative Zahl. Wenn der Aufruf erfolgreich ist, ist der Rückgabewert die Gesamtlänge der formatierten Zeichenfolge (ohne \0). Diese Zeichenfolge kann abgeschnitten werden (da die Länge von buf möglicherweise abgeschnitten ist). reicht nicht aus, um die ganze Saite abzulegen).

Nachdem Sie dies gelesen haben, wissen Sie möglicherweise nicht, wie man es verwendet. Das spielt keine Rolle, schauen Sie sich einfach das folgende Beispiel an, um es zu verstehen:

#include <stdio.h>

int main()
{
    int     a = 1;
    char    buf[32] = "Nike";
    char    buf1[32] = {0};
    
    snprintf(buf1, sizeof(buf1)-1, "hello, I am %s. [%d]", buf, a);
    printf("%s\n", buf1);

    return 0;
}

Operationsergebnis:

2. Einige Punkte, die Sie beachten sollten

1. Wenn die Länge der formatierten Zeichenfolge < size ist , kopieren Sie die gesamte Zeichenfolge nach str und fügen Sie ein Zeichenfolgenabschlusszeichen ('\0') hinzu.

2. Wenn die Länge der formatierten Zeichenfolge >= size ist, werden nur die (Größe-1) Zeichen in str kopiert und danach ein Zeichenfolgenabschlusszeichen ('\0') hinzugefügt, und der Rückgabewert ist Länge des zu schreibenden Strings. (Da snprintf am Ende automatisch ein „\0“ hinzufügt, müssen Sie einen Platz dafür freilassen.)

#include <stdio.h>

int main()
{
    int     a = 1;
    char    buf[10] = "Nike";
    char    buf1[10] = {0};
    
    snprintf(buf1, 5, "%s.", buf);
    printf("%s\n", buf1);

    return 0;
}

Ergebnis:

Wenn snprintf(buf1, 5, "%s.", buf); in snprintf(buf1, 6, "%s.", buf); geändert wird.

Ergebnis:

 

3.  snprintf fügt am Ende \0 hinzu , unabhängig davon, ob der Pufferspeicher ausreicht. Machen Sie sich also keine Sorgen über einen Pufferüberlauf.

4. Wenn Zeichenfolgen kontinuierlich in einen Puffer ausgegeben werden, muss nach der Rückkehr jeder Funktion die Summe aus dem Rückgabewert von snprintf und der Länge der zuvor ausgegebenen Zeichen mit der Länge des Puffers verglichen werden, um einen Pufferüberlauf zu vermeiden. Verwenden Sie daher beim Formatieren von Zeichenfolgen und deren Ausgabe in den Cache so oft wie möglich snprintf und weniger sprintf , da sonst viele seltsame Fehler auftreten können.

if (n < 0): snprintf-Fehler.
if ( n >0 && n < sizeof(buf) ) : snprintf ist erfolgreich und die vollständige Zeichenfolge wird formatiert.
if ( n >= sizeof(buf) ): snprintf ist erfolgreich, aber die zu formatierende Zeichenfolge wird abgeschnitten.

Ich denke du magst

Origin blog.csdn.net/qq_51368339/article/details/129891922
Empfohlen
Rangfolge