সি / অবজেক্টিভ-সি এর একাধিক লাইনে স্ট্রিং আক্ষরিককে কীভাবে ভাগ করবেন?


319

আমার একটি দীর্ঘ দীর্ঘ স্ক্লাইট কোয়েরি রয়েছে:

const char *sql_query = "SELECT statuses.word_id FROM lang1_words, statuses WHERE statuses.word_id = lang1_words.word_id ORDER BY lang1_words.word ASC";

এটি পড়া সহজ করার জন্য আমি কীভাবে এটি বেশ কয়েকটি লাইনে ভাঙতে পারি? আমি যদি নিম্নলিখিতটি করি:

const char *sql_query = "SELECT word_id
                        FROM table1, table2
                        WHERE table2.word_id = table1.word_id
                        ORDER BY table1.word ASC";

আমি একটি ত্রুটি পাচ্ছি।

একাধিক লাইনে কোয়েরি লেখার কোনও উপায় আছে কি?

উত্তর:


568

একাধিক লাইনের উপর স্ট্রিং বিভক্ত করার দুটি উপায় রয়েছে:

ব্যবহার \

সি এর সমস্ত লাইনকে multiple ব্যবহার করে একাধিক লাইনে বিভক্ত করা যেতে পারে \

সমতল সি:

char *my_string = "Line 1 \
                   Line 2";

উদ্দেশ্য গ:

NSString *my_string = @"Line1 \
                        Line2";

আরও ভাল পদ্ধতির

একটি আরও ভাল পন্থা রয়েছে যা কেবল স্ট্রিংয়ের জন্য কাজ করে।

সমতল সি:

char *my_string = "Line 1 "
                  "Line 2";

উদ্দেশ্য গ:

NSString *my_string = @"Line1 "
                       "Line2";    // the second @ is optional

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

দ্রষ্টব্য: একটি # নির্দিষ্ট সঙ্গে, দুটি স্ট্রিং সংহত করতে আপনাকে একটি অতিরিক্ত '\' যুক্ত করতে হবে:

সমতল সি:

#define kMyString "Line 1"\
                  "Line 2"

22
এগুলি উভয়ই ইন এবং সি এবং সি ++ এর মতোই। পরবর্তী সমাধানটি অগ্রাধিকার দেওয়া হয় কারণ প্রাক্তন ব্যক্তি প্রোগ্রামে প্রচুর অকেজো সাদা স্থান এম্বেড করে যা ডিবি সার্ভারেও স্থানান্তরিত হবে।
Alnitak

আপনি আরও ভাল উদ্দেশ্য-সি উদাহরণে লাইন 2 এর শুরুতে একটি @ মিস করছেন।
লরেন্স জনস্টন

দ্বিতীয়টির theচ্ছিকতার ডকুমেন্টিংয়ের কোনও বিশদের সাথে কি আপনার একটি লিঙ্ক রয়েছে @?
সীমানা

@ হিথবর্ডারস: ঠিক এখানে নয়, আমি উত্তরটি লেখার সময় এটি সন্ধান করেছি।
জর্জি স্কলি

10
আরও ভাল পদ্ধতির আরেকটি সুবিধা হ'ল, আপনি প্রতিটি লাইনের পরে // মন্তব্য রাখতে পারেন।
ফিশিনিয়ার

110

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

#define QUOTE(...) #__VA_ARGS__
const char *sql_query = QUOTE(
    SELECT word_id
    FROM table1, table2
    WHERE table2.word_id = table1.word_id
    ORDER BY table1.word ASC
);

প্রিপ্রোসেসর এটিকে রূপান্তরিত করে:

const char *sql_query = "SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC";

আমি এই কৌশলটি ব্যবহার করেছি যখন আমি কিছু ইউনিট পরীক্ষা লিখছিলাম যখন বড় বড় আক্ষরিক স্ট্রিং ছিল জেএসওএন। এর অর্থ হ'ল আমাকে প্রতিটি উদ্ধৃতি চরিত্র escape "এড়িয়ে যেতে হবে না।"


5
পারফেক্ট! এখন আমাকে এটি আরও কয়েক শতাধিক উর্ধ্বতন দেওয়া দরকার, এবং এটি যেখানে রয়েছে সেটিই পেয়েছি ...
মাইক

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

+1 তবে রেকর্ডের জন্য I´m সংকলক (এমএসভিসি) বা সম্পাদক (QtCretor) এর সাথে সমস্যা হচ্ছে (পুনরায়) প্রকাশের পরিবর্তিত হওয়া উচিত তা সংকলন করে না। এটি যেমন পরিবর্তন সনাক্ত করা যায় না ... বিল্ডের পরিবর্তে পুনর্নির্মাণকে আঘাত করা কৌশলটি চালিত করে।
Andreas

তথ্যের এই চিকেন নাগেটের জন্য আপনাকে ধন্যবাদ। এটি অতিরিক্ত যাবতীয় আবর্জনা ছাড়াই আমার যা করতে হবে ঠিক তা করে।
ফিশগুই 876

অপূর্ব, তবে আপনি কি "\ n" এর কাজটি করতে পারেন?
Sapphire_Brick

24

আপনি এক্সকোডে -> পছন্দসমূহে যেতে পারেন, ইনডেন্টেশন ট্যাবটি নির্বাচন করুন এবং লাইন র্যাপিং চালু করতে পারেন।

এইভাবে, আপনাকে অতিরিক্ত কোনও কিছুই টাইপ করতে হবে না এবং এটি আপনার ইতিমধ্যে লেখা স্টাফগুলির জন্য কাজ করবে। :-)

একটি বিরক্তিকর জিনিস যদিও ...

if (you're long on indentation
    && short on windows) {
            then your code will
                end up squished
                     against th
                         e side
                             li
                              k
                              e

                              t
                              h
                              i
                              s
}

2
@ ইয়োইওয়োনি আমি সম্মত, তবে আমি এটিরও প্রশংসা করি। এটি আমাকে আঘাত করে যে এই মন্তব্যটি কোনও মন্তব্য হিসাবে সত্যই সম্ভব ছিল না, সুতরাং উত্তর ফর্ম্যাটটি ব্যবহার করুন। এটি এস / ও এর সীমাবদ্ধতার মতো বলে মনে হচ্ছে যে আপনি বিশেষত সমৃদ্ধ মন্তব্য লিখতে পারবেন না (যতদূর আমি অবগত রয়েছি)।
ম্যাক্স ভন হিপ্পেল

24

আমার সর্বদা এই সমস্যাটি রয়েছে, তাই আমি পাঠানোটিকে একটি পালিয়ে যাওয়া বহু-লাইন উদ্দেশ্য-সি স্ট্রিংয়ে রূপান্তর করতে একটি ছোট সরঞ্জাম তৈরি করেছি:

http://multilineobjc.herokuapp.com/

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।


1
দুর্দান্ত সরঞ্জাম! প্রশ্ন: তুমি '|' থেকে পালাবে কেন?
justadreamer

ভাল যুক্তি. আমি এটিকে পরিবর্তন করে আর পালাতে পারি না "|" আমাকে জানতে দেওয়ার জন্য ধন্যবাদ।
ফ্ল্যাভিউ

আমারও একই ধারণা ছিল। ইচ্ছে করে আমি এই প্রথম দেখতে পেতাম। : আমার টুল nsstringify.nateflink.com
Nate Flink

1
ধন্যবাদ, আমাকে অনেক সময় বাঁচিয়েছে!
djskinner


18

উদ্দেশ্য-সি এর জন্য উদ্ধৃতি ধারণা বাড়ানো :

#define NSStringMultiline(...) [[NSString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding]

NSString *sql = NSStringMultiline(
    SELECT name, age
    FROM users
    WHERE loggedin = true
);

3
#define NSStringMultiline(...) @#__VA_ARGS__খুব কাজ করা উচিত।
নিকোলাস ডেলি

পরিবর্তনীয় স্ট্রিংয়ের জন্য: #define NSStringMultiline(...) [[NSMutableString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding]
রিমস্কি

আমার জন্য, ফলাফলযুক্ত স্ট্রিংয়ে নতুন লাইন নেই।
রিমস্কি

পালানো নিউলাইনগুলি সঠিকভাবে ক্যাপচার করা হয় (যা প্রায় এত সুবিধাজনক বা সুন্দর নয়)।
রিমস্কি

@ রিমস্কি, এবং আমি মনে করি এটি #define NSStringMultiline(...) [@#__VA_ARGS__ mutableCopy]পরিবর্তনীয় স্ট্রিংয়ের জন্যও কাজ করে।
আইলিয়ান ওনোফ্রেই

5

গাদাটির জন্য আরও একটি সমাধান, আপনার .m ফাইলটিকে। মিমিতে পরিবর্তন করুন যাতে এটি উদ্দেশ্য-সি ++ হয়ে যায় এবং সি ++ কাঁচা আক্ষরিক ব্যবহার করুন, এটির মতো:

const char *sql_query = R"(SELECT word_id
                           FROM table1, table2
                           WHERE table2.word_id = table1.word_id
                           ORDER BY table1.word ASC)";

কাঁচা আক্ষরিক সমাপ্তি ক্রম পর্যন্ত সমস্ত কিছু উপেক্ষা করে, এটি ডিফল্ট ক্ষেত্রে বন্ধনী-উদ্ধৃতি।

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

const char *sql_query = R"T3RM!N8(
                                  SELECT word_id
                                  FROM table1, table2
                                  WHERE table2.word_id = table1.word_id
                                  ORDER BY table1.word ASC
                         )T3RM!N8";

আমিও পেয়েছি জিসিসি সি ল্যাঙ্গুয়েজ একটি এক্সটেনশান হিসাবে সি ++ কাঁচা স্ট্রিং লিটারেল যোগ করেছেন: stackoverflow.com/questions/797318/...
সিরো Santilli郝海东冠状病六四事件法轮功

3

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

NSString * query = @"SELECT * FROM foo "
                   @"WHERE "
                     @"bar = 42 "
                     @"AND baz = datetime() "
                   @"ORDER BY fizbit ASC";

2

জিসিসি সি এক্সটেনশান হিসাবে সি ++ মাল্টলাইন কাঁচা স্ট্রিং আক্ষরিক যোগ করে

সি ++ 11 তে উল্লিখিত হিসাবে কাঁচা স্ট্রিং লিটারাল রয়েছে: https://stackoverflow.com/a/44337236/895245

তবে, জিসিসি এগুলিকে সি এক্সটেনশান হিসাবে যুক্ত করে, আপনাকে কেবল -std=gnu99পরিবর্তে ব্যবহার করতে হবে -std=c99। উদাহরণ:

main.c

#include <assert.h>
#include <string.h>

int main(void) {
    assert(strcmp(R"(
a
b
)", "\na\nb\n") == 0);
}

সংকলন এবং চালান:

gcc -o main -pedantic -std=gnu99 -Wall -Wextra main.c
./main

এটি উদাহরণস্বরূপ সি কোডে মাল্টলাইন ইনলাইন সমাবেশ সন্নিবেশ করানোর জন্য ব্যবহার করা যেতে পারে: জিসিসি সি ++ এ মাল্টলাইন ইনলাইন সমাবেশ কোডটি কীভাবে লিখবেন?

এখন আপনাকে কেবল ফিরে যেতে হবে, এবং এটি সি 20 এক্সওয়াইয়ের মানক হওয়ার জন্য অপেক্ষা করুন।

সি ++ এ এখানে জিজ্ঞাসা করা হয়েছিল: সি ++ মাল্টলাইন স্ট্রিং আক্ষরিক

উবুন্টু 16.04, জিসিসি 6.4.0, বাইনুটিলেস 2.26.1 এ পরীক্ষিত।


0

বিকল্পটি হ'ল লাইন ব্রেকগুলি অপসারণের জন্য যে কোনও সরঞ্জাম ব্যবহার করা। আপনার লেখাটি কোনও পাঠ্য সম্পাদক ব্যবহার করে লিখুন, একবার শেষ হয়ে গেলে, আপনার পাঠ্যটি এখানে পেস্ট করুন এবং আবার কোডকোডে অনুলিপি করুন।


1
আসলেই কোনও দীর্ঘমেয়াদী সমাধান নয়। আপনাকে যদি পরে এটি আবার পরিবর্তন করতে হয় তবে কী হবে। বিরক্তিকর দ্রুত পান, ইতিমধ্যে উল্লিখিত মাল্টি লাইন টেকনিকগুলি ব্যবহার করা এবং এটি সরাসরি ফাইলে ফর্ম্যাট করা ভাল।
শোয়ার্জি 2478
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.