2009-11-20 13 views
5
में एक स्ट्रिंग

आम तौर पर आप इस तरह सी में एक स्ट्रिंग मुद्रित कर सकते हैं ..स्वरूप सी

printf("No record with name %s found\n", inputString); 

लेकिन मैं इसे से बाहर एक स्ट्रिंग बनाना चाहते थे, मैं इसे कैसे कर सकता है? मैं कुछ इस तरह रहा हूँ ..

char *str = ("No record with name %s found\n", inputString); 

मुझे आशा है कि यह स्पष्ट है कि मैं के लिए क्या देख रहा हूँ है ...

+3

खुद पर एक एहसान करो और Kernigham और रिची द्वारा खरीद "सी प्रोग्रामिंग भाषा" जाना मिल जाएगा हूँ। – Pete

+1

धन्यवाद पीट, मैं करूँगा। – itsaboutcode

+0

http://www.eskimo.com/~scs/cclass/cclass.html –

उत्तर

31

एक विकल्प sprintf, जो सिर्फ printf तरह काम करता है का उपयोग करने के होगा, लेकिन के रूप में लेता है इसकी पहले पैरामीटर को बफर में एक पॉइंटर जिसमें इसे परिणामी स्ट्रिंग रखना चाहिए।

snprintf का उपयोग करना बेहतर है, जो बफर ओवररन्स को रोकने के लिए बफर की लंबाई वाले अतिरिक्त पैरामीटर लेता है। उदाहरण के लिए:

char buffer[1024]; 
snprintf(buffer, 1024, "No record with name %s found\n", inputString); 
3

sprintf में देखें (नीचे देखें)।

int n = sprintf(str, "No record with name %s found\n", inputString); 
3

उपयोग

sprintf(str, "No record with name %s found\n", inputString); 
10

आप कार्यों की sprintf परिवार के लिए देख रहे हैं। उनके सामान्य प्रारूप है:

char output[80]; 
sprintf(output, "No record with name %s found\n", inputString); 

हालांकि, sprintf अपने आप में अत्यंत खतरनाक है। यह बफर ओवररन्स नामक चीज़ के लिए प्रवण है। इसका अर्थ यह है कि स्प्रिंटफ को यह नहीं पता कि output स्ट्रिंग जो आप प्रदान करते हैं, वह कितनी बड़ी है, इसलिए यह स्वेच्छा से उपलब्ध होने से अधिक डेटा लिखेगा। उदाहरण के लिए, इस सफाई से संकलन होगा, लेकिन वैध स्मृति — के ऊपर लिख देगा और वहाँ sprintf पता है कि यह कुछ भी गलत कर रहा है यह बताने के लिए कोई रास्ता नहीं है:

char output[10]; 
sprintf(output, "%s", "This string is too long"); 

समाधान snprintf के रूप में एक समारोह है, जो लंबाई लेता है उपयोग करने के लिए है पैरामीटर:

char output[10]; 
snprintf(output, sizeof output, "%s", "This string is too long, but will be truncated"); 

या, यदि आप एक विंडोज सिस्टम पर कर रहे हैं, _sntprintf वेरिएंट और दोस्तों, जो या तो इनपुट या आउटपुट तार की उमड़ती के खिलाफ की रक्षा का उपयोग करें।

+3

जैसा कि यह एक होमवर्क प्रश्न है, मैं बस यह इंगित करना चाहता हूं कि 'आकार का आउटपुट' केवल 'char * में * तत्वों की संख्या देता है 'सरणी - सामान्य अभ्यास का उपयोग करना है: 'आकार का सरणी/आकार का सरणी [0]', जो विभिन्न प्रकार के आकार पर निर्भर किए बिना काम करता है। इसके अलावा, यह 'char' arrays के लिए भी काम करता है। :) –

+0

अच्छा बिंदु। यहां तक ​​कि, हालांकि, कुछ वास्तविक मामलों में असफल हो सकता है, जैसे किसी फ़ंक्शन में 'सरणी' को पार करना - किसी बिंदु पर, 'आकार का सरणी' किसी भी आधुनिक सिस्टम पर 4 या 8 है, चाहे तत्वों की संख्या और आकार उसमें।वास्तविक समाधान 'std :: vector' या कुछ समान उपयोग करना है और पूरी गड़बड़ी से पूरी तरह से बचाना है। –

7

चूंकि यह होमवर्क है (इसे टैग करने के लिए धन्यवाद) मैं आपको ...printf() फ़ंक्शन के परिवार पर बारीकी से देखने के लिए सुझाव दूंगा।

मुझे यकीन है कि आप समाधान :)

+3

ठीक है, ऐसा लगता है कि अन्य लोगों ने आपको खोज की खुशी से वंचित कर दिया है :) –

+1

+1 वैसे भी होमवर्क प्रश्न का सही उत्तर देने के लिए। –

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