आप strtol
को कॉन्स्ट-सुधार के तहत कैसे कार्यान्वित करते हैं? क्योंकि strtol
की परिभाषा स्वाभाविक const
-correct नहीं है
आप नहीं करते हैं,।
यह सी मानक पुस्तकालय में एक दोष है।
कई मानक कार्यों कि एक const char*
तर्क और एक गैर const
char*
सूचक है कि सरणी संशोधित करने के लिए इस्तेमाल किया जा सकता वापस देना (एक चरित्र सरणी की शुरुआत बात करने के लिए उम्मीद) ले रहे हैं।
char *strchr(const char *s, int c);
उदाहरण के लिए::
#include <string.h>
int main(void) {
const char *s = "hello";
char *ptr = strchr(s, 'h');
*ptr = 'H';
}
इस कार्यक्रम अपरिभाषित है व्यवहार
strchr
एक उदाहरण है। मेरे सिस्टम पर, यह एक सेगमेंटेशन गलती के साथ मर जाता है।
समस्या strchr
में ही नहीं होती है। यह वादा करता है कि आप जिस स्ट्रिंग को पास करते हैं उसे संशोधित न करें, और ऐसा नहीं होता है। लेकिन यह एक सूचक देता है कि कॉलर तब इसे संशोधित करने के लिए उपयोग कर सकता है।
ANSI C समिति 1980 के अंत में वापस, दो संस्करणों, गैर const
सरणियों के लिए एक है कि const
चरित्र सरणियों पर काम करता है और दूसरे में ऐसे प्रत्येक समारोह विभाजित किया जा सकता था:
char *strchr(char *s, int c);
const char *strcchr(const char *s, int c);
लेकिन जो मौजूदा प्री-एएनएसआई कोड तोड़ दिया होगा, const
से पहले लिखा गया था। यही कारण है कि सी ने स्ट्रिंग अक्षर const
नहीं बनाया है।
सी ++, जो सी के अधिकांश मानक पुस्तकालय को विरासत में मिला है, कुछ कार्यों के अधिभारित संस्करण प्रदान करके इसका समाधान करता है।
नीचे पंक्ति यह है कि आप, सी प्रोग्रामर के रूप में, const
के रूप में परिभाषित वस्तुओं को संशोधित करने के लिए ज़िम्मेदार नहीं हैं। ज्यादातर मामलों में, भाषा आपको इसे लागू करने में मदद करती है, लेकिन हमेशा नहीं।
के लिए कैसे इन कार्यों const
डेटा के लिए एक गैर const
सूचक वापस जाने के लिए प्रबंधन के रूप में, वे शायद सिर्फ एक डाली आंतरिक रूप से (न कि किसी const_cast
है, जो केवल C++ मौजूद है) का उपयोग करें। ऐसा लगता है कि वे सी में लागू किए गए हैं, जो संभवतः लेकिन आवश्यक नहीं है।
आधार 'str' दिशा के रूप में ऑफसेट के साथ "खेलना" के बारे में क्या? – kazbeel
यह 'const char ** endptr' लेगा और अन्यथा समान कार्यान्वयन होगा, लेकिन http://stackoverflow.com/questions/993700/are-strtol-strtod-unsafe देखें क्यों नहीं। –
उत्तर "यह नहीं कर सकता" है। हालांकि, इसका उत्तर एक और सामान्य प्रश्न में दिया गया है। – dasblinkenlight