2010-05-26 12 views
24

gcc 4.4.4 c89एक स्ट्रिंग

स्ट्रिंग को समाप्त करने का मानक तरीका क्या है? जब मैं NULL का उपयोग करता हूं तो मुझे एक चेतावनी संदेश मिलता है।

*dest++ = 0; 
*dest++ = '\0'; 
*dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */ 

स्रोत कोड:

size_t s_strscpy(char *dest, const char *src, const size_t len) 
{ 
    /* Copy the contents from src to dest */ 
    size_t i = 0; 
    for(i = 0; i < len; i++) 
    *dest++ = *src++; 

    /* Null terminate dest */ 
    *dest++ = 0; 

    return i; 
} 

एक और सवाल: मैं जानबूझ कर बाहर लाइन है कि समाप्त शून्य टिप्पणी की। हालांकि, यह अभी भी नियत की सामग्री को सही तरीके से मुद्रित करता है। इस फ़ंक्शन के कॉलर स्ट्रिंग की लंबाई को NULL या तो शामिल नहीं करेंगे। यानी strlen(src) + 1 या stlen(src)

size_t s_strscpy(char *dest, const char *src, const size_t len) 
{ 
    /* Copy the contents from src to dest */ 
    size_t i = 0; 
    /* Don't copy the null terminator */ 
    for(i = 0; i < len - 1; i++) 
    *dest++ = *src++; 

    /* Don't add the Null terminator */ 
    /* *dest++ = 0; */ 

    return i; 
} 
+13

मैं '* dest ++ = '\ 0' पसंद करता हूं; 'चूंकि इस संदर्भ में' \ 0'' का सही प्रकार है। –

+5

@ पॉल आर: आप इसे उत्तर क्यों नहीं देते? – Lucas

+0

'* dest ++ = 0; 'संदर्भित मान को 0 पर निर्दिष्ट करने के बाद सूचक को पोस्ट-वृद्धि क्यों करें? – Larry

उत्तर

35

आपके पहले प्रश्न पर: मैं पॉल आर की टिप्पणी के साथ जाऊंगा और '\0' के साथ समाप्त कर दूंगा। लेकिन मूल्य 0 स्वयं भी ठीक काम करता है। स्वाद की बात। लेकिन मैक्रो NULL का उपयोग न करें जो पॉइंटर्स के लिए है।

अपने दूसरे प्रश्न के लिए: अपने स्ट्रिंग \0 के साथ समाप्त नहीं किया जाता है, यह अभी भी अपेक्षित आउटपुट प्रिंट सकती है क्योंकि आपके स्ट्रिंग निम्नलिखित तुम्हारी याद में एक प्रिंट न हो सकने चरित्र है। हालांकि यह वास्तव में एक बुरा गड़बड़ है, क्योंकि जब आप इसकी अपेक्षा नहीं कर सकते हैं तो यह उड़ा सकता है। हमेशा'\0' के साथ एक स्ट्रिंग को समाप्त करें।

7

'\ 0' जाने का रास्ता है। यह एक चरित्र है, जो एक स्ट्रिंग में वांछित है और शून्य मूल्य है।

जब हम सी/सी ++ में शून्य समाप्त स्ट्रिंग कहते हैं, तो इसका वास्तव में 'शून्य समाप्त स्ट्रिंग' का अर्थ है। नल मैक्रो स्ट्रिंग को समाप्त करने में उपयोग के लिए नहीं है।

+0

''0 0'', यदि यह एक चरित्र है, तो यह एक बहुत बड़ा है! मुझे यकीन है कि आजकल अधिकांश मशीनों पर, 'सी' कंपाइलर के साथ, आपके पास आकार ('\ 0') == 4. (हो सकता है कि 8031 ​​माइक्रो-नियंत्रक अपवाद हैं?)। –

+0

@ जोसेफ।मुझे पूरा यकीन नहीं है कि आप कहां से आ रहे हैं। sizeof ('\ 0') मेरे कंपाइलर पर 1 बाइट के रूप में आता है। एक डबल बाइट चरित्र के लिए, आकार (एल '\ 0') यह 2. –

+6

मैं दोबारा जांच करता हूं: एक .c फ़ाइल में यह 4 है, जबकि एक .cpp फ़ाइल में, या g ++ के साथ, यह 1 है। प्रश्न था सी के रूप में टैग किया गया, सी ++ नहीं। –

11

बहुत सावधान: शून्य संकेत के लिए मुख्य रूप से प्रयोग किया जाता है एक मैक्रो है। मानक एक स्ट्रिंग समाप्त तरीका है:

char *buffer; 
... 
buffer[end_position] = '\0'; 

यह (नीचे) भी काम करता है लेकिन यह एक पूर्णांक/लघु/लंबे सरणी के लिए एक पूर्णांक मान निर्दिष्ट और एक चरित्र मान निर्दिष्ट बीच एक बड़ा अंतर नहीं है। यही कारण है कि पहला संस्करण पसंद किया जाता है और व्यक्तिगत रूप से मुझे यह बेहतर लगता है।

buffer[end_position] = 0; 
+0

' '0'' स्थिर है टाइप 'int'in सी –

17

comp.lang.c पूछे जाने वाले प्रश्न से: http://c-faq.com/null/varieties.html

संक्षेप में: NULL (शून्य सूचक के लिए पूर्वप्रक्रमक मैक्रो) NUL (शून्य चरित्र) के रूप में ही नहीं है।

+8

+1; यह वास्तव में मुझे हमेशा खराब करता है जब मैं "नल-टर्मिनेटेड स्ट्रिंग्स" देखता हूं: हेक, स्ट्रिंग टर्मिनेटर न्यूल नहीं है, यह एनयूएल है! –