সি ++ তে দুটি স্ট্রিং কীভাবে সংযুক্ত করতে হয়?


101

আমার একটি প্রাইভেট ক্লাস ভেরিয়েবল রয়েছে char name[10]যাতে আমি .txtএক্সটেনশনটি যুক্ত করতে চাই যাতে ডিরেক্টরিটিতে উপস্থিত ফাইলটি খুলতে পারি।

কিভাবে আমি এই সম্পর্কে যান?

একটি নতুন স্ট্রিং ভেরিয়েবল তৈরি করা ভাল be

উত্তর:


162

প্রথমত, ব্যবহার করবেন না 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নিজেকে এখান থেকে শুরু:

আশা করি এইটি কাজ করবে.


4
এই স্ট্রিং সংক্ষিপ্তকরণ সময় জটিলতা কি?
d34th4ck3r

@ d34th4ck3r: এটি লিনিয়ার।
নওয়াজ

31

যেহেতু এটি সি ++ এর std::stringপরিবর্তে ব্যবহার করবেন না char*? প্রতিযোগিতা তুচ্ছ হবে:

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

4
লক্ষণীয়, তুচ্ছ ব্যবহারটি রানটাইম পারফরম্যান্সের ক্ষেত্রে একটি নন-তুচ্ছ মূল্য ট্যাগের সাথে আসে। সবচেয়ে খারাপ ঘটনাটি হ'ল, এটি operator+=একটি হ্রাস এবং বরাদ্দ উভয়ই সম্পাদন করে। আমরা সাধারণত সবচেয়ে ব্যয়বহুল ক্রিয়াকলাপগুলির মধ্যে গাদা বরাদ্দ।
IInspectable

15

আপনি যদি সি তে প্রোগ্রামিং nameকরছিলেন , তবে ধরে নেওয়া সত্যিই আপনি যেমন বলছেন ঠিক এমন একটি নির্দিষ্ট দৈর্ঘ্যের অ্যারে, আপনাকে নীচের মতো কিছু করতে হবে:

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

আপনি এখন দেখুন কেন সবাই সুপারিশ করেন std::string?


4
আপনি কি দেখতে পাচ্ছেন না যে লোকটি সি ++ তে প্রশ্ন করেছে এবং সি তে নয় ??
আইসিফ্লেমে

21
আপনি কি দেখতে পাচ্ছেন না যে আমি বলেছিলাম "আপনি যদি প্রোগ্রামিং করতেন ..."?
টনিকে

আপনি কি মনে করেন না এই উত্তরটি এই প্রশ্নের জন্য অপ্রাসঙ্গিক?
আইসিফ্লেমে

9
আমার মনে হয় এটি প্রাসঙ্গিক যেহেতু "লোক" স্টাড :: স্ট্রিংয়ের পরিবর্তে চর ব্যবহার করছে। তদ্ব্যতীত, এটি যুক্তিযুক্তর একটি সুস্পষ্ট উপায় দেখায় যা সর্বাধিক ভোট দেওয়া উত্তরে প্রদর্শিত হয়নি। কমপক্ষে আমি এটি দিয়ে কিছু শিখেছি।
gvegayon

4
এটি গতিশীল মেমরির বরাদ্দ ছাড়াই স্ট্রিং কনটেনটেশন করার একটি পদ্ধতিও দেখায়। আমি ভুল না হলে, স্টাডি :: স্ট্রিং অপারেটর + = একটি সম্ভাব্য পুনঃব্যবস্থার প্রয়োজন।
অ্যাশলে ডানকান

7

পোর্ট করা সি লাইব্রেরি থেকে একটি স্ট্রিকাট () ফাংশন রয়েছে যা আপনার জন্য "সি স্টাইল স্ট্রিং" কনকনেটেশন করবে।

বিটিডাব্লু সি-স্টাইলের স্ট্রিংগুলি মোকাবেলা করার জন্য সি ++ এর অনেকগুলি কার্যকারিতা থাকলেও আপনি চেষ্টা করে নিজের ফাংশনটি নিয়ে আসার পক্ষে এটি আপনার পক্ষে উপকারী হতে পারে, এরকম কিছু:

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 +তবে আইআরসি অপারেটর কেবলমাত্র পয়েন্টার দিয়ে ওভারলোডগুলি যুক্তি অনুমোদিত না হওয়ায়।

এছাড়াও, ভুলে যাবেন না এই ক্ষেত্রে ফলাফলটি পরিবর্তনশীলভাবে বরাদ্দ করা হয়েছে, যাতে আপনি মেমরির ফাঁস এড়াতে এটিকে মুছতে কল করতে চাইতে পারেন, বা স্ট্যাক বরাদ্দ করা অক্ষর অ্যারে ব্যবহার করার জন্য আপনি ফাংশনটি সংশোধন করতে পারেন, অবশ্যই যথেষ্ট পরিমাণে তার দৈর্ঘ্য রয়েছে provided


আইসিফ্লেমের উত্তরে আমার মন্তব্য দেখুন।
টনিকে

4
strncat()সাধারণত আরও ভাল বিকল্প রয়েছে এমন ফাংশন রয়েছে
নোগার্ড

@ নোগার্ড: 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.