2009-07-06 9 views

Respuesta

4

No existe tal función en la biblioteca estándar. Deberá utilizar el método del búfer temporal o escribir su propia función desde cero.

1

strntol es probablemente lo que buscas ... aunque no es el estándar C.

1

Si está que presionado por la eficiencia, probablemente pueda motivar el tiempo para escribir y depurar el suyo.

Pero: solo hazlo con una copia; es probable que tenga un límite superior de cuánto tiempo puede ser la cadena (un número decimal que se ajusta en un long tiene un límite superior estricto en su longitud máxima), por lo que puede tener un búfer estático. Luego, perfila toda tu aplicación y ve si la copia/conversión realmente es un cuello de botella. Si realmente es así, entonces sabes que necesitas escribir el tuyo.

Aquí hay una áspera (no probado, navegador por escrito) Punto de partida:

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

Para responder a su pregunta: no, no hay ninguna función estándar, pero es lo suficientemente simple como para escribir su propia:

#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)); 
} 
Cuestiones relacionadas