निम्नलिखित कोड में, मैं एक स्ट्रिंग को एक char * str में कॉपी करता हूं, जो strncpy()
का उपयोग करके 10 वर्ण लंबा है।स्ट्रिंग न्यूल पर समाप्त नहीं होती है लेकिन फिर भी सामान्य रूप से व्यवहार करती है, क्यों?
अब strncpy()
मैनुअल के अनुसार, "चेतावनी: अगर स्रोत के पहले एन बाइट्स में कोई शून्य बाइट नहीं है, तो नियत में रखी गई स्ट्रिंग को निरस्त नहीं किया जाएगा।" जो वास्तव में यहां होता है।
स्रोत स्ट्रिंग 26 वर्णक लंबी है और मैंने 10 वर्णों की प्रतिलिपि बनाई है, इसलिए स्ट्र के अंत में कोई शून्य चरित्र नहीं रखा गया है।
लेकिन जब मैं स्ट्र की सामग्री मुद्रित करता हूं, तब तक 0 से शुरू होने तक मुझे '\ 0' मिलता है, यह सामान्य रूप से व्यवहार करता है।
क्यों? जब अंत में कोई '\ 0' नहीं रखा जाता है तो लूप सही जगह पर क्यों रुकता है?
मुझे क्या समझता है कि इसे "सेगमेंटेशन गलती" देना चाहिए या कम से कम इसे वहां नहीं रोकना चाहिए और कुछ कचरे के मूल्यों को प्रिंट करना चाहिए।
str[ 0 ] has got : a str[ 1 ] has got : b str[ 2 ] has got : c str[ 3 ] has got : d str[ 4 ] has got : e str[ 5 ] has got : f str[ 6 ] has got : g str[ 7 ] has got : h str[ 8 ] has got : i str[ 9 ] has got : j
किसी भी मदद की सराहना की जाएगी:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
int main()
{
char *str ;
str = malloc(sizeof(char) * SIZE);
if(str == NULL)
exit(1);
memset(str, 0, sizeof(char) * SIZE);
strncpy(str, "abcdefghijklmnopqrstuvwxyz", sizeof(char) * SIZE);
unsigned int index;
for(index = 0; str[ index ] != '\0' ; index++) {
printf("str[ %u ] has got : %c \n ", index, str[ index ]);
}
return 0;
}
यहाँ उत्पादन होता है।
संपादित
वहाँ जाँच करने के लिए एक उचित तरीका है एक स्ट्रिंग '\ 0' या नहीं पर समाप्त होता है या नहीं? मैंने हमेशा उपरोक्त लूप को अंतिम परीक्षण माना था, लेकिन अब ऐसा लगता है कि यह नहीं है।
आइए कहें कि हमें अन्य प्रोग्रामर द्वारा विकसित कुछ फ़ंक्शन से स्ट्रिंग मिलती है। अब हम कैसे जानेंगे कि यह सही जगह पर '\ 0' के साथ समाप्त होता है। ऐसा नहीं हो सकता है, तो यह वास्तविक आकार से आगे जाएगा जब तक कि हम कुछ '\ 0' प्राप्त न करें। हम स्ट्रिंग के वास्तविक आकार को कभी नहीं जानते।
तो हम ऐसी स्थिति से कैसे निपट सकते हैं?
कोई सुझाव?
आकार (char) * हमेशा * 1 है !! – paxdiablo
@ पैक्स: सच है, लेकिन यहां इसकी चर्चा है: http://stackoverflow.com/questions/1011806/is-it-necessary-to-multiply-by-sizeof-char-when-manipulating-memory – sharptooth
strncmp लेता है पात्रों की संख्या, हालांकि स्ट्रिंग का आकार नहीं है, इसलिए इसका उपयोग करना गलत है। –