সি ++ মাল্টলাইন স্ট্রিং আক্ষরিক


415

মাল্টি-লাইন প্লেইন-পাঠ্য, সি ++, à লা পার্লে ধ্রুব আক্ষরিক কোনও উপায় আছে কি? #includeকোনও ফাইল যুক্ত করার সাথে কিছু পার্সিং ট্রিক ? আমি একজনের কথা ভাবতে পারি না, তবে ছেলে, এটা ভাল লাগবে। আমি জানি এটি সি ++ 0x এ হবে।


1
সাধারণত আপনি স্ট্রিং লিটারেলগুলিকে কোডে এম্বেড করতে চান না। আই 18 এন এবং এল 10 এন এর জন্য স্ট্রিং লিটারালগুলিকে রান টাইমের সময় লোড হওয়া কনফিগারেশন ফাইলের মধ্যে রাখা ভাল।
মার্টিন ইয়র্ক

45
কোডগুলিতে স্ট্রিং লিটারেলগুলি যুক্ত করা কোনও সমস্যা নয় এমন যথেষ্ট ক্ষেত্রে রয়েছে: যদি স্ট্রিংটি ব্যবহারকারীর কাছে এটি উপস্থাপনের জন্য ব্যবহার না করা হয়; যেমন: এসকিউএল স্টেটমেন্ট, ফাইলের নাম, রেজিস্ট্রি কী নাম, কমান্ড লাইন কার্যকর করা হবে, ...
মিমি মিমি মিমি

2
@ মার্টিন: তবে এটি জানার জন্য এখনও দরকারী হতে পারে। উদাহরণস্বরূপ, জটিল রেজেেক্সগুলি ভেঙে ফেলার জন্য এটি করেছি।
বুজুম

উত্তর:


591

ভাল ধরণের. সহজতমটি কেবল এই সত্যটি ব্যবহার করা যে সংলগ্ন স্ট্রিং লিটারালগুলি সংকলক দ্বারা সংযুক্ত করা হয়েছে:

const char *text =
  "This text is pretty long, but will be "
  "concatenated into just a single string. "
  "The disadvantage is that you have to quote "
  "each part, and newlines must be literal as "
  "usual.";

ইন্ডেন্টেশনটি কোনও বিষয় নয়, যেহেতু এটি কোটের ভিতরে নেই।

আপনি এম্বেড করা নতুন লাইনটি এড়াতে যতক্ষণ যত্ন নেন ততক্ষণ আপনি এটিও করতে পারেন। এটি করতে ব্যর্থতা, আমার প্রথম উত্তরটির মতো, সংকলন করবে না:

কনস্ট চর * পাঠ্য 2 =
  "এখানে, অন্যদিকে, আমি পাগল হয়ে গেছি \
এবং সত্যিই আক্ষরিক কয়েকটি লাইন বিস্তৃত যাক, \
প্রতিটি লাইনের quot উদ্ধৃতি দিয়ে বিরক্ত না করে
বিষয়বস্তু। এটি কাজ করে, তবে আপনি ইনডেন্ট করতে পারবেন না ";

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


3
আমাকে অতীতে বলা হয়েছিল যে প্রথম বিকল্পটি বাস্তবায়ন পর্যন্ত হতে পারে, তবে আমি এখনও এমন একটি সংকলক খুঁজে পাইনি যা সেই বাক্য গঠনটিকে সম্মান দেয় না।
জেসন মক 22:48

28
@ জেসন: এটি অগত্যা প্রাক-সি 89 এর সংকলকগুলির একটি অংশ ছিল না, তবে এটি সি 89 এ সংজ্ঞায়িত হয়েছে এবং তাই এটি সর্বত্রই সমর্থিত।
জোনাথন লেফলার

4
এছাড়াও, আপনি যদি সত্যিই সি ++ 98 এর একাধিক লাইনে স্ট্রিংটি ফর্ম্যাট করতে চান তবে প্রতিটি উদ্ধৃত স্ট্রিং খণ্ডে টার্মিনেটিং স্পেসের জন্য \ n কেবলমাত্র বিকল্পের জন্য প্রতিস্থাপন করুন। সি ++ 11 কাঁচা আক্ষরিক এখনও আমার প্রিয়।
ইমসর

3
@ আনউইন্ড নোট করুন যে উত্স লাইনের শেষে থাকা নিউলাইনটি স্ট্রিংয়ের অংশ হিসাবে তৈরি করা হয়নি, এটি কেবল এড়িয়ে গেছে। আপনি যদি স্ট্রিংয়ের অংশ হিসাবে একটি নতুন লাইন চান, আপনার লাইনের শেষে \ n have হওয়া দরকার।
হাইড

2
মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিওতে বাজে বাগ আছে। আপনি যদি লাইনগুলির শেষে ব্যাকস্ল্যাশগুলি ব্যবহার করেন তবে এটি স্বয়ংক্রিয়ভাবে স্ট্রিংয়ের অভ্যন্তরে পাঠ্যকে সন্নিবেশ করায়।
পালোটা

406

সি ++ 11 এ আপনার কাঁচা স্ট্রিং আক্ষরিক রয়েছে। পাইথন এবং পার্ল এবং রুবির মতো শেল এবং স্ক্রিপ্ট ভাষায় এখানে-পাঠ্যের মতো বাছাই করুন।

const char * vogon_poem = R"V0G0N(
             O freddled gruntbuggly thy micturations are to me
                 As plured gabbleblochits on a lurgid bee.
              Groop, I implore thee my foonting turlingdromes.   
           And hooptiously drangle me with crinkly bindlewurdles,
Or I will rend thee in the gobberwarts with my blurlecruncheon, see if I don't.

                (by Prostetnic Vogon Jeltz; see p. 56/57)
)V0G0N";

স্ট্রিংয়ের সমস্ত স্পেস এবং ইন্ডেন্টেশন এবং নতুন লাইনগুলি সংরক্ষিত আছে।

এগুলি utf-8 | 16 | 32 বা wchar_t (সাধারণ উপসর্গ সহ )ও হতে পারে।

আমার উল্লেখ করা উচিত যে পালানোর ক্রম, ভি0জি0 এন, এখানে আসলে প্রয়োজন নেই। এর উপস্থিতিটি "স্ট্রিংয়ের ভিতরে রাখার অনুমতি দেয় other অন্য কথায়, আমি রাখতে পারি

                "(by Prostetnic Vogon Jeltz; see p. 56/57)"

(অতিরিক্ত উদ্ধৃতি নোট করুন) এবং উপরের স্ট্রিংটি এখনও সঠিক হবে। অন্যথায় আমি ঠিক পাশাপাশি ব্যবহার করতে পারে

const char * vogon_poem = R"( ... )";

উদ্ধৃতিগুলির ভিতরে থাকা পেরেনগুলি এখনও প্রয়োজন।


23
এটি সত্যই আমি চাই, কোটস, ব্যাকস্ল্যাশ-এনএস, পালানো এবং এখনও নতুন পংক্তিগুলি আসল স্ট্রিংয়ে উপস্থিত হওয়ার ক্ষমতা। এটি এমবেডেড কোডের জন্য কার্যকর (যেমন শেডার বা লুয়া)। দুর্ভাগ্যক্রমে, আমরা সবাই এখনও সি ++ - 0 এক্স ব্যবহার করছি না। :-(
ম্লেপেজ

2
আমি এম্বেড করা এসকিউএল এবং পাইথন স্ক্রিপ্টগুলির জন্য এটি বিবেচনা করছিলাম। আমি আপনার জন্য আশা করছিলাম যদি জিসিসি এটি সি ++ 98 মোডে স্লাইড করতে দেয় তবে হায়, না।
এমএসআর

3
আমি ঝনঝন এবং জিসিসিতে বেশি অভ্যস্ত। এই সংকলকগুলিতে আপনাকে সি ++ 0x বা সি ++ 11 এর জন্য একটি পতাকা নির্ধারণ করতে হবে। এমএস ওয়েবসাইটের দিকে তাকান দেখে মনে হচ্ছে তাদের কাছে এখনও কাঁচা আক্ষরিক অক্ষর নেই। আমি বুঝতে পেরেছি যে সি ++ বৈশিষ্ট্যগুলি বাস্তবায়িত হওয়ার সাথে সাথে এমএস আরও দ্রুত নতুন সংকলক আপডেটগুলি প্রকাশ করবে। সাম্প্রতিকতম রক্তক্ষরণ প্রান্তের জন্য ভিজুয়াল সি ++ সংকলক নভেম্বর 2012 সিটিপি [ মাইক্রোসফট /en-us/download/details.aspx?id=35515] দেখুন
এমএসআর

5
@ সেরেসট্যাক ব্যবহার করুন #if 0#endifকোডের ব্লকগুলি মন্তব্য করতে। বাসাও।
বোবোগো

1
ভোগনের কবিতা থেকে অনুপ্রাণিত!
থানা প্লামার

27

#define MULTILINE(...) #__VA_ARGS__
প্রথম বন্ধনীর মধ্যে সবকিছু গ্রহণ করে।
একক স্পেস দ্বারা যেকোন সংখ্যক পরপর শ্বেতস্পেস অক্ষরকে প্রতিস্থাপন করে।


1
আপনার \nযদি নতুন লাইনের প্রয়োজন হয় তবে আপনি যোগ করতে পারেন
সাইমন

লক্ষ্য করুন ` (and hence \ N ) is copied literally, but "` রূপান্তরিত হয় \"তাই। MULTILINE(1, "2" \3)উৎপাদনের "1, \"2\" \3"
আন্দ্রিয়াস Spindler

@ অ্যান্ড্রেসস্পিন্ডার কোটস এবং ব্যাকস্ল্যাশগুলি একইভাবে (অতিরিক্ত) ব্যাকস্ল্যাশগুলি এড়ানো যায় যতক্ষণ না তারা স্ট্রিং বা চরিত্রের আক্ষরিক টোকনের অভ্যন্তরে উপস্থিত হয়। আপনার বক্তব্য কি নিশ্চিত না। তুলনামূলক তুলনামূলক উদ্ধৃতি (ডাবল বা একক) থাকা অবৈধ, সুতরাং সংকোচনগুলি কার্যকর হয় না বা সেগুলির একটি বিজোড় সংখ্যা যাই হোক না কেন এটি সম্ভবত সবচেয়ে বড় ক্ষতি। যাইহোক +1। "রিয়েল প্রোগ্রামাররা" সর্বদা জোড়ায় সংকোচনের ব্যবহার করে যাতে কোনও হস্তক্ষেপে নতুন লাইন থাকে না তাই একক উদ্ধৃতি ব্যালেন্স।
পোটোসওয়টার

মুল বক্তব্যটি হ'ল তিনি লিখেছিলেন "প্রথম বন্ধনীর মধ্যে সবকিছু গ্রাস করে"।
Andreas Spindler

25

মাল্টি-লাইন স্ট্রিংগুলিতে প্রবেশের সম্ভবত একটি সুবিধাজনক উপায় হ'ল ম্যাক্রো ব্যবহার করে। এটি কেবল তখনই কাজ করে যদি উদ্ধৃতিগুলি এবং প্রথম বন্ধনীগুলি ভারসাম্যপূর্ণ হয় এবং এতে 'শীর্ষ স্তর' কমা থাকে না:

#define MULTI_LINE_STRING(a) #a
const char *text = MULTI_LINE_STRING(
  Using this trick(,) you don't need to use quotes.
  Though newlines and     multiple     white   spaces
  will be replaced by a single whitespace.
);
printf("[[%s]]\n",text);

জিসিসি 4.6 বা জি ++ 4.6 দিয়ে সংকলিত, এটি উত্পাদন করে: [[Using this trick(,) you don't need to use quotes. Though newlines and multiple white spaces will be replaced by a single whitespace.]]

নোট করুন যে ,স্ট্রিংটিতে থাকতে পারে না, যদি না এটি প্রথম বন্ধনী বা কোটসের মধ্যে থাকে। একক উদ্ধৃতি সম্ভব, তবে সংকলক সতর্কতা তৈরি করে।

সম্পাদনা: মন্তব্যে উল্লিখিত হিসাবে, #define MULTI_LINE_STRING(...) #__VA_ARGS__এর ব্যবহারের অনুমতি দেয় ,


যে প্রকল্পে আমি সি ++ তে কিছু লুয়া কোড স্নিপেটগুলি অন্তর্ভুক্ত করতে চেয়েছিলাম, আমি একটি ছোট অজগর স্ক্রিপ্ট লিখে শেষ করেছি, যার মধ্যে আমি মাল্টলাইন স্ট্রিংগুলিতে প্রবেশ করেছি এবং সেটিকে সি ++ উত্স ফাইল তৈরি করতে দিন।
বিসিএমপিঙ্ক

আমার জন্য উপযুক্ত, ইউনিট পরীক্ষার জন্য একটি কল্লা ফাইল থেকে একটি বিশাল মাল্টি-লাইন ফ্লোট-তালিকার স্ট্রিং যুক্ত করুন। আমি কোথাও কোট রাখার কল্পনা করিনি, আমার একটি অনুলিপি এবং পেস্ট সমাধান দরকার।
সোলিন্ট গ্রাহাম

7
#define MULTILINE(...) #__VA_ARGS__আপনার স্ট্রিংটিতে কমা থাকতে চাইলে আপনি ব্যবহার করতে পারেন ।
সাইমন

2
নোট করুন এটি বেশিরভাগ অতিরিক্ত হোয়াইটস্পেস (সমস্ত \nএবং সহ \r) কেড়ে নেবে , যা কিছু ক্ষেত্রে কার্যকর এবং অন্যের জন্য মারাত্মক।
বিসিএস 21

17

আপনি এটি করতে পারেন:

const char *longString = R""""(
This is 
a very 
long 
string
)"""";

2
ধন্যবাদ, এটি দুর্দান্ত, সিতেও char longString[] = R""""( This is a very long string )""""; কাজ করে স্পষ্টতই, আমার পক্ষেও কাজ করে।
struggling_learner

2
এটি কি নতুন লাইনের সাথে স্ট্রিংটি শুরু এবং শেষ করে?
টিম এমবি

1
এটি একটি কাঁচা স্ট্রিং আক্ষরিক । সি ++ 11 থেকে পাওয়া যায়।
মিকোলাসন

15

আপনি কেবল এটি করতে পারেন:

const char *text = "This is my string it is "
     "very long";

@ আনওয়াইন্ডের উত্তরের চেয়ে এটি কীভাবে আলাদা?
সিসির

1
@ সিসির আমি এটি উন্মুক্ত করার 2 মিনিট আগে পোস্ট করেছি posted
এরিক

সেই অংশটি হারিয়ে যাওয়ার জন্য ক্ষমা চাইছি। আমার +1
সিসির

10

যেহেতু এক আউন্স অভিজ্ঞতার মূল্য এক টন তত্ত্বের, তাই আমি এর জন্য একটু পরীক্ষার প্রোগ্রাম চেষ্টা করেছি MULTILINE:

#define MULTILINE(...) #__VA_ARGS__

const char *mstr[] =
{
    MULTILINE(1, 2, 3),       // "1, 2, 3"
    MULTILINE(1,2,3),         // "1,2,3"
    MULTILINE(1 , 2 , 3),     // "1 , 2 , 3"
    MULTILINE( 1 , 2 , 3 ),   // "1 , 2 , 3"
    MULTILINE((1,  2,  3)),   // "(1,  2,  3)"
    MULTILINE(1
              2
              3),             // "1 2 3"
    MULTILINE(1\n2\n3\n),     // "1\n2\n3\n"
    MULTILINE(1\n
              2\n
              3\n),           // "1\n 2\n 3\n"
    MULTILINE(1, "2" \3)      // "1, \"2\" \3"
};

cpp -P -std=c++11 filenameপুনরুত্পাদন সঙ্গে এই টুকরা কম্পাইল ।

পেছনের কৌশলটি #__VA_ARGS__হ'ল __VA_ARGS__কমা বিভাজকটি প্রক্রিয়া করে না। সুতরাং আপনি এটি স্ট্রিংাইজিং অপারেটরে পাস করতে পারেন। শীর্ষস্থানীয় এবং পিছনের স্থানগুলি ছাঁটাই করা হয়, এবং শব্দের মধ্যে স্পেসগুলি (নতুন লাইনগুলি সহ) তখন একটি একক জায়গায় সংকুচিত করা হয়। প্যারেন্টিগুলি ভারসাম্যপূর্ণ হওয়া দরকার। আমি মনে করি এই ত্রুটিগুলি ব্যাখ্যা করে যে কেন সি ++ 11 এর ডিজাইনাররা #__VA_ARGS__কাঁচা স্ট্রিংয়ের আক্ষরিক প্রয়োজন দেখেছিল।


9

@ আনওয়াইন্ডের উত্তরে @ এমএমএসের মন্তব্যে কিছুটা ব্যাখ্যা করার জন্য, যদি কারও কাছে সি ++ 11 সংকলক (জিসিসি 4.2.1 বলুন) ভাগ্যবান না হয় এবং কেউ স্ট্রিংয়ে নতুন লাইনগুলি এম্বেড করতে চায় (হয় চর *) বা ক্লাস স্ট্রিং), কেউ এর মতো কিছু লিখতে পারেন:

const char *text =
  "This text is pretty long, but will be\n"
  "concatenated into just a single string.\n"
  "The disadvantage is that you have to quote\n"
  "each part, and newlines must be literal as\n"
  "usual.";

খুব সুস্পষ্ট, সত্য, তবে আমি যখন প্রথমবার পড়ছি তখন @ এমসারের সংক্ষিপ্ত মন্তব্যটি আমার দিকে ঝাঁপ দেয়নি, তাই আমাকে নিজের জন্য এটি আবিষ্কার করতে হয়েছিল। আশা করি, আমি কয়েক মিনিট অন্য কাউকে সংরক্ষণ করেছি।


-1
// C++11. 
std::string index_html=R"html(
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VIPSDK MONITOR</title>
    <meta http-equiv="refresh" content="10">
</head>
<style type="text/css">
</style>
</html>
)html";

দয়া করে আপনার উত্তরে একটি ব্যাখ্যা যুক্ত করুন এবং কেবল কোড স্নিপেটগুলি নয়
জর্ডি

-1

বিকল্প 1. বুস্ট লাইব্রেরি ব্যবহার করে, আপনি নীচের হিসাবে স্ট্রিং ঘোষণা করতে পারেন

const boost::string_view helpText = "This is very long help text.\n"
      "Also more text is here\n"
      "And here\n"

// Pass help text here
setHelpText(helpText);

বিকল্প 2। যদি আপনার প্রকল্পে বুস্ট না পাওয়া যায় তবে আপনি আধুনিক সি ++ তে স্টাড :: স্ট্রিং_ভিউ () ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.