একটি চরকে * 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.