Просто для обеспечения выполнения ответов @phreakhead ´ и user1051892 ´ ,
, если отрицательно, должно быть больше, чем
. Если нет, то рисование элемента будет смешано с рисованием мазка, и вы можете подумать, что эти значения не работают.
В стандартной библиотеке такой функции нет. Вам придется либо использовать метод временного буфера, либо написать свою собственную функцию с нуля.
Отвечу на ваш вопрос: нет, стандартной функции нет, но достаточно просто написать свою:
#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));
}
Если вы , который стремился к эффективности, вы, вероятно, можете найти время, чтобы написать и отладить свои собственные.
Но: просто сделайте это с копией; у вас, вероятно, есть верхняя граница длины строки (десятичное число, которое помещается в 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;
}
strntol , вероятно, то, что вам нужно ... это не стандартный C.