जवाबों:
सबसे पहले, उपयोग char*या नहीं char[N]। उपयोग करें std::string, फिर बाकी सब कुछ इतना आसान हो जाता है!
उदाहरण,
std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!
आसान है, है ना?
अब अगर आपको char const *किसी कारण की आवश्यकता है , जैसे कि जब आप किसी समारोह में जाना चाहते हैं, तो आप ऐसा कर सकते हैं:
some_c_api(s.c_str(), s.size());
इस समारोह को इस रूप में घोषित किया जाता है:
some_c_api(char const *input, size_t length);
अन्वेषण std::stringअपने आप को यहां से शुरू:
उम्मीद है की वो मदद करदे।
चूंकि यह C ++ है, इसलिए std::stringइसके बजाय इसका उपयोग क्यों नहीं किया जाता है char*? संघटन तुच्छ होगा:
std::string str = "abc";
str += "another";
operator+=एक निपटारा और आवंटन दोनों करता है। ढेर आवंटन सबसे महंगे ऑपरेशनों में से हैं जो हम आमतौर पर करते हैं।
यदि आप C में प्रोग्रामिंग कर रहे थे, तो यह मान लेना nameकि आप कहते हैं कि एक निश्चित लंबाई वाली सरणी है, आपको निम्नलिखित की तरह कुछ करना होगा:
char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
आप अब देखिए कि हर कोई सिफारिश क्यों करता है std::string?
पोर्टेड सी लाइब्रेरी से एक स्ट्रैकट () फ़ंक्शन होता है जो आपके लिए "सी स्टाइल स्ट्रिंग" कॉनकैटेशन करेगा।
BTW भले ही C ++ में C- स्टाइल स्ट्रिंग्स से निपटने के लिए फ़ंक्शंस हो, लेकिन यह आपके लिए लाभदायक हो सकता है कि आप अपने स्वयं के फंक्शन के साथ आएं, जो कुछ ऐसा करता है:
char * con(const char * first, const char * second) {
int l1 = 0, l2 = 0;
const char * f = first, * l = second;
// step 1 - find lengths (you can also use strlen)
while (*f++) ++l1;
while (*l++) ++l2;
char *result = new char[l1 + l2];
// then concatenate
for (int i = 0; i < l1; i++) result[i] = first[i];
for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1];
// finally, "cap" result with terminating null char
result[l1+l2] = '\0';
return result;
}
...और फिर...
char s1[] = "file_name";
char *c = con(s1, ".txt");
... जिसका परिणाम है file_name.txt।
आपको अपने स्वयं के operator +आईआईआरसी ऑपरेटर को लिखने के लिए भी लुभाया जा सकता है, केवल तर्क के साथ ओवरऑल लोड होता है क्योंकि तर्क की अनुमति नहीं है।
इसके अलावा, यह मत भूलो कि इस मामले में परिणाम गतिशील रूप से आवंटित किया गया है, इसलिए आप मेमोरी लीक से बचने के लिए उस पर डिलीट कॉल करना चाहते हैं, या आप स्टैक आवंटित चरित्र सरणी का उपयोग करने के लिए फ़ंक्शन को संशोधित कर सकते हैं, बशर्ते कि इसकी लंबाई पर्याप्त हो।
strncat()समारोह आमतौर पर बेहतर विकल्प है कि
strncatयहां अप्रासंगिक है, क्योंकि हम पहले से ही दूसरे पैरामीटर की लंबाई जानते हैं ".txt"। तो यह सिर्फ होगा strncat(name, ".txt", 4), जो हमें कुछ भी हासिल नहीं करता है।
strcat (डेस्टिनेशन, सोर्स) c ++ में दो स्ट्रिंग्स को समेटने के लिए इस्तेमाल किया जा सकता है।
गहरी समझ रखने के लिए आप निम्नलिखित लिंक में देख सकते हैं-
पुरानी शैली सी स्ट्रिंग के बजाय सी ++ स्ट्रिंग क्लास का उपयोग करना बेहतर है, जीवन बहुत आसान होगा।
यदि आपके पास पुरानी स्टाइल स्ट्रिंग मौजूद है, तो आप स्ट्रिंग क्लास को गुप्त कर सकते हैं
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout<<greeting + "and there \n"; //will not compile because concat does \n not work on old C style string
string trueString = string (greeting);
cout << trueString + "and there \n"; // compiles fine
cout << trueString + 'c'; // this will be fine too. if one of the operand if C++ string, this will work too
//String appending
#include <iostream>
using namespace std;
void stringconcat(char *str1, char *str2){
while (*str1 != '\0'){
str1++;
}
while(*str2 != '\0'){
*str1 = *str2;
str1++;
str2++;
}
}
int main() {
char str1[100];
cin.getline(str1, 100);
char str2[100];
cin.getline(str2, 100);
stringconcat(str1, str2);
cout<<str1;
getchar();
return 0;
}