SORU
29 HAZİRAN 2009, PAZARTESİ


Nasıl/sprintf printf için bağımsız değişken sayısı geçirmek için

"Hata" bazı metin biçimi olacak fonksiyonu. bir tutan bir Dersim var Bağımsız değişken bir dizi kabul ve basit bir beşgen kullanmaktır onları kullanma biçimi.

Örnek:

class MyClass
{
public:
    void Error(const char* format, ...);
};

Hata yöntemi ve parametreleri, basit bir beşgen kullanmaktır/biçimi için sprintf ile bir şeyler yapmaya ara o zaman. Mantıklı denemek ve varolan biçimlendirme kullanmak için nasıl anlamaya yapar ki kendimi biçimlendirmeyi yazmak istemiyorum.

CEVAP
29 HAZİRAN 2009, PAZARTESİ


Kötü

void Error(const char* format, ...)
{
    char dest[1024 * 16];
    va_list argptr;
    va_start(argptr, format);
    vsprintf(dest, format, argptr);
    va_end(argptr);
    printf(dest);
}

Bu kod çok iyi değil. Eğer dize patolojik olarak uzun bir arabellek taşması hata yol açan sabit boyutlu bir karakter arabelleği kullanır. 1024*16 keyfi büyük boyutunu kafana olarak işaretlenmişti. Ayrıca, printf Ara dest içeren biçimlendirme kodları biterse herhangi bir problem olabilir. Daha iyi printf("%s", dest) olurdu. Ama daha hala kullanıyordur vprintf vfprintf:

İyi

void Error(const char* format, ...)
{
    va_list argptr;
    va_start(argptr, format);
    vfprintf(stderr, format, argptr);
    va_end(argptr);
}

Bunu görüntülemek için önce dize değiştirmek istediğiniz ve gerçekten de bir tampon içinde saklı ilk ihtiyacınız olursa, lütfen kullanın lütfenvsnprintfyerine vsprintf. vsnprintf kaza sonucu taşması bir hata engeller.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010