একটি স্টাড :: স্ট্রিংয়ে একটি চর সংযোজন কীভাবে?


175

নিম্নলিখিত ত্রুটি সঙ্গে ব্যর্থ prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’

int main()
{
  char d = 'd';
  std::string y("Hello worl");
  y.append(d); // Line 5 - this fails
  std::cout << y;
  return 0;
}

আমি নিম্নলিখিতগুলিও চেষ্টা করেছি, যা সংকলন করে তবে রানটাইমে এলোমেলো আচরণ করে:

int main()
{
  char d[1] = { 'd' };
  std::string y("Hello worl");
  y.append(d);
  std::cout << y;
  return 0;
}

এই বোবা প্রশ্নের জন্য দুঃখিত, তবে আমি গুগল ঘুরে দেখেছি, আমি যা দেখতে পাচ্ছি তা হ'ল "চর অ্যারে থেকে চর পিটিআর", "চর পিটিআর থেকে চর অ্যারে" ইত্যাদি etc.


একটি সংকলক ত্রুটি হ্যাঁ .. আমি ত্রুটিটি কী তা ভুলে গেছি তবে এটি যুক্তিসঙ্গত।
ডুবিয়াথ

3
আপনার নীচে আরও ভাল উত্তর রয়েছে তবে আপনি এই চরের মতো কাজ করে দ্বিতীয় উদাহরণ তৈরি করতে পারেন d [2] = {'d', 0}; বা কেবল চর ডি [2] = "ডি"; মূলত, আপনি একটি 0 প্রয়োজন আপনার সি-শৈলী স্ট্রিং বিনষ্ট আপনি সংযোজন পাস
sbk

এখানে ভাল ডকুমেন্টেশন: sgi.com/tech/stl/basic_string.html
মার্টিন ইয়র্ক

উত্তর:


225
y += d;

আমি +=নামযুক্ত ফাংশনগুলির পরিবর্তে অপারেটরটি ব্যবহার করব ।


2
আপনি +_ পুশ_ব্যাকের চেয়ে ভাল কেন বিবেচনা করেন? এটি কি কম টাইপিং বা আপনার অন্য কোনও কারণ রয়েছে?
গ্লেন

4
এটি টাইপিং কম। ইন gcc, basic_string::operator+=শুধুমাত্র একটি কল ইন push_back
এডুফি

2
স্ট্রিংগুলির জন্য এটি আরও প্রাকৃতিক আইএমও। push_back ধারক ফাংশন, এবং একটি স্ট্রিং STL মধ্যে :) একটি বিশেষ এক
Arak

6
আসুন এই প্রশ্নটি ঘুরিয়ে দিন: আপনি +_র তুলনায় পুশ_ব্যাককে কেন ভাল বিবেচনা করবেন? আমার মতে, + = পরিষ্কার এবং সংক্ষিপ্ত।
জেস্পার

34
আপনি কারণ যদি আপনি অভ্যাস ঢোকা, এই ঠিক সূক্ষ্ম কম্পাইল হবে এই সঙ্গে সতর্কতা অবলম্বন করা আবশ্যক চান yএকটি হল char*পরিবর্তে std::string। এটি dপয়েন্টারে y অক্ষর যুক্ত করবে ।
Zan Lynx


19

অ্যাপেন্ড পদ্ধতিটি ব্যবহার করে একটি স্টাডি :: স্ট্রিং ভেরিতে একটি চর যুক্ত করতে আপনাকে এই ওভারলোডটি ব্যবহার করতে হবে:

std::string::append(size_type _Count, char _Ch)

সম্পাদনা করুন: আপনার কথা ঠিক আছে আমি প্রাসঙ্গিক সাহায্যে প্রদর্শিত আকারের আকারের প্যারামিটারকে ভুল বুঝি। এটি যোগ করার জন্য সংখ্যা সংখ্যা। তাই সঠিক কল

s.append(1, d);

না

s.append(sizeof(char), d);

বা সহজতম উপায়:

s += d;

আমি মনে করি আকারের ব্যবহার এখানে শব্দার্থগতভাবে সঠিক নয় (যদিও এটি আকারের (চর) হিসাবে সর্বদা এক হিসাবে কাজ করে)। আপনি যদি একই চরিত্রের আরও অনুলিপি যুক্ত করতে চান তবে অ্যাপেন্ড পদ্ধতিটি স্বাভাবিকভাবেই বেশি কার্যকর is !!!!!!!!!!
আঙ্কেলবেন্স

1
আপনি sizeof(char)পরিবর্তে ব্যবহার করছেন কেন 1? আপনি ঠিক একটি পুনরাবৃত্তি সংযোজন করতে চান d, তাই শুধু এটি বলুন। sizeofএখানে ব্যবহার করা বিভ্রান্তিমূলক, যেহেতু এটির পরামর্শ দেওয়া হয় যে appendব্যবহার করা ডেটা টাইপের বাইট আকার বলতে হবে (যা ক্ষেত্রে নয়) the
ফার্দিনান্দ বায়ার

আঙ্কেলবেনস যেমন বলেছিলেন, একই চরিত্রকে বহুবার যুক্ত করার সময় সংযোজন পদ্ধতিটি সত্যই আরও কার্যকর।
প্যাট্রিস বার্নাসসোলা

10

উল্লিখিত অন্যগুলি ছাড়াও, স্ট্রিং কনস্ট্রাক্টরগুলির মধ্যে একটি চরে এবং সেই চরের জন্য পুনরাবৃত্তির সংখ্যা নেয়। সুতরাং আপনি এটি ব্যবহার করতে পারেন একটি একক চর সংযোজন।

std::string s = "hell";
s += std::string(1, 'o');

7

আমি বেশ কয়েকটি প্রস্তাবগুলিকে বড় লুপে চালিয়ে পরীক্ষা করি। আমি মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 2015 সংকলক হিসাবে ব্যবহার করেছি এবং আমার প্রসেসর একটি i7, 8Hz, 2GHz।

    long start = clock();
    int a = 0;
    //100000000
    std::string ret;
    for (int i = 0; i < 60000000; i++)
    {
        ret.append(1, ' ');
        //ret += ' ';
        //ret.push_back(' ');
        //ret.insert(ret.end(), 1, ' ');
        //ret.resize(ret.size() + 1, ' ');
    }
    long stop = clock();
    long test = stop - start;
    return 0;

এই পরীক্ষা অনুসারে, ফলাফলগুলি হ'ল:

     operation             time(ms)            note
------------------------------------------------------------------------
append                     66015
+=                         67328      1.02 time slower than 'append'
resize                     83867      1.27 time slower than 'append'
push_back & insert         90000      more than 1.36 time slower than 'append'

উপসংহার

+= আরও বোধগম্য মনে হয় তবে আপনি যদি গতির কথা মনে করেন তবে অ্যাপেন্ড ব্যবহার করুন


এই জাতীয় একটি উত্তর অর্থবহ হওয়ার জন্য, আপনি কমপ্লেক্সটি কী সংকলকটি ব্যবহার করছেন তা আপনার জানা উচিত, কারণ এই জাতীয় জিনিসগুলি অনেক বেশি পরিবর্তিত হতে পারে। এটির প্রকৃত প্রভাব সম্পর্কে মোটামুটি অনুমান করার জন্য আপনার প্রসেসর সম্পর্কে বলাও দুর্দান্ত হতে পারে।
একলতার

আমি ভিজ্যুয়াল স্টুডিও 2015 ব্যবহার করেছি। আমি আরও কিছু পরীক্ষা করার জন্য জিসিসির সন্ধান করব y আমার প্রসেসরটি আই 7, 8 হার্টস, ২.২০ গিগাহার্টজ .... তবে আমার প্রসেসর যাই হোক না কেন এটি স্ট্যান্ড :: স্ট্রিং বাস্তবায়নে কোনও প্রভাব ফেলবে না ... এগুলি বাদে যদি এই পদ্ধতির কিছুগুলি মাল্টিথ্রেড হয় এবং অন্য কেউ না হয়।
হুগো জেভেল

কখনও কখনও এর প্রভাব পড়ে, বিশেষত যদি আপনি মিলিসেকেন্ডে সময় দেখায়। পরিবর্তে আপনি দ্রুত পদ্ধতির তুলনায় শতাংশে তুলনামূলকভাবে প্রদর্শন করতে পারেন (সুতরাং প্রকৃত প্রসেসরের গতি অপ্রাসঙ্গিক) এছাড়াও মন্তব্য থেকে সেই তথ্যটি আপনার উত্তরের দিকে নিয়ে যান, এটি কেবল সাধারণ স্ট্যাক এক্সচেঞ্জ শিষ্টাচার। অন্যথায় সুন্দর উত্তর।
aktartar

6

+ = অপারেটর লিঙ্ক পাঠ্য , অ্যাডেন্ড () পদ্ধতি লিঙ্ক পাঠ্য বা পুশ_ব্যাক () পদ্ধতির লিঙ্ক পাঠ্য ব্যবহার করে দেখুন

এই পোস্টের লিঙ্কগুলিতে কীভাবে সম্পর্কিত এপিআই ব্যবহার করতে হবে তার উদাহরণ রয়েছে।


2

সমস্যা:

std::string y("Hello worl");
y.push_back('d')
std::cout << y;

চর আপনার নাম যেমন চরের ডি = 'ডি' ব্যবহার করার বিপরীতে আপনার 'ডি' থাকতে হবে; নাকি আমি ভুল করছি?


আমি এটি চেষ্টা করেছিলাম এবং এটি ভাল কাজ করে। আমার আছে char c = 'd'এবং আমি y.push_back(c)ইস্যু ছাড়াই করতে পারি । সুতরাং std::string::push_back()এটির সাথে কোনও সমস্যা নেই (এটি এর চেয়ে দীর্ঘতরটি ছাড়া +=)।
ফ্রাঙ্কলিন ইউ

1
int main()
{
  char d = 'd';
  std::string y("Hello worl");

  y += d;
  y.push_back(d);
  y.append(1, d); //appending the character 1 time
  y.insert(y.end(), 1, d); //appending the character 1 time
  y.resize(y.size()+1, d); //appending the character 1 time
  y += std::string(1, d); //appending the character 1 time
}

নোট যে এই উদাহরণ সব আপনি সরাসরি একটি অক্ষর আক্ষরিক ব্যবহার করেছেন পারে: y += 'd';

আপনার দ্বিতীয় উদাহরণটি প্রায় কোনও সম্পর্কযুক্ত কারণে কাজ করবে। char d[1] = { 'd'};কাজ নয়, কিন্তু করেনি char d[2] = { 'd'};(নোট অ্যারে দুই মাপ) মোটামুটিভাবে কাজ হয়ে যেত হিসাবে একই const char* d = "d";, এবং একটি স্ট্রিং আক্ষরিক করতে যোগ করা: y.append(d);


1

পয়েন্টার হিসাবে ডি ব্যবহার করার চেষ্টা করুন y.append (* d)


এটি বিপজ্জনক কারণ একক charকোনও স্ট্রিং নয় এবং কোনও নাল-টার্মিনেটর নেই। এটি করা অনির্ধারিত আচরণের কারণ হয়।
সাইমন ক্রিমার

এটা ঠিক ভুল। *dডি-রেফারেন্স পয়েন্টারটির অর্থ dযা একটি সিনট্যাক্স ত্রুটি যেহেতু dকোনও পয়েন্টার নয়।
ফ্রাঙ্কলিন ইউ

0
str.append(10u,'d'); //appends character d 10 times

লক্ষ্য করুন যে আমি চরিত্রটি সংযোজন করতে চাইছি তার জন্য আমি 10u লিখে 10 লিখেছি না; যে কোনও সংখ্যার সাথে 10 প্রতিস্থাপন করুন।


0

আমি একটি সহজ উপায় খুঁজে পেয়েছি ... আমাকে ফ্লাইতে charতৈরি করা একটি স্ট্রিংয়ের সাথে যোগাযোগ করতে হবে। আমার প্রয়োজন char list;ছিল কারণ আমি ব্যবহারকারীকে একটি পছন্দ দিচ্ছিলাম এবং একটি switch()বিবৃতিতে সেই পছন্দটি ব্যবহার করছি ।

আমি কেবল অন্যটি যুক্ত করেছি std::string Slist;এবং নতুন স্ট্রিংটি অক্ষরটির সমান করে রেখেছি , "তালিকা" - এ, বি, সি বা শেষের ব্যবহারকারী এটি পছন্দ করুন:

char list;
std::string cmd, state[], Slist;
Slist = list; //set this string to the chosen char;
cmd = Slist + state[x] + "whatever";
system(cmd.c_str());

জটিলতা শীতল হতে পারে তবে সরলতা শীতল। এই প্রোগ্রামটিতে


0

সন্নিবেশ বিকল্পটি যোগ করুন, যেমনটি এখনও উল্লেখ করা হয়নি।

std::string str("Hello World");
char ch;

str.push_back(ch);  //ch is the character to be added
OR
str.append(sizeof(ch),ch);
OR
str.insert(str.length(),sizeof(ch),ch) //not mentioned above

-1

আপনি যদি পুশব্যাক ব্যবহার করছেন তবে স্ট্রিং কনস্ট্রাক্টরের জন্য কোনও কল নেই। অন্যথায় এটি ingালাইয়ের মাধ্যমে একটি স্ট্রিং অবজেক্ট তৈরি করবে, তারপরে এটি এই স্ট্রিংয়ের অক্ষরটিকে অন্য স্ট্রিংয়ের সাথে যুক্ত করবে। ক্ষুদ্র চরিত্রের জন্য খুব বেশি ঝামেলা;)


1
অপারেটর + = (চর গ); স্ট্রিং জন্য অতিরিক্ত বোঝা হয়। আসলে, স্ট্রিং কনস্ট্রাক্টর একটি চরিত্র গ্রহণ করে না, ব্রায়ান উত্তর দেখুন;)
আরাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.