2013-12-11 10 views
5

मुझे लूप के साथ समस्या है, मुझे नहीं पता कि क्यों लूप कभी खत्म नहीं होता है।सी में स्प्रिंटफ, लूप कभी समाप्त नहीं होता

int main(int argc, char *argv[]) 
{ 
    int j; 
    char s[2]; 
    for(j=1;j<=3;j++) 
    { 
     sprintf(s,"s%d",j); 
     printf("%s", s); 
    } 
    system("PAUSE");  
    return 0; 
} 

मुझे लगता है कि लूप को कंसोल में s1s2s3 दिखाना चाहिए।

+0

एक प्रश्न का शानदार उदाहरण। एसएससीसीई, अपेक्षित परिणाम, वास्तविक परिणाम। न कुछ ज्यादा, न कुछ कम। –

+2

[अपरिभाषित व्यवहार] (http://en.wikipedia.org/wiki/Undefined_behavior) –

उत्तर

8

char s[2];char s[3]; होना चाहिए, अन्यथा आपको बफर ओवरफ़्लो मिलेगा।


Abhineet बताता है कि परिवर्तन आवश्यक क्यों है। हालांकि, अपने उत्तर की पुष्टि करने के लिए, यहां मानक से प्रासंगिक अनुभाग है।

7.19.6.6

sprintf समारोह, fprintf के बराबर है, सिवाय इसके कि उत्पादन एक सरणी बल्कि एक धारा की तुलना में (विशिष्ट तर्क द्वारा एड फाई) में लिखा है। वर्णों के अंत में एक शून्य वर्ण लिखा गया है लिखित; इसे लौटाए गए मूल्य के हिस्से के रूप में नहीं माना जाता है। यदि कॉपी करने वाली ऑब्जेक्ट्स के बीच होती है, तो व्यवहार अवांछित होता है।

+0

धन्यवाद, अब ठीक काम कर रहा है :) – user3014282

+0

अगर उत्तर आपकी मदद करता है, तो उसे स्वीकार करना न भूलें। –

+1

आप 7 मिनट में एक उत्तर स्वीकार कर सकते हैं (15 था) ... – user3014282

4

documentation,

से बफर के आकार इतना बड़ा पूरे जिसके परिणामस्वरूप स्ट्रिंग को रोकने के लिए किया जाना चाहिए।

आप पहले से ही s करने के लिए दो वर्ण जोर दे रहे हैं, इसलिए, वहाँ \0 जोड़कर के लिए पर्याप्त स्थान नहीं है। इससे अपरिभाषित व्यवहार का कारण बन जाएगा। समाधान \0 जोड़ने के लिए एक अतिरिक्त चार मेमोरी प्रदान करना है।

char s[2];char s[3];

मैं जानता हूँ कि मैं बहुत देर से जवाब दिया है लेकिन अपने आप को ओपी, समझा से रोक नहीं सकता है "उन्होंने उपयोग करने के लिए है क्यों रों [3] के बजाय [2]?"

+0

कभी नहीं, मुझे इसे मानक में मिला। –

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