Преобразовать часть строки в int в одной команде в C - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть длинная строка, в которой я знаю местоположение начала и конца целого числа.Я хочу извлечь целое число и сохранить его в переменной.Вот как я могу это сделать сейчас.

//MY_STRING, INT_START, INT_END are the string, start 
//position of the int and end position respectively.
char * temp;
strncpy(temp, MY_STRING+INT_START, INT_END-INT_START);
int n = atoi(temp);

Вопрос в том, могу ли я сделать это в одной строке вместо временной строки?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Нет, вы не можете сделать это в одной строке, а количество строк исходного кода чаще всего не имеет значения.Единственное, что имеет значение, это безопасность, удобочитаемость и производительность.strncpy и atoi являются небезопасными функциями.

Однако правильный способ сделать это очень похож:

int strn_to_int (const char* src, size_t n)
{
  char str [LARGE_ENOUGH];
  memcpy(str, src, n);
  str[n] = '\0';
  return strtol(str, NULL, 10);
}

...

int n = strn_to_int (&MY_STRING[INT_START], INT_END-INT_START);
0 голосов
/ 23 ноября 2018

можно ли сделать это в одной строке вместо временной строки?

Использовать sscanf() для быстрого грязного no- temp.

int n;
//                                  v--- scan width limit
//                                  |    v---------------v
if (sscanf(MY_STRING + INT_START, "%*d", INT_END-INT_START, &n) == 1) {
  puts("Success");
}

Более качественный код будет учитывать проблемы с переполнением.


Код OP не годится, поскольку temp не обязательно указывает на строку .Может отсутствовать нулевой символ .

strncpy(temp, MY_STRING+INT_START, INT_END-INT_START);
int n = atoi(temp); // bad
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...