2009-02-13 6 views
11
sscanf(input_str, "%5s", buf); //reads at max 5 characters from input_str to buf 

लेकिन मैं%% के बजाय MACRO_SIZEs की तरह कुछ का उपयोग करने की आवश्यकता है 5ssscanf में चर लंबाई लंबाई चौड़ाई निर्दिष्ट करने के लिए कैसे?

एक तुच्छ समाधान एक ही

char fmt_str[100] = "";  
snprintf(fmt_str, 100, "%%%ds", MACRO_SIZE); 
sscanf(input_str, fmt_str, buf); 

के लिए एक प्रारूप स्ट्रिंग बनाने के लिए है एक ही प्राप्त करने के लिए एक बेहतर तरीका है ?

उत्तर

8

अगर आपके MACRO_SIZE संकलन समय पर स्थिरांक है, तो आप इस कोशिश कर सकते हैं:

#define MACRO_SIZE "5" 
snprintf(fmt_str, 100, "%" MACRO_SIZE "s", buf); 
+0

बाधा इतनी अधिक नहीं है कि MACRO_SIZE स्थिर के रूप में मूल्यांकन करता है, लेकिन इसकी परिभाषा एक साधारण शाब्दिक है, है ना? उदाहरण के लिए, (5 * 25 + 3) की परिभाषा (जो संकलन समय पर निरंतर मूल्यांकन करती है) के परिणामस्वरूप 'snprintf (fmt_str, 100, "%" (5 * 25 + 3) "s", buf); ' – jhfrontz

9

तरह स्टीफन ने कहा, लेकिन sscanf() के लिए और अधिक ठीक से सवाल का जवाब देने, और थोड़ा और मैक्रो प्रवंचना के साथ:

#define MACRO_SIZE 5 

#define FORMAT(S) "%" #S "s" 
#define RESOLVE(S) FORMAT(S) 

char buf[MACRO_SIZE + 1]; 
sscanf(input_str, RESOLVE(MACRO_SIZE), buf); 

यह संकलन-समय पर आवश्यक स्वरूपण स्ट्रिंग बनाने के लिए सी के स्वचालित रूप से आसन्न स्ट्रिंग अक्षर के साथ जुड़ने का उपयोग करता है। यह केवल तभी काम करता है जब MACRO_SIZE प्रीप्रोसेसर मैक्रो है, न कि यह सामान्य रनटाइम चर है।

RESOLVE() के माध्यम से अतिरिक्त मैक्रो कॉल की जरूरत है के बाद से अन्यथा तर्क अपने #define घ मूल्य को हल नहीं किया जाएगा, और हम "%MACRO_SIZEs" के स्वरूपण स्ट्रिंग है, जो नहीं है हम क्या चाहते हैं के साथ पहुंचते हैं।

+0

यदि आप 'MACRO_SIZE' एक अभिव्यक्ति है (उदाहरण के लिए '(4 + 1)' या किसी अन्य मैक्रो (उदाहरण के लिए # # परिभाषित करें MACRO_SIZE (OTHER_MACRO - 1)') को संदर्भित करते हैं, तो क्या आप इसे काम करने की उम्मीद करेंगे? जब मैंने कोशिश की, तो 'gcc' -ई' पोस्ट-प्रीप्रोसेसर आउटपुट देखने के लिए, यह अंतिम मान तक विस्तार नहीं कर रहा था। – meowsqueak

+0

@meowsqueak नहीं, बेशक यह नहीं है क्योंकि यह एक ही स्ट्रिंग मानी जाने वाली आसन्न स्ट्रिंग अक्षर पर निर्भर करता है। 'MACRO_SIZE' एक संख्या होना चाहिए। – unwind

1

"सही" समाधान वह है जिसे आप तुच्छ कहते हैं। ये सभी चालाक मैक्रोज़ (मैं स्वयं एम 4 का उपयोग करता हूं) बस आपके कोड को कम प्रबंधनीय बनाने जा रहे हैं, यदि आपने इसे स्थिर के रूप में छोड़ा है।

आपके पास यहां की समस्या स्ट्रिंग्स सी में प्रथम श्रेणी डेटा संरचना नहीं है। वे बाइट्स की एक सरणी हैं। इसके लिए आपको वह सरणी बनाना है जिसे आप चाहते हैं कि आप प्राप्त करना चाहते हैं, और आप उस सरणी को sprintf के साथ बनाते हैं। यह सुंदर नहीं है, लेकिन यह सही है।

यदि आपके पास प्रदर्शन समस्याएं हैं और आपने इसे यहां ट्रैक किया है तो हाँ, फ़ंक्शन कॉल को खत्म करें। लेकिन जब तक MACRO_SIZE के मान को सौ बार दोहराया जाता है या एकाधिक फ़ाइलों में फैला नहीं जाता है, तो मैं केवल शाब्दिक को बदल दूंगा। स्प्रिंटफ़ वास्तव में आपको लचीलापन देता है, एक मैक्रो बस अधिक लचीलापन बना रहा है।

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