Чтобы правильно преобразовать произвольный фрагмент, вы должны либо сделать копию, либо изменить строку, вставив \0
после фрагмента.Последнее не может быть вариантом, в зависимости от того, где хранится строка.
Чтобы сделать копию, выделите массив, достаточно большой, чтобы вместить срез и \0
.Если вы знаете размер среза во время компиляции, вы можете выделить в стеке:
char slice[2];
В противном случае вам придется выделять динамически:
char *slice;
slice = malloc(2);
Стек выделенных слайсовне нужно освобождать, но динамически распределенные должны быть освобождены, как только они больше не нужны:
free(slice);
Как только вы выделите срез, скопируйте интересующую часть и завершите ее с помощью \0
:
strncpy(slice, s + 1, 1);
slice[1] = '\0';
atoi(slice);
Этот метод почти всегда работает.
Если ваш фрагмент всегда заканчивается строкой, вам не нужно делать копию: вам просто нужно передатьуказатель на начало фрагмента:
atoi(s + 1);
Изменение самой строки, вероятно, не будет работать, если только она не находится в доступной для записи памяти.Если вы уверены, что это так, вы можете сделать что-то вроде:
char tmp;
tmp = s[1];
s[1] = '\0';
atoi(s);
s[1] = tmp;
Если вы были уверены, что память не была доступна для записи, ваша программа произойдет сбой-ошибка.
Для особого случая, когда ваш срез имеет длину ровно один символ, вы можете использовать тот факт, что символы являются числами:
s[0] - '0'
Обратите внимание, что '0' !='\0'
, и это не будет работать, если ваша машина использует EBCDIC илипохоже.