2013-03-22 9 views
7

मैं सी के लिए एक असली शुरुआत कर रहा हूं, लेकिन मैं सीख रहा हूं!अक्षरों की एक सरणी के बाद अजीब चरित्र

मैंने पहले इस समस्या पर ठोकर खाई है और यह पूछने का फैसला किया है कि इसका क्या कारण है। और कृपया अपने उत्तरों की व्याख्या करें ताकि मैं सीख सकूं।

मैंने एक प्रोग्राम बनाया है जो आपको 5 अक्षरों को इनपुट करने की अनुमति देता है और फिर आपके द्वारा लिखे गए अक्षरों को दिखाता है और उन्हें वापस लाता है, उदाहरण: "asdfg" - "gfdsa"। अजीब चीज यह है कि एक अजीब चरित्र मूल वर्णों के बाद दिखाया गया है जो इनपुट किया गया था।

char str[5]; 
char outcome[] = "OOOOO"; 
int i; 
int u; 

printf("Enter five characters\n"); 

scanf("%s", str); 

for(i = 4, u = 0; i >=0; u++, i--){ 
    outcome[i] = str[u]; 
} 

printf("\nYou wrote: %s. The outcome is: %s.", str , outcome); 


return 0; 

अगर मैं दर्ज करें:: "asdfg" यह पता चलता है: "asdfg ♣", ऐसा क्यों है

यहाँ कोड है?

अपने समय के लिए धन्यवाद और अपने जवाब के बारे में समझाएं :)

+2

आपको वर्णों की सरणी को समाप्त करने की आवश्यकता है। देखें http://stackoverflow.com/questions/10943033/why-are-strings-in-c-usually-terminated-with-0 –

उत्तर

2

आपका स्ट्रिंग str[5]; बहुत छोटा है।

यह

str[6]; 

होना चाहिए और जब आप इसे प्रिंट कोड है कि सरणी के लिए बाध्य से बाहर चला जाता है।

आपको सरणी के अंत को चिह्नित करने के लिए str [] सरणी में एक शून्य टर्मिनल वर्ण भी सेट करना होगा।

str[5] = '\0' 
+0

'scanf()' आपके लिए टर्मिनेटर सेट करेगा जब ' % s' प्रारूप विनिर्देशक। उस ने कहा, '% s' के संयोजन में 'scanf()' को पहले स्थान पर टालना चाहिए, क्योंकि यह बफर ओवरफ़्लो के लिए स्पष्ट और वर्तमान खतरे है। इसके बजाए 'fgets()' का प्रयोग करें। – WhozCraig

15

क्योंकि कोई शून्य टर्मिनेटर नहीं है। सी में एक "स्ट्रिंग" निरंतर बाइट्स (वर्ण) का एक अनुक्रम है जो एक निष्क्रिय टर्मिनर ('\0') नामक एक सेंटीनेल चरित्र के साथ समाप्त होता है। आपका कोड उपयोगकर्ता से इनपुट लेता है और सभी 5 अक्षरों को भरता है, इसलिए आपकी स्ट्रिंग में कोई "अंत" नहीं है। फिर जब आप स्ट्रिंग प्रिंट करते हैं तो यह आपके 5 अक्षरों ("asdfg") को प्रिंट करेगा और यह तब तक प्रिंट करना जारी रखेगा जब तक कि यह नल टर्मिनेटर हिट न हो जाए।

char str[6] = {'\0'}; //5 + 1 for '\0', initialize it to an empty string 
... 
printf("Enter five characters\n"); 
scanf("%5s", str); // limit the input to 5 characters 

सीमा प्रारूप specificer के बारे में अच्छी बात यह है कि भले ही इनपुट 5 वर्णों से अधिक है, केवल 5 अपने स्ट्रिंग में संग्रहीत किया जाएगा, हमेशा कि अशक्त टर्मिनेटर के लिए कमरे छोड़ने है।

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