2009-03-10 15 views
22

strlen(const char *s) परिभाषित किया गया है जब s शून्य-समाप्त नहीं हुआ है, और यदि ऐसा है, तो यह क्या लौटाता है?strlen()?

+8

अपने आप से पूछें: स्ट्रेल() को कैसे पता होना चाहिए कि आपकी स्ट्रिंग समाप्त होती है, अगर यह शून्य-समाप्त नहीं होती है? – DevSolar

+1

तकनीकी रूप से बोलते हुए, सी स्ट्रिंग जैसी कोई चीज नहीं है जो एनयूएल-समाप्त नहीं होती है, क्योंकि एनयूएल-टर्मिनेटर को सी स्ट्रिंग का हिस्सा माना जाता है :) – fredoverflow

उत्तर

30

नहीं, यह परिभाषित नहीं किया गया है। इसके परिणामस्वरूप स्मृति पहुंच उल्लंघन हो सकता है, क्योंकि यह पहली स्मृति बाइट तक पहुंचने तक गिनती रखेगा जिसका मूल्य 0 है।

+13

यह राक्षसों को आपकी नाक उड़ाने का कारण भी बना सकता है। http://catb.org/jargon/html/N/nasal-demons.html –

+2

जो मेरी दर्दनाक नाक को बताता है। –

1

यह '\ 0' से पहले सामने आए वर्णों की संख्या वापस कर देगा।

+0

....... या नहीं। – alk

1

यह परिभाषित नहीं किया गया है। यह अनिर्धारित व्यवहार का कारण बनता है जिसका अर्थ है कि कुछ भी हो सकता है, संभवतः आपका प्रोग्राम क्रैश हो जाएगा।

-2

यह हमेशा परिभाषित किया जाता है।

यह "स्ट्रिंग" की लंबाई वापस लौटाएगा जब तक कि यह एक बाइट तक नट तक पहुंच जाए। बुरा विचार क्योंकि यह एक बफर ओवरफ्लो का कारण बन सकता है।

+2

नहीं, यह परिभाषित नहीं है। एक बार जब आप स्ट्रिंग के लिए आवंटित स्थान से परे ट्रैवर्सिंग शुरू कर देते हैं, या तो मॉलोक या स्टैक/ढेर पर, परिणाम सख्ती से अपरिभाषित होते हैं। –

9

C99 मानक से:

strlen समारोह अक्षर हैं जो पूर्व में होना अशक्त चरित्र समाप्त संख्या दिखाता है।

यदि कोई शून्य चरित्र नहीं है जिसका अर्थ है कि परिणाम अपरिभाषित है।

2

वास्तव में नहीं, और यह bad things का कारण बन जाएगा।

0

strlen() केवल शून्य-समाप्त तारों पर काम करता है (कुछ उपयोगी करता है); यदि आप इसके अलावा किसी अन्य चीज़ में पास करते हैं तो आपको एक पूरी तरह से अपरिभाषित परिणाम मिल जाएगा। यदि आप भाग्यशाली हैं, तो यह क्रैश नहीं करेगा :)

+2

सुधार, यदि वह भाग्यशाली है तो यह दुर्घटनाग्रस्त हो जाएगा। आप इस प्रकार की त्रुटि को ध्यान में रखना नहीं चाहते हैं: -पी। –

2

यदि आपकी स्ट्रिंग एनयूएल समाप्त नहीं हुई है, तो फ़ंक्शन तब तक देखेगा जब तक कि यह एक नहीं पाता।

यदि आप भाग्यशाली हैं, तो यह आपके प्रोग्राम को क्रैश कर देगा।

यदि आप भाग्यशाली नहीं हैं, तो आप अपेक्षाकृत लम्बाई से अधिक बड़े होंगे, इसमें बहुत से 'अप्रत्याशित' मूल्य होंगे।

5

क्या आपको strnlen की आवश्यकता हो सकती है?

+5

दुर्भाग्यवश, यह मानक सी का हिस्सा नहीं है। – joveha

0

आदमी 3 strcspn

size_t strcspn (स्थिरांक चार * रों, स्थिरांक चार * अस्वीकार);

बृहदान्त्र सीमांकित तार का एक लंबाई:

size_t len = strcspn(str, ":"); 

अल्पविराम से परे तार का एक लंबाई:

size_t len = strcspn(str, ","); 

टैब सीमांकित तार का एक लंबाई:

size_t len = strcspn(str, "\t"); 
संबंधित मुद्दे