2009-07-06 13 views
8

क्या स्ट्रेटोल के समान मानक सी फ़ंक्शन है जो एक char * और एक गैर-शून्य-समाप्त स्ट्रिंग के लिए लंबाई लेगा?क्या कोई स्ट्रैट समकक्ष है जिसके लिए शून्य-समाप्त स्ट्रिंग की आवश्यकता नहीं है?

मुझे पता है कि मैं स्ट्रिंग को एक शून्य-समाप्त क्षेत्र में कॉपी कर सकता हूं, लेकिन दक्षता कारणों के लिए जो अवांछित है।

धन्यवाद।

उत्तर

4

मानक पुस्तकालय में ऐसा कोई फ़ंक्शन नहीं है। आपको या तो अस्थायी बफर विधि का उपयोग करना होगा, या स्क्रैच से अपना स्वयं का फ़ंक्शन लिखना होगा।

1

strntol शायद आप जो भी कर रहे हैं ... यह मानक सी नहीं है, हालांकि।

1

यदि आप हैं दक्षता के लिए दबाए गए हैं, तो आप शायद अपना समय लिखने और डिबग करने के लिए प्रेरित कर सकते हैं।

लेकिन: बस इसे एक प्रति के साथ करें; स्ट्रिंग हो सकती है कि आपके पास शायद ऊपरी बाध्य है (एक दशमलव अंक जो long में फिट बैठता है उसकी अधिकतम लंबाई पर सख्त ऊपरी सीमा है), ताकि आपके पास स्थिर बफर हो। फिर अपने पूरे एप्लिकेशन को प्रोफाइल करें, और देखें कि प्रतिलिपि/रूपांतरण वास्तव में एक बाधा है या नहीं। यदि यह वास्तव में है, तो आप जानते हैं कि आपको अपना खुद लिखना होगा।

long limited_strtol(const char *string, size_t len) 
{ 
    long sign = 1; 
    long value = 0; 

    for(; len > 0 && *string == '-'; string++, len--) 
    sign *= -1; 

    for(; len > 0 && isdigit(*string); string++, len--) 
    { 
    value *= 10; 
    value += *string - '0'; 
    len--; 
    string++; 
    } 
    return sign * value; 
} 
2

आपके प्रश्न का उत्तर करने के लिए::

यहाँ एक किसी न किसी तरह (अपरीक्षित, ब्राउज़र-लिखित) प्रारंभ बिंदु है नहीं, कोई मानक समारोह है, लेकिन यह काफी सरल अपनी खुद लिखने के लिए है:

#include <stdio.h> 
#include <ctype.h> 

int natoi(char *s, int n) 
{ 
    int x = 0; 
    while(isdigit(s[0]) && n--) 
    { 
     x = x * 10 + (s[0] - '0');  
     s++; 
    } 
    return x; 
} 

int main(int argc, char*argv[]) 
{ 
    int i; 
    for(i = 1; i < argc; i++) 
     printf("%d: %d\n", i, natoi(argv[i], 5)); 
} 
संबंधित मुद्दे

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