2010-05-24 13 views
53

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

int main() 
{ 
    char s[5]={'s','a','\0','c','h'}; 
    char p[5]; 
    char t[5]; 
    strcpy(p,s); 
    memcpy(t,s,5); 
    printf("sachin p is [%s], t is [%s]",p,t); 
    return 0; 
} 

आउटपुट

sachin p is [sa], t is [sa] 
+1

देखें http://stackoverflow.com/questions/2884874/when-to-use-strncpy-or-memmove –

उत्तर

92

इस आशय

संकलित देख सकते हैं और इस कोड को चलाने के लिए किया जा सकता है क्या:

73 61 00 63 68 sa ch 
73 61 00 00 00 sa 

आप देख सकते हैं कि:

void dump5(char *str); 

int main() 
{ 
    char s[5]={'s','a','\0','c','h'}; 

    char membuff[5]; 
    char strbuff[5]; 
    memset(membuff, 0, 5); // init both buffers to nulls 
    memset(strbuff, 0, 5); 

    strcpy(strbuff,s); 
    memcpy(membuff,s,5); 

    dump5(membuff); // show what happened 
    dump5(strbuff); 

    return 0; 
} 

void dump5(char *str) 
{ 
    char *p = str; 
    for (int n = 0; n < 5; ++n) 
    { 
     printf("%2.2x ", *p); 
     ++p; 
    } 

    printf("\t"); 

    p = str; 
    for (int n = 0; n < 5; ++n) 
    { 
     printf("%c", *p ? *p : ' '); 
     ++p; 
    } 

    printf("\n", str); 
} 

यह इस उत्पादन का उत्पादन होगा "सी" की प्रतिलिपि memcpy() द्वारा की गई थी, लेकिन strcpy() नहीं थी।

+1

स्पष्ट स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। –

+1

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

+7

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

52

strcpy बंद हो जाता है जब यह एक शून्य सामना करता है, memcpy नहीं करता है। आपको यहां प्रभाव दिखाई नहीं देता है, क्योंकि %s printf में भी NULL पर रुक जाता है।

+0

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

+2

@Sachin: 'p' और' t' आरंभ करें कुछ (सभी रिक्त स्थान, उदाहरण के लिए), फिर प्रतिलिपि बनाने के बाद, 'पी [3] 'से' टी [3] 'की तुलना करें। 'Strcpy'' p [2] 'से आगे नहीं चला, जहां इसे शून्य चरित्र मिला, लेकिन निर्देश के रूप में 'memcpy' ने पांच वर्णों की प्रतिलिपि बनाई। – Cascabel

+8

माइनर नाइट-पिक: स्ट्रिपी स्टॉप करता है जब यह एनयूएल कैरेक्टर (एक "एल") से मुकाबला करता है। न्यूल (दो "एल" एस) एक सूचक के लिए एक संकलन-समय निरंतर है जो किसी वैध वस्तु को इंगित न करने की गारंटी देता है। –

2

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

3

आपकी स्ट्रिंग में शून्य चरित्र की वजह से, printf इससे परे कुछ भी नहीं दिखाएगा। पी और टी के बीच का अंतर अक्षर 4 और 5 में होगा। पी में कोई नहीं होगा (वे कचरा होंगे) और टी में 'सी' और 'एच' होगा।

12

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

9

strcpy स्रोत से गंतव्य तक प्रति व्यक्ति को प्रतिलिपि बनाता है जब तक कि यह स्रोत में न्यूल या '\ 0' वर्ण न हो।

while((*dst++) = (*src++)); 

जहां दिए गए आकार n के गंतव्य के लिए स्रोत से memcpy प्रतियां डेटा (नहीं चरित्र), पर ध्यान दिए बिना डेटा स्रोत के रूप में।

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

strcpy बहिष्कृत है, इसलिए strncpy का उपयोग करें।

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

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

मैंने जीएनयू glibc-2.24 में देखा है, कि (x86 के लिए) strcpy() बस memcpy(dest, src, strlen(src) + 1) पर कॉल करता है।

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

  • कोई संबंधित समस्या नहीं^_^