Bestimmen der sprintf-Puffergröße - was ist der Standard?

Bestimmen der sprintf-Puffergröße - was ist der Standard?


Beim Konvertieren eines int wie folgt:


char a[256];
sprintf(a, "%d", 132);

wie kann man am besten bestimmen, wie groß a ist sollte sein? Ich nehme an, es ist in Ordnung, es manuell einzustellen (wie ich es überall gesehen habe), aber wie groß sollte es sein? Was ist der größtmögliche int-Wert auf einem 32-Bit-System, und gibt es einen kniffligen Weg, diesen im laufenden Betrieb zu ermitteln?


Antworten:


Die maximal mögliche Anzahl von Bits in einem Int ist CHAR_BIT * sizeof(int) , und eine Dezimalziffer ist mindestens 3 Bit "wert", also eine lockere Obergrenze für den Platz, der für einen beliebigen int erforderlich ist ist (CHAR_BIT * sizeof(int) / 3) + 3 . Dieses +3 ist eins dafür, dass wir beim Dividieren abgerundet haben, eins für das Vorzeichen, eins für das Null-Terminator.


Wenn Sie mit "auf einem 32-Bit-System" meinen, dass Sie int kennen 32 Bit ist, dann benötigen Sie 12 Byte. 10 für die Ziffern, eine für das Vorzeichen, eine für das Null-Endzeichen.


In Ihrem speziellen Fall ist das zu konvertierende int 132 , benötigen Sie 4 Byte. Badum, tish.


Wenn Puffer mit fester Größe mit einer vernünftigen Grenze verwendet werden können, sind sie die einfachere Option. Ich behaupte nicht ganz so demütig, dass die obige Grenze angemessen ist (13 Bytes statt 12 für 32-Bit-int , und 23 Bytes statt 21 für 64 Bit int ). Aber für schwierige Fälle könnten Sie in C99 einfach snprintf aufrufen um die Größe zu erhalten, dann malloc so viel. Das ist für einen so einfachen Fall wie diesen übertrieben.