2012-03-28 18 views
8

के साथ स्ट्रिंग शाब्दिक समेकित करना मैं स्ट्रिंग अक्षर और चार शाब्दिक को जोड़ना चाहता हूं। वाक्य रचना गलत होने के नाते, "abc" 'd' "efg" एक संकलक त्रुटि renders:चार शाब्दिक

x.c:4:24: error: expected ',' or ';' before 'd'

अब तक मैं स्ट्रिंग के मूल्य शाब्दिक और चार शाब्दिक किया जा रहा है पता संकलन समय पर होने के बावजूद snprift (बेकार) का उपयोग करने के लिए है।

मैं

#define CONCAT(S,C) ({ \ 
    static const char *_r = { (S), (C) }; \ 
    _r; \ 
}) 

कोशिश की, लेकिन क्योंकि S की अशक्त टर्मिनेटर छीन नहीं है यह काम नहीं करता। (संकलक चेतावनी देने के अलावा।)

वहाँ एक रास्ता एक मैक्रो

  • "abc" MACRO('d') "efg" या
  • MACRO1(MACRO2("abc", 'd'), "efg") या
  • MACRO("abc", 'd', "efg") उपयोग करने के लिए लिखने के लिए है?

अगर कोई पूछता है कि मुझे ऐसा क्यों चाहिए: चार अक्षर एक लाइब्रेरी से आता है और मुझे स्ट्रिंग आउट को स्टेटस संदेश के रूप में प्रिंट करने की आवश्यकता है।

+0

मैं * * उपयोग sprintf या किसी क्रम कार्यों करना चाहते हैं नहीं करना चाहती। रनटाइम विधि कॉल को नियोजित करने वाले किसी भी उत्तर न दें। – kay

+0

यदि शाब्दिक पुस्तकालय से आता है, तो आप इसे कैसे एक्सेस कर रहे हैं? क्या यह लाइब्रेरी हेडर फ़ाइल द्वारा प्रदान किया गया एक मैक्रो है? –

+0

हां, यह एक हेडर फ़ाइल से आता है। – kay

उत्तर

2

सी आपको केवल स्ट्रिंग अक्षर को संयोजित करने देगा। दरअसल, snprintf() के साथ कुछ भी गलत नहीं है। तुम भी strcpy() इस्तेमाल कर सकते हैं:

strcpy(dest, str1); 
dest[strlen(dest)] = c; 
strcpy(dest + strlen(dest) + 1, str2); 

तुम भी इस सीमा को पार करने के लिए एक विशाल switch बयान इस्तेमाल कर सकते हैं:

switch(c) { 
    case 'a': 
     puts("part1" "a" "part2"); 
     break; 
    case 'b': 
     puts("part1" "b" "part2"); 
     break; 

    /* ... */ 

    case 'z': 
     puts("part1" "z" "part2"); 
     break; 
} 

... लेकिन मैं किसी भी स्वामित्व का दावा नहीं करते हैं।

इसे छोटा करने के लिए, बस snprintf() के साथ चिपके रहें। समझाने यह वास्तव में होना करने के लिए के रूप में

#define SOME_DEF 'x' 

#define STR1(z) #z 
#define STR(z) STR1(z) 
#define JOIN(a,b,c) a STR(b) c 

int main(void) 
{ 
    const char *msg = JOIN("Something to do with ", SOME_DEF, "..."); 

    puts(msg); 

    return 0; 
} 

संदर्भ कि या उपयुक्त नहीं हो सकता दे सकते हैं, लेकिन जहाँ तक:

+0

बात यह है कि मैं * * snprintf या strcpy का उपयोग नहीं करना चाहता हूं। यह एक शुरुआती प्रश्न की तुलना में दार्शनिक प्रश्न का अधिक है ... – kay

+1

के: आह, मैं देखता हूं ... शुभकामनाएँ! ;) बीटीडब्ल्यू, 'printf ("part1% c part2 \ n", c) के साथ क्या गलत है; '? – Philip

+1

printf के साथ कुछ भी "गलत" नहीं है। मैं सिर्फ यह जानना चाहता था कि किसी भी रनटाइम गतिविधि को संकलित समय में पूरी स्ट्रिंग प्राप्त करना संभव था या नहीं। ऐसा मैक्रो होने की हिस्सेदारी पर कुछ भी नहीं है या नहीं। आप देखते हैं ... यह एक दार्शनिक सवाल है। ;) – kay

6

आप एकल उद्धरण इसके साथ शामिल किया जा रहा है रह सकते हैं, तो आप stringification इस्तेमाल कर सकते हैं इस तरह एक स्ट्रिंग शाब्दिक buitl, यह एकमात्र तरीका है जो रनटाइम पर स्वरूपण किए बिना दिमाग में आता है।

+0

क्यों जॉइन (ए, बी, सी) एसटीआर 1 (बी) सी जैसे कॉन्सटेनेशन में सीधे एसटीआर 1 का उपयोग नहीं करते? उप-मैक्रो एसटीआर() का उपयोग करने के बजाय? – Luciano

3

इसे आजमाएं। यह डबल मैक्रोज़ की सी मैक्रो चाल का उपयोग करता है ताकि मैक्रो तर्क को स्ट्रिंग होने से पहले विस्तार करने का मौका मिले।

#include <stdio.h> 

#define C d 
#define S "This is a string that contains the character " 
#define STR(s) #s 
#define XSTR(s) STR(s) 

const char* str = S XSTR(C); 

int main() 
{ 
    puts(str); 
    return 0; 
} 
3

मैं एक जीसीसी विशिष्ट समाधान है कि मैं बहुत ज्यादा पसंद नहीं है, के रूप में एक CONCAT nestedly उपयोग नहीं कर सकते के साथ आया था।

#include <stdio.h> 

#define CONCAT(S1,C,S2) ({      \ 
    static const struct __attribute__((packed)) { \ 
     char s1[sizeof(S1) - 1];     \ 
     char c;         \ 
     char s2[sizeof(S2)];      \ 
    } _r = { (S1), (C), (S2) };     \ 
    (const char *) &_r;       \ 
}) 

int main(void) { 
    puts(CONCAT ("abc", 'd', "efg")); 
    return 0; 
} 

http://ideone.com/lzEAn

+1

अच्छा विचार, लेकिन '-pedantic' विकल्प के साथ जीसीसी के साथ संकलन चेतावनी देता है "अनुक्रमित स्ट्रिंग स्थिरांक से प्रारंभ की गई सरणी" और "आईएसओ सी अभिव्यक्तियों के भीतर ब्रसेड-समूह को रोकता है"। –

संबंधित मुद्दे