strtol과 비슷한 표준 C 함수가 있는데, null이 아닌 종료 문자열에 char * 및 길이를 사용합니까?null로 끝나는 문자열을 필요로하지 않는 strtol이 있습니까?
나는 문자열을 null로 끝나는 영역으로 복사 할 수 있지만 효율상의 이유로 바람직하지 않다는 것을 알고 있습니다.
감사합니다.
strtol과 비슷한 표준 C 함수가 있는데, null이 아닌 종료 문자열에 char * 및 길이를 사용합니까?null로 끝나는 문자열을 필요로하지 않는 strtol이 있습니까?
나는 문자열을 null로 끝나는 영역으로 복사 할 수 있지만 효율상의 이유로 바람직하지 않다는 것을 알고 있습니다.
감사합니다.
표준 라이브러리에는 이러한 기능이 없습니다. 임시 버퍼 방법을 사용하거나 처음부터 직접 함수를 작성해야합니다.
strntol 아마도 당신이 쓴 것입니다 ... 표준 C가 아닙니다.
효율성을 높이기 위해 인 경우을 누르면 효율적으로 작성하고 디버그 할 시간을 가질 수 있습니다.
하지만 사본으로 복사하십시오. 문자열의 길이에 대한 상한선이있을 수 있습니다 (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;
}
가 귀하의 질문에 대답하려면 :
여기에 거친 (안된, 브라우저 기록) 출발점
#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));
}