2013-05-05 5 views
5

strcpy(3) (और strncpy(3)) क्यों अपना पहला तर्क देता है? मैं नहीं देखता कि यह कैसे कोई मूल्य जोड़ता है। इसके बजाए, अक्सर मैं प्रतिलिपि बनाई गई बाइट्स की संख्या लेता हूं।सी: स्ट्रैपी क्यों अपना तर्क वापस कर देता है?

परिशिष्ट: मुझे परिणामस्वरूप स्ट्रिंग की लंबाई की आवश्यकता होने पर मुझे क्या करना चाहिए? क्या मुझे वास्तव में अपना खुद का संस्करण लागू करना है?

+2

ताकि यह फ़ंक्शन चेनिंग में उपयोग किया जा सके। –

+1

स्ट्रिंग के अंत में 'strcpy()' के एक प्रकार को '' '0' बाइट में एक सूचक वापस लौटाया गया तो यह और अधिक उपयोगी होगा। हालांकि, अगर आप अपनी प्रतिलिपि बनाने के पहले सबकुछ जांचते हैं (जैसा कि आपको सुरक्षित होना चाहिए), तो आप 'strcpy() '(या शायद' memcpy()') का उपयोग 'strcpy()' के बजाय कर सकते हैं। यह केवल तब होता है जब आपके पास लंबाई उपलब्ध नहीं होती है जो उन का उपयोग नहीं कर सकती है, लेकिन अगर आप स्रोत स्ट्रिंग और लक्ष्य बफर की लंबाई नहीं जानते हैं तो प्रतिलिपि करना सुरक्षित नहीं है। –

उत्तर

1

तो तुम ऐतिहासिक कारणों की तरह

char * str = strcpy(malloc(12), "MyNewString"); 
+5

... जिसका खतरा किसी भी व्यक्ति से बच नहीं पाएगा जिसने इस उत्तर का संस्करण '11' के साथ देखा था, जहां अब' 12' है। –

+0

क्यों स्ट्रड का उपयोग न करें? या वह उस समय गायब था? – sashoalm

+1

'strdup', मुझे लगता है, 1 9 80 के दशक के अलावा, जब सी पहले से ही बोलीभाषाओं में अलग हो गया था। यह वी 7 यूनिक्स में नहीं था, यह अभी भी आईएसओ सी में नहीं है, भले ही POSIX हमेशा यह था। –

2

कुछ कर सकते हैं कि। strcpy और दोस्तों जल्दी सत्तर के दशक के पहले की तारीख, और मैं वापसी मान लिए करना उपयोग के मामले लगता चेनिंग का एक प्रकार होगा:

// copy src into buf1 and buf2 in a single expression 
strcpy(buf1, strcpy(buf2, src)); 

या

char *temp = xmalloc(strlen(const_str) + 1); 
function_that_takes_mutable_str(strcpy(temp, const_str)); 
+0

क्या उस समय उनके पास अल्पविराम अभिव्यक्ति नहीं थी? 'function1 ((strcpy (buf1, const_str), buf1)) '। –

+1

@ जोसो: मुझे यकीन नहीं है कि अल्पविराम अभिव्यक्तियों को कब पेश किया गया था, लेकिन मैंने काफी पुराने सी कोड पढ़े हैं और मुझे नहीं लगता कि मैंने इसे कभी भी इस्तेमाल किया है। मैक्रोज़ को छोड़कर मैं व्यक्तिगत रूप से इसका कभी भी उपयोग नहीं करता हूं। –

0

में स्ट्रिंग कार्यों के अधिकांश सी पुस्तकालय शौकिया द्वारा डिजाइन किया गया है। उदाहरण के लिए, मेरे करियर के अपने 25 वर्षों में, मैंने स्ट्रैट() फ़ंक्शन का कभी भी उपयोग नहीं किया, फिर भी मैं हर समय तारों को जोड़ता हूं। साथ ही, यदि आप printf() सोचते हैं, तो यदि आप% s तर्क के लिए NULL पास करते हैं तो बहुत कम प्रलेखन होता है। % C के लिए एक '\ 0', या एक malloc (0) गुजरने के लिए भी यही है।

अफसोस की बात है, सबसे उपयोगी strcpy() गंतव्य बफर के अंत में चेन प्रतिलिपि के अंत में एक सूचक वापस कर देना चाहिए।

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