আমার প্রশ্নটিতে সেদ্ধ করা যেতে পারে, stringstream.str().c_str()
লাইভ ইন মেমরি থেকে স্ট্রিংটি কোথায় ফিরে আসে এবং কেন এটি একটিতে নির্ধারিত করা যায় না const char*
?
এই কোড উদাহরণটি এটির চেয়ে ভাল ব্যাখ্যা করবে
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream ss("this is a string\n");
string str(ss.str());
const char* cstr1 = str.c_str();
const char* cstr2 = ss.str().c_str();
cout << cstr1 // Prints correctly
<< cstr2; // ERROR, prints out garbage
system("PAUSE");
return 0;
}
অনুমান যে stringstream.str().c_str()
একটি বরাদ্দ করা যেতে পারে const char*
তা একটি বাগের দিকে নিয়ে যায় যা ট্র্যাক ডাউন করতে আমাকে কিছুটা সময় নেয়।
বোনাস পয়েন্টের জন্য, যে কেউ প্রতিস্থাপন করতে পারে তা কেন ব্যাখ্যা করতে পারে cout
বিবৃতিটি সাথে
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
স্ট্রিংগুলি সঠিকভাবে মুদ্রণ করে?
আমি ভিজ্যুয়াল স্টুডিও ২০০৮-এ সংকলন করছি।
str()
এমনভাবে প্রয়োগ করা হয় যাতে আরভিও লাথি মারতে পারে (যা খুব সম্ভবত), সংকলককে সরাসরি ফলাফল তৈরির অনুমতি দেওয়া হয় মধ্যেtmp
, অস্থায়ী এলিডিং; এবং যে কোনও আধুনিক সি ++ সংকলক এটি করবে যখন অপ্টিমাইজেশন সক্ষম হয়। অবশ্যই, বাইন্ড-টু-কনস্ট্যান্ড-রেফারেন্স সমাধানটি কোনও অনুলিপিের নিশ্চয়তা দেয়, তাই এটি ভাল পছন্দনীয় - তবে আমি ভেবেছিলাম এটি এখনও স্পষ্ট করার মতো।