কনস্ট চর * কনটেনটেশন


116

আমাকে এর মতো দুটি কনস্ট চরিত্রকে বোঝাতে হবে:

const char *one = "Hello ";
const char *two = "World";

আমি কীভাবে এটি করতে যেতে পারি?

আমি char*একটি সি ইন্টারফেস সহ তৃতীয় পক্ষের লাইব্রেরি থেকে এইগুলি পাস করেছি যাতে আমি কেবল std::stringপরিবর্তে ব্যবহার করতে পারি না ।


6
আমি বিভ্রান্ত - মূল প্রশ্নকর্তা "সি ++" ট্যাগ লিখেছিলেন - তবে অন্য কেউ এটিকে সরিয়ে দিয়েছেন। এই প্রশ্নের কি অবস্থা? সি ++ কোড অনুমোদিত?
— জোহানেস স্কাউব - লিটব

1
@ জোহানেস: এটি আরও ভাল প্রশ্ন এক্সডি।
— প্রসূন সৌরভ

এছাড়াও নোট করুন মূল প্রশ্নটি সি-তে উল্লেখ করা হয়নি - আমি সেই ট্যাগটি সরিয়েছি।

আমি সিতে সি ++ ট্যাগটি স্যুইচ করেছি কারণ ওপি একটি উত্তর গ্রহণ করেছে যা স্ট্যাক strcpyএবং strcatকলগুলিতে অ্যারে ব্যবহার করে , আমি ভেবেছিলাম যে ট্যাগগুলি পরিবর্তন করার জন্য এটি বোধগম্য।
— গ্রেগরি পাকোস্জ

7
সি এবং সি ++ ট্যাগ যুক্ত করা হয়েছে। ওপি যেমন একটি মন্তব্যে ব্যাখ্যা করেছে, সে সি ++ কোড লিখছে, তবে একটি লাইব্রেরিতে কল করছে যা একটি সি ইন্টারফেস ব্যবহার করে। প্রশ্ন দুটি ভাষায়ই প্রাসঙ্গিক।
— জাল্ফ

উত্তর:


110

আপনার উদাহরণে এক এবং দুটি হ'ল চর পয়েন্টার, চর ধ্রুবকগুলিকে নির্দেশ করে। আপনি এই পয়েন্টারগুলি দ্বারা নির্দেশিত চর স্থির পরিবর্তন করতে পারবেন না। সুতরাং যেমন কিছু:

strcat(one,two); // append string two to string one.

কাজ করবে না. পরিবর্তে ফলাফল রাখা আপনার পৃথক ভেরিয়েবল (চর অ্যারে) থাকা উচিত। এটার মতো কিছু:

char result[100];   // array to hold the result.

strcpy(result,one); // copy string one into the result.
strcat(result,two); // append string two to the result.

7
চর * ফলাফল সম্পর্কে কি; ফলাফল = কলোক (স্ট্রেন (এক) + স্ট্রেন (দুই) +1, সাইজফ (চার)); এবং তারপরে স্ট্রাইকপি + স্ট্রাইক্যাট?
— লুস্কুবাল

3
@ লুইসুবল: হ্যাঁ এটিও কার্যকর হবে ... কেবল একটি (চর *) cast
— ালাই

5
এই উত্তরটির সাথে সমস্যাটি হ'ল হার্ড কোডড অ্যারে আকার। এটি প্রবেশ করা সত্যিই একটি খারাপ অভ্যাস, বিশেষত যদি আপনি "এক" এবং "দু" আকারের আকারটি না জানেন তবে।
— পল টমবলিন

1
প্রথম উদাহরণে, strcpy(one,two);হওয়া উচিত strcat(one,two);(এটি যে এটি সঠিক করে না, যেমন আপনি সঠিকভাবে নির্দেশ করেছেন)।
— অলোক সিংহল

1
কি সম্পর্কে sprintf(dest,"%s%s",one,two)এবং অনুলিপি ভুলে যান?
— এমপেন

81

সি উপায়:

char buf[100];
strcpy(buf, one);
strcat(buf, two);

সি ++ উপায়:

std::string buf(one);
buf.append(two);

সংকলন সময় উপায়:

#define one "hello "
#define two "world"
#define concat(first, second) first second

const char* buf = concat(one, two);

31

আপনি যদি সি ++ ব্যবহার করেন তবে আপনি std::stringসি স্টাইলের স্ট্রিংয়ের পরিবর্তে কেন ব্যবহার করবেন না ?

std::string one="Hello";
std::string two="World";

std::string three= one+two;

আপনার যদি এই স্ট্রিংটি সি-ফাংশনে পাস করতে হয় তবে কেবল পাস করুন three.c_str()


7
কারণ আমি এমন একটি লাইব্রেরি ব্যবহার করছি যা সি তে কোডড ছিল তাই ফাংশনগুলি
— কনস্ট চরটি

1
@ অ্যান্থনি ক্যালডওয়েল: হাসির জন্য ধন্যবাদ। কাজের চাপের কারণে আমি পারিনি
— ::D

নতুন কাজের জন্য এটির মতো সময় লাগছে? ...
— সর্বাধিক

20

ব্যবহার std::string:

#include <string>

std::string result = std::string(one) + std::string(two);

10
দ্বিতীয় সুস্পষ্ট কনস্ট্রাক্টর কলটি প্রয়োজন নেই
— 3'10

17
const char *one = "Hello ";
const char *two = "World";

string total( string(one) + two );

// to use the concatenation as const char*, use:
total.c_str()

আপডেট করা হয়েছে: পরিবর্তিত string total = string(one) + string(two); করতে string total( string(one) + two );কর্মক্ষমতা কারণে (স্ট্রিং দুই এবং অস্থায়ী মোট STRING টি নির্মাণের এড়াতে)

// string total(move(move(string(one)) + two));  // even faster?

@ বিউরিদু আপনি এটি পরিমাপ করেছেন? পরিস্থিতি যেখানে সুরক্ষা ট্রাম্প কর্মক্ষমতা সম্পর্কে কি? (তারা সাধারণ পরিস্থিতি)
— স্কাইকি

3
@ স্কেয়াকি এমন কোনও পরিস্থিতি নেই যেখানে এটি অন্য যে কোনও সমাধানের চেয়ে নিরাপদ, তবে রানটাইম আচরণের পাশাপাশি মেমরির বরাদ্দকে প্রায় আহ্বান জানিয়ে এটি একটি সঙ্কলন সময় সমাধানের চেয়ে সবসময় ধীর।
— অ্যালিস

8

আরও একটি উদাহরণ:

// calculate the required buffer size (also accounting for the null terminator):
int bufferSize = strlen(one) + strlen(two) + 1;

// allocate enough memory for the concatenated string:
char* concatString = new char[ bufferSize ];

// copy strings one and two over to the new buffer:
strcpy( concatString, one );
strcat( concatString, two );

...

// delete buffer:
delete[] concatString;

তবে আপনি নির্দিষ্টভাবে সি ++ স্ট্যান্ডার্ড লাইব্রেরিটি না চান বা ব্যবহার করতে না পারলে ব্যবহার std::stringকরা সম্ভবত নিরাপদ।


1
ওপি যদি সি ++ ব্যবহার করতে না পারে তবে সে ব্যবহার করতে পারে না new। এবং যদি সে এটি ব্যবহার করতে পারে তবে তার ব্যবহার করা উচিত std::string, যেমনটি আপনি বলেছেন।
— অলোক সিংহল

5

দেখে মনে হচ্ছে আপনি সি লাইব্রেরির সাথে সি ++ ব্যবহার করছেন এবং সুতরাং আপনার সাথে কাজ করা দরকার const char * ।

আমি ঐ মোড়কে করার পরামর্শ দিই const char *মধ্যে std::string:

const char *a = "hello "; 
const char *b = "world"; 
std::string c = a; 
std::string d = b; 
cout << c + d;

5

প্রথমত, আপনাকে কিছু গতিশীল মেমরি স্পেস তৈরি করতে হবে। তারপরে আপনি কেবল দুটি স্ট্রিং এতে স্ট্রাক্যাট করতে পারেন। অথবা আপনি সি ++ "স্ট্রিং" বর্গ ব্যবহার করতে পারেন। পুরাতন স্কুল সি উপায়:

  char* catString = malloc(strlen(one)+strlen(two)+1);
  strcpy(catString, one);
  strcat(catString, two);
  // use the string then delete it when you're done.
  free(catString);

নতুন সি ++ উপায়

  std::string three(one);
  three += two;

আপনার গতিশীল স্মৃতি কেন দরকার?
— লুকা ম্যাটেইস

4
-1 আমার জন্য, প্রথমে সি-ওয়ে দিয়ে আপনাকে ম্যালোক এবং বিনামূল্যে ব্যবহার করতে হবে। তারপরেও আপনি যদি নতুন করেন তবে এটি মুছতে হবে [] এবং মোছা হবে না।
— নবীন

আমি যে লাইব্রেরিটি ব্যবহার করছি সেটি সি নট সি ++ এ কোড করা হয়েছে যাতে সমস্ত ফাংশন কনস্টের চর * স্ট্রিং নয় return
— অ্যান্থনি ক্যালওয়েল

1
@ নতুন, ট্যাগটি "সি ++" বলেছে। আপনি যদি নতুন ব্যবহার করতে এবং মুছতে না পারেন তবে তার সি ++ ট্যাগ ব্যবহার করা উচিত হয়নি।
— পল টমলিন

5

আপনি যদি স্ট্রিংয়ের আকার না জানেন তবে আপনি এরকম কিছু করতে পারেন:

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

int main(){
    const char* q1 = "First String";
    const char* q2 = " Second String";

    char * qq = (char*) malloc((strlen(q1)+ strlen(q2))*sizeof(char));
    strcpy(qq,q1);
    strcat(qq,q2);

    printf("%s\n",qq);

    return 0;
}

3

আপনি ব্যবহার করতে পারেন strstream। এটি আনুষ্ঠানিকভাবে অবমূল্যায়ন করা হয়েছে, তবে আপনার যদি সি স্ট্রিংয়ের সাথে কাজ করার দরকার হয় তবে এটি এখনও দুর্দান্ত সরঞ্জাম i

char result[100]; // max size 100
std::ostrstream s(result, sizeof result - 1);

s << one << two << std::ends;
result[99] = '\0';

এটি স্ট্রিমে লিখবে oneএবং তারপরে লিখবে এবং ব্যবহার করে twoএকটি সমাপ্তি যুক্ত করবে । যদি উভয় স্ট্রিংই ঠিক অক্ষরগুলি লেখার শেষ করতে পারে - সুতরাং কোনও স্থান লেখার বাকী থাকবে না - আমরা ম্যানুয়ালি একটি লিখি শেষ অবস্থানে।\0std::ends99\0


অবমূল্যায়নের খুব বেশি গুরুত্ব দেওয়া উচিত নয়। এমনকি যদি এটি ভবিষ্যতের মানকটির সংস্করণ থেকে সরিয়ে দেওয়া হয়, তবে নিজের নামের জায়গায় পুনরায় বাস্তবায়ন করা এতটা কাজ নয়।
— স্টিভ জেসোপ

@ স্টিভ, প্রকৃতপক্ষে :) এবং আপনার নিজের streambufসাথে ব্যবহার করা একটি চার্ট বাফারের সাথে নিজের নির্দেশিকা আউটপুট লেখার ostreamবিষয়টি খুব বেশি কঠিন নয়।
— জোহানেস স্কাউব -


0

মেমরির গতিশীল বরাদ্দে strcpy কমান্ড ব্যবহার না করে দুটি ধ্রুবক চর পয়েন্টার সংযোগ স্থাপন:

const char* one = "Hello ";
const char* two = "World!";

char* three = new char[strlen(one) + strlen(two) + 1] {'\0'};

strcat_s(three, strlen(one) + 1, one);
strcat_s(three, strlen(one) + strlen(two) + 1, two);

cout << three << endl;

delete[] three;
three = nullptr;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.