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


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.