2011-09-21 17 views
11

कोई इस साधारण प्रोग्राम के उत्पादन में मुझे समझा कर सकते हैं:snprintf और sprintf स्पष्टीकरण

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char charArray[1024] = ""; 
    char charArrayAgain[1024] = ""; 
    int number; 

    number = 2; 

    sprintf(charArray, "%d", number); 

    printf("charArray : %s\n", charArray); 

    snprintf(charArrayAgain, 1, "%d", number); 
    printf("charArrayAgain : %s\n", charArrayAgain); 

    return 0; 
} 

और उत्पादन होता है:

./a.out 
charArray : 2 
charArrayAgain : // Why i don't have 2 here? 

धन्यवाद।

उत्तर

28

हो जाएगा क्योंकि snprintf के लिए तार का \ 0 टर्मिनेटर अंतरिक्ष की जरूरत है। तो यदि आप इसे बताते हैं कि बफर 1 बाइट लंबा है, तो '2' के लिए कोई जगह नहीं है।

एक बाइट होने की snprintf(charArrayAgain, 2, "%d", number);

+1

'2' के बजाय, आप 'sizeof (charArrayAgain)' के बजाय कैसे करते हैं। – indiv

+6

सहमत, आकार (charArrayAgain) बेहतर होगा - हालांकि अक्सर आपके पास एक सरणी के बजाय सूचक होता है, जिस स्थिति में आकार() काम नहीं करेगा। –

4
snprintf(charArrayAgain, 1, "%d", number); 
//      ^

आप अपनी अधिकतम बफ़र आकार को निर्दिष्ट कर रहे साथ प्रयास करें। हालांकि, एक स्ट्रिंग में एक भी अंकों स्टोर करने के लिए, आप दो बाइट (अंकों के लिए, और अशक्त टर्मिनेटर के लिए एक।) होना चाहिए

4

आप केवल करने के लिए snprintf बता दिया है सरणी में एक भी चरित्र प्रिंट , जो स्ट्रिंग-कनवर्ट नंबर (वह एक वर्ण है) और स्ट्रिंग टर्मिनेटर \ 0 को पकड़ने के लिए पर्याप्त नहीं है, जो कि दूसरा अक्षर है, इसलिए स्नप्रिंटफ स्ट्रिंग को उस बफर में संग्रहीत करने में सक्षम नहीं है जिसे आपने दिया है।

4

snprintf पर दूसरा तर्क सरणी (charArrayAgain) पर लिखे जाने वाले बाइट्स की अधिकतम संख्या है। इसमें '\0' को समाप्त करना शामिल है, इसलिए 1 के आकार के साथ यह एक खाली स्ट्रिंग लिखने वाला नहीं है।

संबंधित मुद्दे