C ++ में दो तारों को कैसे मिलाएं?


100

मेरे पास एक निजी वर्ग चर char name[10]है, जिसमें मैं .txtविस्तार जोड़ना चाहूंगा ताकि निर्देशिका में मौजूद फ़ाइल को खोल सकूं।

यह कैसे करना है?

यह एक नया स्ट्रिंग वैरिएबल बनाने के लिए बेहतर होगा जो समवर्ती स्ट्रिंग रखता है।

जवाबों:


160

सबसे पहले, उपयोग 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अपने आप को यहां से शुरू:

उम्मीद है की वो मदद करदे।


3
इस स्ट्रिंग संघटन की समय जटिलता क्या है?
d34th4ck3r

@ d34th4ck3r: यह रैखिक है।
नवाज

30

चूंकि यह C ++ है, इसलिए std::stringइसके बजाय इसका उपयोग क्यों नहीं किया जाता है char*? संघटन तुच्छ होगा:

std::string str = "abc";
str += "another";

1
वर्थ नोटिंग, तुच्छ उपयोग रनटाइम प्रदर्शन के संबंध में एक गैर-तुच्छ मूल्य टैग के साथ आता है। सबसे खराब मामला यह है कि operator+=एक निपटारा और आवंटन दोनों करता है। ढेर आवंटन सबसे महंगे ऑपरेशनों में से हैं जो हम आमतौर पर करते हैं।
IInspectable

15

यदि आप C में प्रोग्रामिंग कर रहे थे, तो यह मान लेना nameकि आप कहते हैं कि एक निश्चित लंबाई वाली सरणी है, आपको निम्नलिखित की तरह कुछ करना होगा:

char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...

आप अब देखिए कि हर कोई सिफारिश क्यों करता है std::string?


1
क्या आप यह नहीं देख सकते हैं कि आदमी ने सी ++ में एक प्रश्न पूछा है और सी में नहीं ??
IcyFlame

21
क्या आप यह नहीं देख सकते कि मैंने कहा "यदि आप प्रोग्रामिंग कर रहे थे ..."?
टोनीके

क्या आपको नहीं लगता कि यह उत्तर इस प्रश्न के लिए अप्रासंगिक है?
इस्सीफ्लेम

9
मुझे लगता है कि यह प्रासंगिक है क्योंकि "आदमी" एसटी के बजाय चार का उपयोग कर रहा है :: स्ट्रिंग। इसके अलावा, यह स्पष्ट मत देने का एक स्पष्ट तरीका दिखाता है जिसे सबसे अधिक वोट किए गए उत्तर में नहीं दिखाया गया था। कम से कम मैंने इसके साथ कुछ सीखा।
ग्वेगायोन

1
यह डायनामिक मेमोरी आवंटन के बिना एक स्ट्रिंग कॉन्सेटेशन करने की एक विधि को भी दर्शाता है। जब तक मैं गलत हूं, std :: string operator + = को एक संभावित प्राप्ति की आवश्यकता है।
एशले डंकन

7

पोर्टेड सी लाइब्रेरी से एक स्ट्रैकट () फ़ंक्शन होता है जो आपके लिए "सी स्टाइल स्ट्रिंग" कॉनकैटेशन करेगा।

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 +आईआईआरसी ऑपरेटर को लिखने के लिए भी लुभाया जा सकता है, केवल तर्क के साथ ओवरऑल लोड होता है क्योंकि तर्क की अनुमति नहीं है।

इसके अलावा, यह मत भूलो कि इस मामले में परिणाम गतिशील रूप से आवंटित किया गया है, इसलिए आप मेमोरी लीक से बचने के लिए उस पर डिलीट कॉल करना चाहते हैं, या आप स्टैक आवंटित चरित्र सरणी का उपयोग करने के लिए फ़ंक्शन को संशोधित कर सकते हैं, बशर्ते कि इसकी लंबाई पर्याप्त हो।


IcyFlame के जवाब के लिए मेरी टिप्पणी देखें।
टोनीके

3
वहाँ भी है strncat()समारोह आमतौर पर बेहतर विकल्प है कि
nogard

@nogard: strncatयहां अप्रासंगिक है, क्योंकि हम पहले से ही दूसरे पैरामीटर की लंबाई जानते हैं ".txt"। तो यह सिर्फ होगा strncat(name, ".txt", 4), जो हमें कुछ भी हासिल नहीं करता है।
टोनीके


0

पुरानी शैली सी स्ट्रिंग के बजाय सी ++ स्ट्रिंग क्लास का उपयोग करना बेहतर है, जीवन बहुत आसान होगा।

यदि आपके पास पुरानी स्टाइल स्ट्रिंग मौजूद है, तो आप स्ट्रिंग क्लास को गुप्त कर सकते हैं

    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

0

सी ++ 14

std::string great = "Hello"s + " World"; // concatenation easy!

प्रश्न पर उत्तर दें:

auto fname = ""s + name + ".txt";

-2
//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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.