strcpy बनाम memcpy


81

बीच क्या अंतर है memcpy()और strcpy()? मैंने एक प्रोग्राम की मदद से इसे खोजने की कोशिश की लेकिन दोनों एक ही आउटपुट दे रहे हैं।

उत्पादन


जवाबों:


128

इस प्रभाव को देखने के लिए क्या किया जा सकता है

इस कोड को संकलित करें और चलाएं:

यह इस उत्पादन का उत्पादन करेगा:

आप देख सकते हैं कि "ch" को कॉपी किया गया था memcpy(), लेकिन नहीं strcpy()


1
हैलो, मुझे पता है कि पोस्ट पुरानी है, लेकिन मेरे पास इसके बारे में दो प्रश्न हैं। पहला - printf("%2.2x ", *p);- आपने प्रिंटफ को 2.2 तक सीमित क्यों किया? इसके अलावा मैं NO डॉट को बिल्कुल नहीं देख सकता ... दूसरा - printf("%c", *p ? *p : ' ');- यह परीक्षण वास्तव में क्या जांचता है? अगर *p? आपके उत्तर के लिए पहले से धन्यवाद!
पीटर सेर्बा

14
एक प्रिंटफ स्टेटमेंट में, "x" का अर्थ है "बेस 16"। "2.2" का अर्थ है: दो और केवल दो अंक। *pपरीक्षण साधन: "यदि आप एक अशक्त मारा, एक अंतरिक्ष प्रिंट करते हैं।"
egrunin

86

strcpyबंद हो जाता है जब यह एक एनयूएल ( '\0') चरित्र का सामना memcpyकरता है , नहीं। आपको यहां प्रभाव दिखाई नहीं देता है, क्योंकि %sप्रिंट में एनयूएल पर भी रोक है।


2
@ साचिन: ​​प्रारंभिक pऔर tकुछ (सभी रिक्तियाँ, उदाहरण के लिए), फिर कॉपी करने के बाद, तुलना p[3]करें t[3]। इससे strcpyआगे नहीं बढ़ p[2]पाया, जहां उसे अशक्त चरित्र मिला, लेकिन memcpyजैसा कि निर्देशित पांच पात्रों ने किया था।
Cascabel

9
माइनर नाइट-पिक: जब एनयूएल चरित्र (एक "एल") का सामना करता है तो स्ट्रैपी स्टॉप होता है। NULL (दो "L" s) एक संकलक-समय स्थिरांक है जो किसी भी वैध वस्तु की ओर संकेत नहीं करने की गारंटी देता है।
डैनियल स्टुट्ज़बाक

अगर भाग्य और src ओवरलैप, strcpy एक seg- गलती बाहर फेंक देंगे?
अल्कोट

12

strcpyसमाप्त होता है जब स्रोत स्ट्रिंग के अशक्त टर्मिनेटर पाया जाता है। memcpyएक आकार पैरामीटर की आवश्यकता होती है। इस मामले में आपने जो printfकथन प्रस्तुत किया है, वह दोनों वर्ण सरणियों के लिए अशक्त टर्मिनेटर के मिलने के बाद रुक रहा है, हालाँकि आप पाएंगे t[3]और t[4]उनमें डेटा की प्रतिलिपि भी बनाई है।


9

strcpy स्रोत से चरित्र को एक-एक करके गंतव्य तक कॉपी करता है जब तक कि वह स्रोत में NULL या '\ 0' वर्ण न खोज ले।

जहां memcpyस्रोत से डेटा की परवाह किए बिना स्रोत से गंतव्य तक डेटा (चरित्र नहीं) की प्रतिलिपि होती है।

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

strcpyपदावनत है, इसलिए उपयोग करें strncpy


3

आपके sस्ट्रिंग में अशक्त चरित्र के कारण , printfइससे आगे कुछ भी नहीं दिखाया जाएगा। के बीच का अंतर pऔर tपात्रों 4 में होगा और 5. pकिसी भी (कचरा वे हो जाएगा) के लिए नहीं होगा और tहोगा 'c'और 'h'


2
  • व्यवहार अंतर: strcpyरुक जाता है जब उसका सामना होता है NULLया'\0'
  • प्रदर्शन अंतर: memcpyआमतौर पर की तुलना में अधिक कुशल होता है strcpy, जो हमेशा उस डेटा को स्कैन करता है जिसे वह कॉपी करता है

2

मुख्य अंतर यह है कि memcpy()हमेशा आपके द्वारा निर्दिष्ट बाइट्स की सटीक संख्या की प्रतिलिपि बनाता है;strcpy()दूसरी ओर, तब तक नकल करेगा जब तक कि यह एनयूएल (उर्फ 0) बाइट नहीं पढ़ता है, और उसके बाद बंद हो जाता है।


1

आपके परीक्षण-कार्यक्रम के साथ समस्या यह है कि printf()तर्क को सम्मिलित करना बंद कर देता है %s, जब यह एक शून्य-समाप्ति का सामना करता है \0। इसलिए आपके आउटपुट में आपने शायद गौर नहीं किया होगा, जिसने memcpy()पात्रों की नकल की cऔरh साथ ही साथ।

मैंने GNU में देखा है glibc-2.24, कि (x86 के लिए) strcpy()सिर्फ कॉल करता है memcpy(dest, src, strlen(src) + 1)


0

printf("%s",...) नल का सामना होने पर डेटा को प्रिंट करना बंद कर देता है, इसलिए दोनों आउटपुट समान हैं।

निम्नलिखित कोड बीच अंतर strcpyऔर memcpy:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.