একটি চরকে * std :: স্ট্রিংয়ে রূপান্তর করুন


262

এর মাধ্যমে std::stringপুনরুদ্ধার করা ডেটা সঞ্চয় করতে আমার একটি ব্যবহার করা দরকার fgets()। রূপান্তর করতে এই আমি প্রয়োজন কাজের জন্য char*ফেরত মান থেকে fgets()একটি মধ্যে std::stringএকটি অ্যারের মধ্যে দোকান থেকে। কিভাবে এই কাজ করা যেতে পারে?

উত্তর:


376

std::string এর জন্য একজন কনস্ট্রাক্টর রয়েছে:

const char *s = "Hello, World!";
std::string str(s);

নোট করুন যে এটি চরিত্রের তালিকার গভীর অনুলিপিগুলি তৈরি করে sএবং sহওয়া উচিত নয় nullptr, অন্যথায় আচরণটি সংজ্ঞায়িত।


6
তা হলে কী হবে?
কারসন মায়ার্স

14
স্ট্যান্ডার্ড বলছে যে কনস্ট্রাক্টর প্যারামিটারটি "নাল পয়েন্টার হবে না" - এটি কোনও ব্যতিক্রম নিক্ষেপ করা হয়েছে তা নির্দিষ্ট করে না।

24
এটি কি অগভীর বা গভীর অনুলিপি?

4
@ পুশকিন নং strকেবল একটি পরিবর্তনশীল নাম। এটা তোলে কিছু হতে পারে: S, abc, l, I, strHelloWorld। স্পষ্টতই কিছু পছন্দ অন্যদের চেয়ে ভাল। তবে এই উদাহরণটি strবেশ গ্রহণযোগ্য।
বিস্মিত

10
@ ম্যাডাটার এটি একটি গভীর অনুলিপি। পয়েন্টার বরাদ্দ থাকবে, এবং স্ট্রিং নিজেকে নতুন বরাদ্দ করবে।
মুডবুম

127

আপনি যদি ইতিমধ্যে চর * এর আকার জানেন তবে পরিবর্তে এটি ব্যবহার করুন

char* data = ...;
int size = ...;
std::string myString(data, size);

এটি স্ট্রেন ব্যবহার করে না।

সম্পাদনা: স্ট্রিং ভেরিয়েবল ইতিমধ্যে বিদ্যমান থাকলে, এসাইন্ট () ব্যবহার করুন:

std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);

1
এক পক্ষের প্রশ্ন, ইউজিন। যদি পরবর্তী সময়ে রুটিনে ডেটা জনবসতি না থাকে তবে আপনি কীভাবে মাইস্ট্রিং শুরু করবেন? আপনি যখন মাইস্ট্রিং পরিবর্তনশীলটিকে জনবহুল করবেন তখন কি কেবল ঘোষণা করেন?
IcedDante

2
int আকার = স্ট্রেন (ডেটা);
ভ্লাদ

@ ভ্লাদ: ধারণাটি হল আপনি অন্য কোনও উত্স থেকে আকারটি জানেন এবং / অথবা ডেটা কোনও সি-স্ট্রিং নয় (নাল এমবেড করেছেন বা শূন্যে শেষ করবেন না)। আপনার যদি সি-স্ট্রিং থাকে তবে আপনি কেবল মাই স্ট্রিং = ডেটা করতে পারেন; এটি আপনার জন্য শক্ত বা সমতুল্য চলবে।
ইউজিন

1
@huseyintugrulbuyukisik আপনাকে এখনও মূল স্মৃতি সঠিকভাবে নিষ্পত্তি করতে হবে - স্ট্যান্ড :: স্ট্রিং বাইটগুলি অনুলিপি করবে, এটি মালিকানা গ্রহণ করবে না।
ইউজিন

2
@ জ্যাকলি এটি বাইটগুলির জন্য নতুন মেমরি বরাদ্দ করবে এবং সেগুলি সমস্ত সেখানে অনুলিপি করবে, এটি যত গভীর হবে। যদি আপনি অগভীর অনুলিপিটির সম্ভাবনা চান তবে আপনার একটি স্ট্যান্ড :: স্ট্রিংকে অন্যটিতে অনুলিপি করতে হবে। তারপরে কিছু বাস্তবায়ন আমার মনে হয় অগভীর অনুলিপি করতে পারে।
ইউজিন

30

বেশিরভাগ উত্তর নির্মাণ সম্পর্কে আলোচনা করে std::string

যদি ইতিমধ্যে নির্মিত হয়, কেবল অ্যাসাইনমেন্ট অপারেটর ব্যবহার করুন

std::string oString;
char* pStr;

... // Here allocate and get character string (e.g. using fgets as you mentioned)

oString = pStr; // This is it! It copies contents from pStr to oString

28

Fgets () দ্বারা পুনরুদ্ধার করা ডেটা সঞ্চয় করার জন্য আমার std :: স্ট্রিং ব্যবহার করতে হবে।

fgets()আপনি যখন সি ++ প্রোগ্রামিং করছেন তখন কেন ব্যবহার করছেন ? না কেন std::getline()?


18

এটি নির্মাণকারীর মাধ্যমে প্রবেশ করুন:

const char* dat = "my string!";
std::string my_string( dat );

আপনি অন্যভাবে যেতে স্ট্রিং.আর.সি. (() ফাংশনটি ব্যবহার করতে পারেন:

std::string my_string("testing!");
const char* dat = my_string.c_str();

3
c_str()ফিরেconst char*
স্টিভ জেসোপ

1
ঠিক আছে, আপনি st_ :: স্ট্রিংয়ে ডেটা c_str () এর মাধ্যমে ডেটা পরিবর্তন করতে পারবেন না (হওয়া উচিত নয়)। যদি আপনি ডেটা পরিবর্তন করতে চান, তবে c_str () এর সি স্ট্রিংটি স্মরণীয় হওয়া উচিত
কার্সন মায়ার্স

11
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;

6
char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;

5

আমি একটি নতুন পদ্ধতি উল্লেখ করতে চাই যা ব্যবহারকারীর সংজ্ঞায়িত আক্ষরিক ব্যবহার করে s। এটি নতুন নয়, তবে এটি আরও সাধারণ হবে কারণ এটি সি ++ 14 স্ট্যান্ডার্ড লাইব্রেরিতে যুক্ত করা হয়েছিল।

সাধারণ ক্ষেত্রে অতিরিক্ত পরিমাণে অতিরিক্ত:

string mystring = "your string here"s;

তবে এটি আপনাকে প্রশস্ত স্ট্রিং সহ অটোও ব্যবহার করতে দেয়:

auto mystring = U"your UTF-32 string here"s;

এবং এখানেই এটি সত্যই জ্বলে উঠেছে:

string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;

2

আমি ঠিক std::string(char*)শীর্ষ-উত্তরের উত্তরের মতো কনস্ট্রাক্টরটি ব্যবহার করতে এমএসভিসি ২০০৫ এর সাথে লড়াই করছি । যেহেতু আমি এই রূপটি সর্বদা-বিশ্বস্ত http://en.cppreferences.com/w/cpp/string/basic_string/basic_string এ # 4 হিসাবে তালিকাভুক্ত দেখতে পাচ্ছি , আমি পুরানো সংকলকও এটিকে প্রস্তাব দিচ্ছি।

আমাকে বুঝতে এত দীর্ঘ সময় লেগেছে যে এই নির্মাতা নিখুঁত (unsigned char*)একটি যুক্তি হিসাবে মেলাতে অস্বীকার করেছে ! std::stringআর্গুমেন্টের ধরণের সাথে মেলে ব্যর্থতা সম্পর্কে আমি এই বোধগম্য ত্রুটি বার্তাগুলি পেয়েছি , যা আমি লক্ষ্য রেখেছিলাম তা অবশ্যই ছিল না। std::string((char*)ucharPtr)আমার সমস্যা সমাধানের সাথে যুক্তিটি সরাচ্ছি ... ডু!


0
char* data;
std::string myString(data);

9
এটি অনির্ধারিত আচরণের ফলাফল করবে।

1
শুধুমাত্র এই দুটি লাইন দিয়ে, dataঅবিচ্ছিন্ন (খালি) থেকে যায়।
হেলটনবাইকার

1
প্রদত্ত পয়েন্টারের সত্যিকারের "দৈর্ঘ্য" ছাড়াই এই কোডটি হারিয়ে যাওয়া ডেটা সৃষ্টি করতে পারে, আপনার স্ট্যান্ড :: স্ট্রিংটি মূল চরের চেয়ে "আরও সংক্ষিপ্ত" হবে
অ্যান্ডিয়ানা

0

নিশ্চিত না কেন এরিক ব্যতীত অন্য কেউ এটি উল্লেখ করেছেন না, তবে এই পৃষ্ঠা অনুসারে , অ্যাসাইনমেন্ট অপারেটর ঠিক ঠিক কাজ করে। কোনও কনস্ট্রাক্টর, .assign (), বা .append () ব্যবহার করার দরকার নেই।

std::string mystring;
mystring = "This is a test!";   // Assign C string to std:string directly
std::cout << mystring << '\n';

1
এটি কার্যকরীভাবে কাজ করছে বলে মনে হচ্ছে না, তবে আমি যখন এটিটি করেছি তখন আমি প্রোগ্রামের শেষে ভ্যালগ্রাইন্ডের কাছে পৌঁছনীয়যোগ্য ব্লকগুলি =(এবং +=) এর ভিতরে "নতুন" থেকে উত্সাহিত করার বিষয়টি নিয়ে সমস্যা শুরু করি । এটি এরকম আক্ষরিক সাথে ঘটবে বলে মনে হয় না, তবে কেবল char*জিনিসগুলির সাথে। এই জাতীয় রিপোর্টগুলি আসলে ফাঁস কিনা তা নিয়ে এখানে আলোচনা করা হয়েছে । তবে আমি যদি destString = std::string(srcCharPtr);ভ্যাসগ্রাইন্ডের জন্য অ্যাসাইন পরিবর্তন করি তবে লিক রিপোর্টগুলি চলে যায়। YMMV।
হোস্টাইলফোর্ক বলেছেন, এসই

হোস্টাইলফোর্কের মন্তব্য আপনাকে বিশ্বাস করতে পরিচালিত করতে পারে যে চর থেকে স্ট্রিং তৈরি করা (যেমন fgets এর মত) স্ট্যান্ড :: :: স্ট্রিং এই স্মৃতির আজীবন পরিচালনা করে। তবে, এই ক্ষেত্রে হয় না. 21.4.2.7 এবং .9 মান দেখুন Constructs an object of class basic_string and determines its initial string value from the array। এটি বাফার বা পয়েন্টারের মালিকানা সম্পর্কে মান এবং কিছুই বলে না।
এরিক ভ্যান ভেলজেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.