2015-12-14 6 views
21

में विलय कर रहे हैं किसी कारण से, मेरा दूसरा वर्ण सरणी (var2) पहले (var1) के साथ विलीन हो जाती है। यहाँ मेरी कोड है:मेरे चरित्र सरणी सी

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main()  
{ 
    char var1[5] = "Hello"; 
    char var2[5] = "World"; 

    printf("This program can write:\t%s\t%s\n", var1, var2); 
    getch(); 
    return 0; 
} 
यह संकलन के बाद

, मैं निम्नलिखित प्रिंट मिला:

इस कार्यक्रम लिख सकते हैं: हैलो WorldHello

जब मैं printf("This program can write:\t%s\n", var2); मैं करने के लिए कोड बदल निम्नलिखित प्रिंट प्राप्त हुआ:

यह प्रोग्राम लिख सकता है: वर्ल्डहेल्लो

तो यह स्पष्ट है कि var1 var2 के साथ विलय कर रहा है।

क्या यह किसी प्रकार का कंपाइलर बग है। यदि हां, तो मैं इसे कैसे ठीक कर सकता हूं? मैंने MINGW को पुनर्स्थापित करने का प्रयास किया, लेकिन मुझे अभी भी वही परिणाम मिल रहे हैं।

धन्यवाद एक बहुत

+9

के बीच का अंतर देखें। कंपाइलर को इसे 'char var1 [] = "हैलो" के साथ 6 तक आकार दें;' जिसमें पिछला शून्य चरित्र शामिल है। – chux

+12

अधिकांश कंप्यूटर्स को इसके बारे में चेतावनी देना चाहिए था, बीटीडब्ल्यू। – Dummy00001

+1

आपके सरणी को अंत में जोड़ने के लिए अंत में एक और वर्ण की आवश्यकता होती है। printf नल चरित्र का उपयोग कर स्ट्रिंग के अंत की तलाश करेगा, जिसमें स्ट्रिंग "हैलो" नहीं है। 'Var1' को आकार 6 के रूप में बदलने का प्रयास करें और "हैलो" को "हैलो \ 0" में बदलें। फिर वही करें 'var2' – Gophyr

उत्तर

36

स्ट्रिंग्स वास्तव में वर्णों की एक-आयामी सरणी एक शून्य वर्ण '\ 0' द्वारा समाप्त की गई हैं। इस प्रकार एक नल-टर्मिनेटेड स्ट्रिंग में वर्ण होते हैं जिसमें स्ट्रिंग शामिल होती है जिसके बाद शून्य होती है।

निम्नलिखित घोषणा और प्रारंभिक शब्द "हैलो" शब्द वाली एक स्ट्रिंग बनाते हैं। सरणी के अंत में शून्य वर्ण को पकड़ने के लिए, स्ट्रिंग वाले वर्ण सरणी का आकार "हैलो" शब्द में वर्णों की संख्या से अधिक है।

char var1[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; 

आप और अधिक बस कर सकते हैं:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main()  
{ 

char var1[] = "Hello"; 
char var2[] = "World"; 

printf("This program can write:\t%s\t%s\n", var1, var2); 
getchar(); 
return 0; 

} 

सी संकलक स्वचालित रूप से स्थानों स्ट्रिंग के अंत में '\0' जब यह (सरणी initializes यदि सरणी काफी लंबे समय को रोकने के लिए है '\0', अन्यथा '\0' किसी अन्य चर को ओवरराइट करने के बजाय छोड़ दिया जाएगा)।

+1

क्या आप इसे अंतिम वाक्य के अंत में जोड़ सकते हैं "... यदि सरणी '\ 0' रखने के लिए काफी लंबा है, अन्यथा '\ 0' को अन्य चर को ओवरराइट करने के बजाय छोड़ दिया जाएगा"। धन्यवाद :) – ztk

+2

ओह हाँ, मैं पूरी तरह से '\ 0' के बारे में भूल गया। पिछले कुछ वर्षों से मैंने सी प्रोग्राम किया है। बहुत बहुत धन्यवाद। – OMAX

+4

केवल उत्तर [']' युक्त उत्तर है, जिसे मैं सराहना करता हूं (लेकिन मुझे यह कहने की अनुमति नहीं है कि मैंने प्रशंसा कैसे दिखायी है)। –

8

आप डी \0 कि स्ट्रिंग के अंत में बताता है, तो आपके सरणियों आकार के अलावा एक अद्यतन करने के शामिल करने के लिए चाल करना होगा भूल जाते हैं:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main()  
{ 
    char var1[6] = "Hello"; 
    char var2[6] = "World"; 

    printf("This program can write:\t%s\t%s\n", var1, var2); 
    getchar(); 
    return 0; 
} 

यह प्रिंट:

यह प्रोग्राम लिख सकता है: हैलो वर्ल्ड

+0

धन्यवाद, यह वास्तव में मेरी मदद की। – OMAX

+3

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

+0

@Voo आपको क्या लगता है I-D है? यदि आप प्रारंभकर्ता द्वारा आवश्यक सरणी आकार को बड़ा घोषित करते हैं तो सभी शेष तत्व शून्य पर प्रारंभ किए जाते हैं। भले ही वे अनियंत्रित थे, लेखन अभी भी परिभाषित किया जाएगा, और पढ़ना * अपरिभाषित व्यवहार * आईडी नहीं है, –

8

printf में प्रारूप विनिर्देशक के रूप में उपयोग करते समय, यह स्मृति से चरित्र को पढ़ता है और '\0' वर्ण ढूंढने पर रोकता है। यदि इसे '\0' वर्ण नहीं मिलता है तो तब तक यह स्मृति में कहीं भी '\0' वर्ण ढूंढता है।

उपरोक्त स्निपेट में var1 और var2 लंबाई 5 की वर्ण सरणी हैं।चूंकि आप एक प्रारूप विनिर्देशक के रूप में %s का उपयोग कर रहे हैं, इसलिए आपको उन्हें '\0' के साथ समाप्त करने की आवश्यकता है। यह सरणी के आकार को बढ़ाकर किया जा सकता है। यह डिफ़ॉल्ट

char var1[6] = "Hello"; 
char var2[6] = "World"; 

द्वारा एक '\0' चरित्र में संलग्न कर देगा सरणी आकार निर्दिष्ट नहीं है char var1[5] = "Hello"; और char var1[6] = "Hello";

+--------+--------+--------+--------+--------+ 
|  |  |  |  |  | 
| 'H' | 'e' | 'l' | 'l' | 'o' | char var1[5] = "Hello"; 
|  |  |  |  |  | 
+--------+--------+--------+--------+--------+ 





+--------+--------+--------+--------+--------+--------+ 
|  |  |  |  |  |  | 
| 'H' | 'e' | 'l' | 'l' | 'o' | '\0' | char var1[6] = "Hello"; 
|  |  |  |  |  |  | 
+--------+--------+--------+--------+--------+--------+ 
संबंधित मुद्दे