Thursday, 15 August 2013

c - How to calculate the length of output that sprintf will generate? -


लक्ष्य : डेटा को JSON पर सीरियल करना।

समस्या < / Strong>: मैं नहीं जानता कि पहले से कितने वर्ण पूर्णांक हैं।

मैंने सोचा कि ऐसा करने का एक अच्छा तरीका sprintf ()

  आकार_टी लंबाई = स्प्रिंटफ़ (no_buff, "{डेटा:% d}", 12312); चार * शौकीन = मॉलोक (लंबाई); Snprintf (बफ, लंबाई, "{डेटा:% d}", 12312); // बफर पर पारित किया गया है ... निश्चित रूप से मैं  char [256]  के बजाय  no_buff  

प्रश्न: लेकिन क्या सी में यूनिक्स / dev / null जैसे डिस्प्लेबल लिखने के लिए एक उपयोगिता है? इस तरह से गहराई:

<पूर्व> #define FORGET_ABOUT_THIS ... आकार_t लंबाई = स्प्रिंटफ़ (FORGET_ABOUT_THIS, "{डेटा:% d}", 12312);

पीएस मुझे पता है कि मैं लॉग के माध्यम से पूर्णांक की लंबाई भी प्राप्त कर सकता हूं, लेकिन यह तरीके अच्छे लगता है।

चूंकि सी सरल भाषा है, वहां "डिस्पोजेबल बफ़र्स" जैसी कोई चीज नहीं है - सभी स्मृति प्रबंधन प्रोग्रामर कंधे पर हैं (इनके लिए जीएनयू सी कंपाइलर एक्सटेंशन हैं लेकिन वे मानक नहीं हैं)।

नहीं पता कि पहले से कितने वर्ण पूर्णांक हैं।

आपकी समस्या का बहुत आसान समाधान है snprintf जानता है!

C99- संगत प्लेटफॉर्म पर पहली तर्क के रूप में शून्य के साथ snprintf कॉल:

  ssize_t bufsz = snprintf (शून्य, 0, " {डेटा:% d} ", 12312); Char * buf = malloc (bufsz + 1); Snprintf (buf, bufsz + 1, "{डेटा:% d}", 12312); ... निशुल्क (बफ़);  

पुराने दृश्य स्टूडियो संस्करणों में (जिसमें गैर- C99 संगत सीआरटी है) में _scprintf के बजाय snprintf (NULL, ...) का उपयोग करें कॉल करें।


No comments:

Post a Comment