2011-01-29 19 views
6

GDB का उपयोग करना, मैं जब मैं इस आपरेशन का प्रयास मैं एक विभाजन गलती मिल पाते हैं:स्ट्रैट एक स्ट्रिंग पर एक char concat?

strcat(string,&currentChar); 

यह देखते हुए कि स्ट्रिंग के रूप में

char * string = ""; 

आरंभ नहीं हो जाता और currentChar

char currentChar = 'B'; 

क्यों है इसका परिणाम एक विभाजन गलती में है?

यदि इसके लिए स्ट्रैट का उपयोग नहीं किया जा सकता है, तो मैं स्ट्रिंग पर एक char को और कैसे जोड़ सकता हूं?

+3

strcat अशक्त-समाप्त तार की आवश्यकता है। आपके सिंगल चार में कोई शून्य नहीं है, इसलिए स्ट्रैट प्रतिलिपि बनाए रखेगा जब तक कि यह लाइन के नीचे कहीं नल न हो, जो दुर्घटना से दूसरे बाइट पर हो या सड़क के नीचे कुछ गीगाबाइट हो, हर समय उस कचरे को अपनी स्ट्रिंग में कॉपी कर सकें , स्टैक पर स्टॉम्पिंग –

उत्तर

4

क्योंकि &currentChar एक स्ट्रिंग नहीं है, यह \0 चरित्र के साथ समाप्त नहीं होता है। आपको B को char *currentChar = 'B'; के रूप में परिभाषित करना चाहिए। इसके अलावा http://www.cplusplus.com/reference/clibrary/cstring/strcatstring के अनुसार परिणाम स्ट्रिंग (इस मामले में 2 बाइट) को पकड़ने के लिए पर्याप्त स्थान होना चाहिए, लेकिन यह केवल 1 बाइट है।

या आप char उपयोग करने के लिए तो आप की तरह (अपने कोड के आधार पर) कुछ कर सकते हैं चाहते हैं:

char string[256]; 
... 

char currentChar = 'B'; 
size_t cur_len = strlen(string); 
if(cur_len < 254) { 
    string[cur_len] = currentChar; 
    string[cur_len+1] = '\0'; 
} 
else 
    printf("Not enough space"); 
+0

प्रोग्राम क्यों segfaulting है कारण नहीं है। यह त्रुटि का हिस्सा है हालांकि –

+0

@ फ़ू 'और वर्तमानरहर' शून्य टर्मिनेट स्ट्रिंग पर इंगित नहीं करता है और निश्चित रूप से स्ट्रैपी एक सीईजी गलती का कारण बनता है – Elalfer

+0

मैं इसे उत्तर के रूप में स्वीकार करता हूं क्योंकि इसमें ए को शामिल किया गया है: मुझे शून्य टर्मिनेटर की आवश्यकता है, और बी: मुझे स्ट्रिंग के लिए और स्थान आवंटित करना पड़ा। – Blackbinary

1

strcat() दो '\ 0'-समाप्त तार लेता है। जब आप किसी चरित्र के पते को पार करते हैं, तो दिनचर्या उस स्मृति को देखेगी जो चरित्र का अनुसरण करती है, टर्मिनेटर की तलाश में।

चूंकि आप नहीं जानते कि यह स्मृति क्या संदर्भित करती है, आपको तब तक समस्या की उम्मीद करनी चाहिए जब आपका कोड इसका उपयोग करता है।

इसके अलावा, आपके स्ट्रिंग तर्क में कमरे में कोई भी पात्र शामिल नहीं है। उस स्मृति को कहां लिखा गया है? यह इस स्ट्रिंग से जुड़े स्मृति के अंत को लिखने का प्रयास करेगा।

+0

यह नहीं है कि प्रोग्राम segfaulting क्यों है ... –

-1

दोनों तारों को निरस्त कर दिया जाना चाहिए। एक सिंगल चार को निरस्त नहीं किया जाता है, इसलिए यह अनिर्धारित होता है जब स्ट्रैट अंत में अक्षर को जोड़ना बंद कर देगा। साथ ही, स्ट्रिंग में मूल स्ट्रिंग और परिणामी स्ट्रिंग दोनों के लिए कम से कम पर्याप्त स्थान होना चाहिए।

यह काम करता है:

char string[10] = ""; 
char* currentChar = "B"; 
strcat(string, currentChar); 
+0

यह काम नहीं करता है क्योंकि स्ट्रिंग में पर्याप्त स्थान नहीं है। मेरा बिंदु देखने के लिए, इसे आजमाएं: http://ideone.com/0jjST –

+0

कोड के साथ दो समस्याएं हैं। पहले तर्क में पर्याप्त स्थान नहीं है, दूसरे में कोई टर्मिनेटर नहीं है। आप केवल एक मुद्दे पर ध्यान केंद्रित क्यों कर रहे हैं? –

+0

यह कारण का हिस्सा है, हालांकि आप सही हैं, यह मुख्य नहीं है। segfault का मुख्य कारण शामिल करने के लिए तय किया गया है – helloworld922

-1

strcat का पहला तर्क स्ट्रिंग के बाकी पकड़ करने के लिए पर्याप्त स्थान होना आवश्यक है। "" एक स्थिर स्ट्रिंग है और इस तरह के जीसीसी अंतरिक्ष आवंटित नहीं करता है।

char buf[1024]; 

strcat(buf, ""); 
strcat(buf, "B"); 
7

दूसरों के द्वारा प्रतिक्रिया व्यक्त के रूप में, & currentCharचार या चार * करने के लिए एक सूचक है, लेकिन सी में एक स्ट्रिंग है चार [:

यह पर्याप्त जगह के साथ एक सरणी बनाने ] या कॉन्स char *

एक तरह से strcat उपयोग करने के लिए एक चार एक न्यूनतम स्ट्रिंगस्ट्रिंग के लिए पैदा कर रही है श्रेणीबद्ध और इसका इस्तेमाल स्ट्रिंग में एक चार को बदलने के लिए करने के लिए।

उदाहरण:

केवल 1 चरित्र और प्रत्यय '\ 0' साथ, एक साधारण स्ट्रिंग बनाना;

char cToStr[2]; 
cToStr[1] = '\0'; 

अपने प्रश्न का आवेदन:

char * string = ""; 
char currentChar = 'B'; 

cToStr स्ट्रिंग 'बी' मान लेंगे:

cToStr[0] = currentChar; 

और strcat काम करेंगे!

strcat (string, cToStr); 
0

मुझे लगता है कि सबसे सरल तकनीक (कुशल नहीं) होगा sprintf

sprintf(str, "%s%c", str, chr);