C / ऑब्जेक्टिव-सी में कई लाइनों में एक स्ट्रिंग शाब्दिक विभाजन कैसे करें?


320

मेरे पास बहुत लंबे समय तक चलने वाली क्वेरी है:

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

कई रेखाओं पर तार को विभाजित करने के दो तरीके हैं:

का उपयोग करना

C की सभी पंक्तियों को \ का उपयोग करके कई लाइनों में विभाजित किया जा सकता है।

सादा सी:

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

दूसरा दृष्टिकोण बेहतर है, क्योंकि इसमें बहुत सारे व्हाट्सएप शामिल नहीं हैं। हालाँकि, SQL क्वेरी के लिए दोनों संभव हैं।

नोट: एक #define के साथ, आपको दो तारों को जोड़ने के लिए एक अतिरिक्त '\' जोड़ना होगा:

सादा सी:

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

22
ये दोनों ही C और C ++ जैसे ही हैं। बाद वाला समाधान पसंद किया जाता है क्योंकि पूर्व में प्रोग्राम में बहुत सारे बेकार सफेद स्थान होते हैं जो डीबी सर्वर को भी प्रसारित किए जाएंगे।
अलनीतक

आप बेहतर उद्देश्य-सी उदाहरण में लाइन 2 की शुरुआत में एक @ को याद कर रहे हैं।
लॉरेंस जॉनसन

क्या आपके पास दूसरे की वैकल्पिकता का उल्लेख करने वाली एक युक्ति का लिंक है @?
हीथ बॉर्डर्स

@HeathBorders: यहाँ सही नहीं है, लेकिन जब मैंने उत्तर लिखा तो मैंने इसे देखा है।
जॉर्ज शॉली

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";

मैंने इस ट्रिक का उपयोग किया है जब मैं कुछ यूनिट परीक्षण लिख रहा था जिसमें JSON युक्त बड़े शाब्दिक तार थे। इसका मतलब था कि मुझे हर बोली वर्ण से बचने की जरूरत नहीं थी।


5
उत्तम! अब मुझे बस इसे कुछ और सौगातें देने की जरूरत है, और इसे वह स्थान प्राप्त करें, जहाँ ...
माइक

मैं उसी तरह से प्रतिक्रिया दे रहा था, लेकिन यह मुद्दों के बिना नहीं है। मैंने सिर्फ एक विशेष यूनिकोड चरित्र के साथ इस तरह से एक हेरेडोक करने की कोशिश की और गैर-एएससीआईआई पात्रों को शाब्दिक रूप से बाहर अनुमति नहीं दी गई।
दर्शन

+1 लेकिन रिकॉर्ड के लिए मुझे संकलक (MSVC) या संपादक (QtCreator) के साथ परेशानी हो रही है (पुनः) अभिव्यक्ति को संकलित नहीं करना चाहिए क्योंकि यह परिवर्तन पर होना चाहिए। ऐसा लगता है कि परिवर्तन का पता नहीं चला है ... बिल्ड के बजाय हिटिंग रिबिल्ट ट्रिक करता है।
एंड्रियास

जानकारी के इस चिकन नगेट के लिए धन्यवाद। यह वही करता है जो मुझे सभी अतिरिक्त कचरे के बिना करने की आवश्यकता थी।
FishGuy876

यदि आपके पास स्ट्रिंग में शाब्दिक उद्धरण चिह्न हैं, तो यह दुर्भाग्य से काम नहीं करता है। ठीक है, यह इस तरह का काम करता है, जिसमें यह एक चेतावनी उत्पन्न करता है। लेकिन मेरा कोडबेस है -वेरर ...
अनिलरेडशिफ्ट

24

आप XCode में भी जा सकते हैं -> प्राथमिकताएं, इंडेंटेशन टैब चुनें, और लाइन रैपिंग चालू करें।

इस तरह, आपको अतिरिक्त कुछ भी लिखना नहीं पड़ेगा, और यह आपके द्वारा पहले से लिखे सामान के लिए काम करेगा। :-)

हालांकि एक कष्टप्रद बात यह है ...

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
@YoYoYonnY मैं सहमत हूं, लेकिन मैं इसकी सराहना भी करता हूं। यह मुझे बताता है कि यह टिप्पणी वास्तव में एक टिप्पणी के रूप में संभव नहीं होगी, इसलिए उत्तर प्रारूप का उपयोग। यह एस / ओ की एक सीमा की तरह लगता है, कि आप विशेष रूप से समृद्ध टिप्पणी नहीं लिख सकते हैं (जहां तक ​​मुझे पता है)।
मैक्स वॉन हिप्पल

24

मुझे हर समय यह समस्या रहती है, इसलिए मैंने पाठ को एक बची हुई बहु-पंक्ति उद्देश्य-सी स्ट्रिंग में बदलने के लिए एक छोटा सा उपकरण बनाया:

http://multilineobjc.herokuapp.com/

आशा है कि यह आपको कुछ समय बचाता है।


1
महान उपकरण! सवाल: आप क्यों बचते हैं '|'
जस्टड्रीमर

अच्छी बात। मैंने इसे बदलकर अब बच नहीं पाया "" | मुझे बताने के लिए धन्यवाद।
Flaviu

मेरा भी यही विचार था। काश मैंने इसे पहले देखा होता। मेरा उपकरण है: nsstringify.nateflink.com
नैट फ्लिंक

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]
म्यूट

मेरे लिए, जिसके परिणामस्वरूप स्ट्रिंग में नई लाइनें नहीं हैं।
रिमस्की

बची हुई नई सुर्खियों को सही ढंग से पकड़ लिया जाता है (जो लगभग इतना सुविधाजनक या अच्छा नहीं है)।
रिमस्की

@rimsky, और मुझे लगता है कि #define NSStringMultiline(...) [@#__VA_ARGS__ mutableCopy]यह भी म्यूटेंट स्ट्रिंग्स के लिए काम करता है।
इयूलियन ओनोफ्रेई

5

ढेर के लिए एक और उपाय, अपनी .m फ़ाइल को .mm में बदलें ताकि वह Objective-C ++ बन जाए और C ++ कच्चे लीटरों का उपयोग करें, जैसे:

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";

मैंने यह भी पाया है कि GCC C ++ कच्चे स्ट्रिंग
शाब्दिकों


2

जीसीसी सी एक्सटेंशन के रूप में C ++ मल्टीलाइन कच्चे स्ट्रिंग शाब्दिक जोड़ता है

C ++ 11 में कच्चे स्ट्रिंग के रूप में उल्लिखित हैं: https://stackoverflow.com/a/44337236/895245

हालांकि, GCC उन्हें C एक्सटेंशन के रूप में भी जोड़ता है, आपको बस -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

इसका उपयोग उदाहरण के लिए C कोड में मल्टीलाइन इनलाइन असेंबली डालने के लिए किया जा सकता है: GCC + ++ में मल्टीलाइन इनलाइन असेंबली कोड कैसे लिखें?

अब आपको बस वापस रखना है, और इसके लिए C20XY पर मानकीकृत होने की प्रतीक्षा करनी है।

C ++ में पूछा गया था: C ++ मल्टीलाइन स्ट्रिंग शाब्दिक

उबंटू 16.04, जीसीसी 6.4.0, बिनुटिल्स 2.26.1 पर परीक्षण किया गया।


0

एक विकल्प लाइन ब्रेक को हटाने के लिए किसी भी उपकरण का उपयोग करना है। किसी भी पाठ संपादक का उपयोग करके अपनी स्ट्रिंग लिखें, एक बार समाप्त होने के बाद, अपने पाठ को यहां पेस्ट करें और इसे फिर से xcode में कॉपी करें।


1
वास्तव में कोई दीर्घकालिक समाधान नहीं है। क्या होगा अगर आपको इसे बाद में फिर से बदलना पड़े। पहले से बताई गई मल्टी लाइन तकनीकी का उपयोग करने के लिए तेजी से परेशान करना, सीधे फाइल में सीधे प्रारूपित करना बेहतर है।
श्वार्ज़ि २४ Feb24
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.