Конвертировать char String в int, но невозможно преобразовать char из строки char в int? - PullRequest
0 голосов
/ 03 февраля 2019
char input[5] = "12345";

printf("Convert to int valid %d", atoi(input));
printf("Convert to int invalid %d", atoi(input[1])); // program crash

Есть ли решение для преобразования "части" char строки символов в int?Краткое описание:

Пользователь вводит строку со значениями, например: 1, 2 3 4, 5 Iam форматирует эту строку в 12345 С каждым номером я хочу продолжать работать с индексом массива.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Чтобы правильно преобразовать произвольный фрагмент, вы должны либо сделать копию, либо изменить строку, вставив \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 илипохоже.

0 голосов
/ 03 февраля 2019

Если вы имеете в виду «как получить доступ к подстроке в массиве char []», вы можете использовать арифметику указателей:

char input[6] = "12345";
printf("strtol(input + 1) = %d\n", strtol(input + 1, NULL, 10)); // Output = "2345";

Однако стоит отметить несколько вещей:

  1. Ваш массив должен состоять из 6 элементов, чтобы содержать нулевой терминатор
  2. atoi вообще не должен использоваться;strtol - лучшая функция для преобразования строки в целое число со знаком;см. здесь для получения дополнительной информации.

Кроме того, чтобы преобразовать отдельный символ в int:

if(isdigit(c))
{
     c -= '0';
}

Отношение, которое представляет собой текстовое представлениецифра ровно на '0' больше, чем числовое значение этой цифры, гарантированно сохраняется для каждого набора символов, поддерживаемого C.

...