Существует ли стертол, эквивалентный, который не требует завершенной пустым указателем строки?

Просто для обеспечения выполнения ответов @phreakhead ´ и user1051892 ´ , , если отрицательно, должно быть больше, чем . Если нет, то рисование элемента будет смешано с рисованием мазка, и вы можете подумать, что эти значения не работают.

10
задан kdt 6 July 2009 в 08:33
поделиться

4 ответа

В стандартной библиотеке такой функции нет. Вам придется либо использовать метод временного буфера, либо написать свою собственную функцию с нуля.

4
ответ дан 4 December 2019 в 01:31
поделиться

Отвечу на ваш вопрос: нет, стандартной функции нет, но достаточно просто написать свою:

#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));
}
3
ответ дан 4 December 2019 в 01:31
поделиться

Если вы , который стремился к эффективности, вы, вероятно, можете найти время, чтобы написать и отладить свои собственные.

Но: просто сделайте это с копией; у вас, вероятно, есть верхняя граница длины строки (десятичное число, которое помещается в 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;
}
1
ответ дан 4 December 2019 в 01:31
поделиться

strntol , вероятно, то, что вам нужно ... это не стандартный C.

2
ответ дан 4 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: