2011-01-04 18 views
13

s में s[7] तक मैं कैसे पहुंच सकता हूं?strncpy और memcpy के बीच अंतर?

मैंने strncpy और memcpy के बीच कोई अंतर नहीं देखा। मैं, उत्पादन s मुद्रित करने के लिए के साथ चाहते हैं s[7] (जैसे qwertyA), परिवर्तन मैं निम्नलिखित कोड में किए गए करने के लिए कर रहे हैं क्या:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char s[10] = "qwerty", str[10], str1[10]; 
    s[7] = 'A'; 
    printf("%s\n",s); 
    strncpy(str,s,8); 
    printf("%s\n",str); 
    memcpy(str1,s,8); 
    printf("%s\n",str1); 
    return 0; 
} 
/* 
O/P 
qwerty 
qwerty 
qwerty 
*/ 
+1

'गमागमन memcpy' और' में strncpy' प्रयास करें आपका उपरोक्त कोड फिर अंतर का अनुभव करें। –

+0

एक और अंतर प्रकार की जांच और प्रकार लौटाया गया है। अन्य मामलों में महत्वपूर्ण, यहां नहीं। – chux

उत्तर

6

आप उत्पादन querty हो रही है क्योंकि सूचकांक 7 गलत है (सरणी 0 से अनुक्रमित हैं, 1 नहीं)। स्ट्रिंग के अंत को सिग्नल करने के लिए इंडेक्स 6 पर null-terminator है, और इसके बाद जो कुछ भी आता है उसका कोई प्रभाव नहीं पड़ेगा।

  1. बदलें s[7] में 76
  2. को s[7]

पर एक अशक्त-टर्मिनेटर जोड़े परिणाम होगा:

char s[10] = "qwerty"; 
s[6] = 'A'; 
s[7] = 0; 

दो बातें आप को ठीक करने की जरूरत है

Original not working और fixed working

strncpy बनाम memcpy के प्रश्न के रूप में, अंतर यह है कि strncpy आपके लिए एक नल टर्मिनेटर जोड़ता है। लेकिन, केवल अगर स्रोत स्ट्रिंग में n से पहले एक है। तो strncpy वह है जो आप यहां उपयोग करना चाहते हैं, लेकिन बड़े लेकिन बहुत सावधान रहें।

2

बनाने के "qwertyA" आप स्थापित करने के लिए s[6] = 'A' और s[7]='\0'

स्ट्रिंग्स, 0 से अनुक्रमित रहे हैं ताकि s[0] == 'q' की जरूरत है, और वे अशक्त समाप्त किया जा करने की जरूरत है।

+0

मुझे एस [7] से नहीं बदलना चाहिए [6]। अगर हम एस [6] को 'ए' के ​​रूप में सेट करते हैं तो हमें वांछित आउटपुट मिल जाएगा .. – user559208

+3

@user ताकि आप कह रहे हों * * वांछित आउटपुट नहीं चाहते हैं? O_o –

+0

@ user559208: जब मार्कक ने लिखा "परिवर्तन' s [6] 'to' s [7] '"मुझे लगता है कि वह वास्तव में लिखने के बजाय इसका मतलब था [7], एस [6] लिखें। साथ ही, स्ट्रिंग की शून्य समाप्ति को न भूलें (सेटिंग 's [7]' से '0' या' '0'') क्योंकि इससे बग को घुमाने से रोकने में मदद मिलेगी। –

20

अन्य ने आपकी शून्य-समाप्ति समस्याओं को इंगित किया है। memcpy और strncpy के बीच अंतर को समझने से पहले आपको शून्य-समाप्ति को समझने की आवश्यकता है।

अंतर यह है कि memcpy आपके द्वारा पूछे जाने वाले सभी एन अक्षरों की प्रतिलिपि बनायेगा, जबकि strncpy पहले शून्य टर्मिनेटर समावेशी, या एन वर्णों की प्रतिलिपि बनायेगा, जो भी कम हो। (यदि यह एन अक्षरों से कम प्रतिलिपि बनाता है, तो यह शेष वर्णों के साथ बाकी को पैड करेगा।)

+6

एक और अंतर भी है, strncpy शेष स्थान को 0 के साथ भर देगा। उदा। यदि आप 'strncpy (ए, बी, 255) करते हैं;' और एक 10 लंबा है, तो strncpy उन 10 अक्षरों की प्रतिलिपि बनायेगा और शेष 240 वर्णों को 0. – nos

+0

@nos से भर देगा: मुझे एहसास हुआ कि इससे पहले कि आपने इसे किया और संपादित किया । लेकिन फिर भी धन्यवाद :) –

2

जब आपके पास:

char s[10] = "qwerty"; 

यह क्या है कि सरणी शामिल है:

 
s[0] 'q' 
s[1] 'w' 
s[2] 'e' 
s[3] 'r' 
s[4] 't' 
s[5] 'y' 
s[6] 0 
s[7] 0 
s[8] 0 
s[9] 0 

आप अपने स्ट्रिंग के अंत करने के लिए एक 'ए' को जोड़ना चाहते हैं, कि सूचकांक 6 पर है चूंकि सरणी इंडेक्स 0

s[6] = 'A'; 

ध्यान दें कि जब आप इस तरह से एक सरणी प्रारंभ करते हैं, तो शेष स्थान 0 पर सेट होता है (एक nul t erminator), हालांकि इस मामले में जरूरी नहीं है, आमतौर पर पता होना चाहिए कि आपको अपने तारों को समाप्त करने की आवश्यकता है। उदा।

char s[10]; 
strcpy(s,"qwerty"); 
s[6] = 'A'; 
s[7] = 0; 

ऊपर के उदाहरण "qwerty", अपने नुल टर्मिनेटर सहित में s को कॉपी किया है। एस [6] उस नल टर्मिनेटर को ओवरराइट करता है। चूंकि s के बाकी आरंभ नहीं किया है हम s[7] = 0;

2

strncpy के साथ एक नुल टर्मिनेटर खुद को जोड़ने के लिए भी आप बाइट्स कॉपी करने के लिए की संख्या निर्दिष्ट NULL अप करने के लिए नकल की जरूरत होगी, लेकिन memcpy बाइट्स की निर्धारित संख्या के लिए ऊपर कॉपी कर देंगे।

printf बयान शून्य करने के लिए प्रिंट होंगे, इसलिए आप एक ही charater मुद्रित करने के लिए कोशिश करेंगे, यह दिखा देंगे,

printf("\t%c %c %c\t",s[7],str[7],str1[7]); 

आउटपुट

7    7