2009-06-04 5 views
6

सुराग शीर्षक में है लेकिन मूल रूप से मुझे कुछ कोड विरासत में मिला है जिसमें 800+ उदाहरण हैं। मैं एक नया फ़ंक्शन लिखना चाहता हूं और फिर strcpy_mine के साथ strcpy को प्रतिस्थापित करना चाहता हूं।strcpy ... strcpy_mine के साथ प्रतिस्थापित करना चाहते हैं जो strncpy और null को समाप्त कर देगा

तो मैं यह निर्धारित करने की कोशिश कर रहा हूं कि कौन सी पैरामीटर सूची strcpy_mine होगी।

मैंने कोशिश की:

void strcpy_mine(char* pTarget, const char* const pCopyMe) 
{ 
    const unsigned int lenAlwaysFour = sizeof(pCopyMe); //:(
    strncpy(pTarget, pCopyMe, lenAlwaysFour); 

    //add extra terminator in case of overrun 
    pTarget[lenAlwaysFour] = 0; 
} 

लेकिन sizeof हमेशा 4 pCopyMe एक सूचक

मुझे क्या करना नहीं चाहते

strncpy (buf, pCopyMe, sizeof(pCopyMe)); buf[sizeof(pCopyMe)] = 0; 
साथ

strcpy (buf, pCopyMe); 

की जगह है है

कोई विचार? (Strcpy_l उपलब्ध नहीं है)

चियर्स

उत्तर

4

कैसे कॉल-साइटों, की तरह लग रहे अक्सर मामलों के बहुमत एक साधारण टेम्पलेट द्वारा नियंत्रित किया जा सकता है पर निर्भर करता है:

#include <string.h> 

template <int bufferSize> 
void strcpy_mine(char (&pTarget)[bufferSize], const char* const pCopyMe) 
{ 
    strncpy(pTarget, pCopyMe, bufferSize-1); 

    //add extra terminator in case of overrun 
    pTarget[bufferSize-1] = 0; 
} 

int main() 
{ 
    char buf[128]; 
    strcpy_mine(buf,"Testing"); 
    return 0; 
} 

आप माइक्रोसॉफ्ट विजुअल स्टूडियो 2005 या नए प्रयोग कर रहे हैं, एक Microsoft कार्यान्वयन के लिए Secure Template Overloads देखना ।

+0

चीयर्स!यह लगभग है जो मैं बाद में हूं, लेकिन यह अभी भी मुझे बफर के आकार को शेवरन्स में रखने के लिए मजबूर करता है हालांकि char buf [200]; strcpy_mine <200> (buf, pString); – timB33

+0

strCpyMine (buf, pString); – timB33

+0

फिर आप कुछ और गलत कर रहे हैं। अप्रचलित संकलक? – MSalters

11

sizeof() प्रकार के आकार देता है - इस मामले const char* const में जो 32-बिट मशीनों पर 4 हो जाएगा।

मुझे लगता है कि आपको लगता है कि आप strlen() चाहते हैं। लेकिन यह strncpy कार्यों का उपयोग करने का सही तरीका नहीं है। आपको स्ट्रिंग के लिए आउटपुट बफर के आकार की आवश्यकता है।

इसे ठीक करने के लिए आपको प्रत्येक कॉल साइट पर कोड की जांच करने और आउटपुट बफर के आकार को काम करने की आवश्यकता है, और इसे strcpy_mine पर तर्क के रूप में पास करना होगा। यदि स्ट्रैपी (या strcpy_mine) के लिए कॉल-साइट आउटपुट बफर के आकार को नहीं जानता है, तो आपको उस स्थान के लिए कोड में पीछे की ओर खोज करने की आवश्यकता है जो बफर आवंटित करता है, और आकार को सभी तरह से स्ट्रैपी साइट पर पास करता है ।

मूल रूप से आप स्ट्रैपी के प्रतिस्थापन में एक बूंद नहीं लिख सकते हैं जो समान तर्क लेता है और उन समस्याओं से बचने की आशा करता है जो पहले स्थान पर स्ट्रैन्पी उत्पन्न करते हैं (और इससे परे बेहतर प्रतिस्थापन)। आप एक ऐसा फ़ंक्शन बना सकते हैं जो strncpy के समान तर्क लेता है, लेकिन यह सुनिश्चित करता है कि परिणाम शून्य-समाप्त हो गया है - OpenBSD's strlcpy() फ़ंक्शन के कार्यान्वयन को देखें। लेकिन आउटपुट बफर आकार के ज्ञान को पास करने के लिए कॉलिंग साइटों को बदलने का पहला कदम होना चाहिए।

+0

strlcpy के लिए +1। इस तरह के अपने स्वयं के कार्य को लिखने में मैं ओवरफ्लो मामलों को संभालने के लिए फ़ंक्शन में एक enum {AllOrNothing, TruncateOkay} भी पास करता हूं। – Dolphin

1

आप अपने strcpy_mine के लिए strncpy के समान पैरामीटर सूची का उपयोग कर सकते हैं, लेकिन इसे लिखें ताकि यह हमेशा नतीजे को समाप्त कर दे। करना बहुत मुश्किल नहीं होना चाहिए।

हालांकि, एक चुनौती यह है कि आपके कुछ मौजूदा कोड जो strcpy() को कॉल करते हैं, वे बफर के आकार को नहीं जानते हैं।

+0

मैं यह दूसरा। आउटपुट बफर के आकार के लिए आपको एक और पैरामीटर जोड़ना होगा। स्ट्रैपी विधि बफर ओवरफ्लो त्रुटियों का क्लासिक स्रोत है। माइक्रोसॉफ्ट ने इस समारोह को strncpy जैसे कुछ के पक्ष में भी हटा दिया है। – Mark

0

इसके अलावा आप एकाधिक संपादन से बचने के लिए मैक्रोज़ का उपयोग कर सकते हैं। या कुछ स्क्रिप्ट के माध्यम से स्वचालित संपादन।

+0

यदि आप परवाह करते हैं, मैक्रो एकवचन है, मैक्रोज़ बहुवचन है। मैक्रोज़ एक शब्द नहीं है। मैं आपकी मूल भाषा में अंग्रेजी का अनुमान लगा रहा हूं। मैं केवल आपकी मदद करने की कोशिश कर रहा हूं। – jmucchiello

0

आपको निश्चित रूप से गंतव्य बफर के आकार में पैरामीटर के रूप में पास करने की आवश्यकता है, जैसा कि अन्य लोगों ने ऊपर कहा है।

इस तरह के विषय से हटकर है, लेकिन मैं सिर्फ बाहर बात करने के लिए, आप strncpy() उपयोग करने के बाद, आप बफर का अंतिम वर्ण, जो लंबाई से सूचकांक 1 कम है शून्य पर (निर्धारित करने की आवश्यकता चाहते हैं बफर की लंबाई नहीं):

:

strncpy (buf, pCopyMe, buflen); buf[buflen - 1] = '\0'; 

या वैकल्पिक रूप से, आप एक खाली स्ट्रिंग पर strncat() उपयोग कर सकते हैं, यह एक लंबाई वह यह है कि 1 कम से गुजर रहा है, और यह करने के लिए गारंटी देगा अपने स्ट्रिंग शून्य-समाप्त

buf[0] = '\0'; strncat (buf, pCopyMe, buflen - 1); 
+0

यदि आप वैसे भी हैं तो क्यों नहीं: strncpy (buf, pCopyMe, buflen) [buflen-1] = '\ 0'; :-) –

+0

@ एंडर्स: कूल !!! – jmucchiello

0

डगलस लीडर यह सही है। स्ट्रैपी को बदलने की उपयोगिता की एक सीमा है जबतक कि आप प्रत्येक उदाहरण पर एक अच्छी, सीन बफर लंबाई में गुजरने के कष्टप्रद काम करने को तैयार नहीं हैं। यह बहुत काम है!

अच्छी खबर यह है कि यह इसके लायक है! कुछ साल पहले, मैं कई सी ++ परियोजनाओं में आया था जो देर से, छोटी गाड़ी और अविश्वसनीय थे। स्ट्रैपी और स्ट्रेल वर्जित घोषित करके, और परियोजना के बाहर 2-3 दिन लेते हुए उन्हें कस्टम स्ट्रैन्की/स्ट्रनेल के साथ बदलने के लिए, इन सभी परियोजनाओं में हम अचानक घंटों के बजाय दिनों तक दौड़ सकते थे। हमने स्क्रीन डिस्प्ले और लॉग फाइलों पर बहुत सारे कटा हुआ स्ट्रिंग भी देखी हैं। इसने हमें पहले छेड़छाड़ के मुद्दों को छेड़छाड़ के मुद्दों को ट्रैक करने के लिए आवश्यक सुराग दिए।

यदि आप ऐसा नहीं करना चाहते हैं, तो आप न्यूल के लिए दोनों पॉइंटर पैरामीटर को चेक करके और स्ट्रिंग प्रति के अधिकतम आकार को सीमित करके और सीमा तक पहुंचने के हर समय लॉगिंग करके बहुत छोटा लाभ प्राप्त कर सकते हैं। या तो पैरामीटर का एक स्ट्रेल न करें, क्योंकि स्ट्रिंग ठीक से नाली समाप्त होने पर स्ट्रेल आपको खुशी से दुर्घटनाग्रस्त कर देगा।

आजकल, नई परियोजनाएं अच्छी स्ट्रिंग ऑब्जेक्ट्स का उपयोग करती हैं, लेकिन वहां बहुत सारे विरासत कोड नहीं हैं जो नहीं करते हैं।

2

शायद थोड़ा परिधीय, लेकिन चूंकि किसी ने इसका उल्लेख नहीं किया है और यह शीर्षक में फहरा हुआ है: आप strcpy_mine() नामक वैश्विक कार्य नहीं लिख सकते हैं।

फ़ंक्शन का "नेमस्पेस" जिसका नाम str से शुरू होता है मानक पुस्तकालय के लिए आरक्षित है। उदाहरण के लिए, the accepted answer to this question देखें।

+0

दिलचस्प, चीयर्स :) – timB33

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