2012-03-10 8 views
6

मैं कुछ वर्णों को संख्यात्मक प्रकार में बदलने की कोशिश कर रहा हूं, लेकिन उनमें से कुछ शून्य-समाप्त तार नहीं हो सकते हैं। तो स्ट्रिंग, स्ट्रेटोल, स्ट्रिंग्स उन स्ट्रिंग्स के लिए सुरक्षित हैं जो शून्य-समाप्त नहीं हैं?स्ट्रेटोल, स्ट्रेटोल, किसी भी वर्ण के लिए स्ट्रेट सुरक्षित है, यहां तक ​​कि शून्य समाप्त नहीं हुआ है?

उत्तर

5

सं

एक चरित्र सरणी एक अशक्त चरित्र द्वारा समाप्त नहीं है, तो यह नहीं एक स्ट्रिंग है। यदि strto*() फ़ंक्शंस में से कोई एक तर्क पारित किया गया है जो स्ट्रिंग को इंगित नहीं करता है, तो व्यवहार अपरिभाषित है।

2011 आईएसओ सी मानक के latest draft का जिक्र करते हुए:

7.1.1 पदों की परिभाषा:

एक स्ट्रिंग द्वारा समाप्त पात्रों में से एक सन्निहित अनुक्रम है और पहली अशक्त सहित चरित्र।

7.1.4 पुस्तकालय कार्यों का उपयोग:

एक समारोह के लिए एक तर्क के इस तरह के समारोह के डोमेन के बाहर एक मूल्य , या पता बाहर सूचक के रूप में एक अमान्य मान (है कार्यक्रम की जगह, या एक शून्य सूचक, या पर एक सूचक, गैर-संशोधित संग्रहण जब संबंधित पैरामीटर कॉन्स्ट-क्वालिफाइड नहीं है) या द्वारा तर्क की चर संख्या के साथ फ़ंक्शन की अपेक्षा नहीं है (प्रचार के बाद) व्यवहार अपरिभाषित है।

7.22.1.3 strtod, strtof, और strtold कार्य:

strtod, strtof, और strtold कार्यों प्रारंभिक भाग स्ट्रिंग की परिवर्तितnptr से डबल, फ्लोट, और क्रमशः लंबे डबल प्रतिनिधित्व।

(जोर जोड़ा)

तो एक तर्क है कि एक स्ट्रिंग को इंगित नहीं करता समारोह के डोमेन के बाहर है।

यदि सरणी में { '1', '2', '3', 'x', 'y', 'z' } जैसे कुछ शामिल हैं, तो आपको इससे दूर होने की संभावना है, क्योंकि x से पहले स्कैन करने की आवश्यकता नहीं है जो वांछित मान को समाप्त करता है, लेकिन व्यवहार स्पष्ट रूप से अपरिभाषित है।

यदि आप इन कार्यों का उपयोग करना चाहते हैं, तो आपको, यदि आवश्यक हो, तो अपने सरणी को किसी अन्य बफर में कॉपी करें और स्पष्ट रूप से इसे स्वयं को समाप्त कर दें।

1

जब तक आपका इनपुट किसी भी तरह समाप्त नहीं होता है, जो निश्चित रूप से एक वैध अंक चरित्र नहीं है, प्रसंस्करण बंद हो जाएगा और जब तक यह पहला एनयूएल नहीं मिल जाता तब तक खुशी से स्मृति को नहीं पढ़ना चाहिए।

तो मुझे लगता है कि आप ठीक हैं।

+0

तो, उदाहरण के लिए, कनवर्ट किए गए नंबर के बाद स्कैन को रोकने के बाद एक रिक्त या विराम चिह्न (या उस अक्षर में उस अक्षर को शामिल नहीं किया जाता है)। –

+0

@ जोनाथन लेफ्लर: प्रमुख रिक्त स्थान, दशमलव बिंदु, कुछ भी जो वैध इनपुट हो सकता है, हां। –

+0

क्या यह सीजी-गलती त्रुटि को ट्रिगर नहीं करेगा? –

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

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