Преобразование массива символов в число int в C

Я хочу преобразовать массив char [] следующим образом:

char myarray[4] = {'-','1','2','3'}; //where the - means it is negative 

Таким образом, это должно быть целое число: -1234, используя стандартные библиотеки в C. Я не мог найти элегантный способ сделать это.

Я могу добавить «\ 0» точно.

Мне лично не нравится функция atoi . Я бы предложил sscanf :

 char myarray[5] = {'-', '1', '2', '3', '\0'}; int i; sscanf(myarray, "%d", &i); 

Он очень стандартный, он находится в библиотеке stdio.h 🙂

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

EDIT Я только что нашел этот замечательный вопрос здесь, на сайте, который объясняет и сравнивает 3 разных способа сделать это – atoi , sscanf и strtol . Кроме того, есть еще более подробное представление о sscanf (на самом деле, все семейство функций *scanf ).

EDIT2 Похоже, что не только я лично нелюбовь к функции atoi . Вот ссылка на ответ, объясняющий, что функция atoi устарела и не должна использоваться в более новом коде.

Почему бы просто не использовать atoi? Например:

 char myarray[4] = {'-','1','2','3'}; int i = atoi(myarray); printf("%d\n", i); 

Дает мне, как и ожидалось:

 -123 

Обновление: почему нет – массив символов не завершен нулем. Doh!

Таким образом, идея состоит в том, чтобы преобразовать номера символов (в одинарных кавычках, например «8») в целочисленное выражение. Например, char c = ‘8’; int i = c – ‘0’ // даст целое число 8; И суммируем все преобразованные числа по принципу, что 908 = 9 * 100 + 0 * 10 + 8, что делается в цикле.

 char t[5] = {'-', '9', '0', '8', '\0'}; //Should be terminated properly. int s = 1; int i = -1; int res = 0; if (c[0] == '-') { s = -1; i = 0; } while (c[++i] != '\0') { //iterate until the array end res = res*10 + (c[i] - '0'); //generating the integer according to read parsed numbers. } res = res*s; //answer: -908 

Совсем не сложно справиться с массивом символов, не преобразовывая массив в строку. Особенно в том случае, когда длина массива символов известна или может быть легко найдена. С массивом символов длина должна определяться в той же области, что и определение массива, например:

 size_t len sizeof myarray/sizeof *myarray; 

Для струн вы, конечно, имеете доступность.

Имея известную длину, независимо от того, является ли это символьным массивом или строкой, вы можете преобразовать значения символов в число с короткой функцией, аналогичной следующей:

 /* convert character array to integer */ int char2int (char *array, size_t n) { int number = 0; int mult = 1; n = (int)n < 0 ? -n : n; /* quick absolute value check */ /* for each character in array */ while (n--) { /* if not digit or '-', check if number > 0, break or continue */ if ((array[n] < '0' || array[n] > '9') && array[n] != '-') { if (number) break; else continue; } if (array[n] == '-') { /* if '-' if number, negate, break */ if (number) { number = -number; break; } } else { /* convert digit to numeric value */ number += (array[n] - '0') * mult; mult *= 10; } } return number; } 

Выше – это просто стандартный подход преобразования char to int с несколькими дополнительными условными обозначениями. Для обработки бродячих символов, помимо digits и '-' , единственным трюком является выбор разумных решений о том, когда начинать сбор цифр и когда остановиться.

Если вы начнете собирать digits для конверсии, когда вы сталкиваетесь с первой digit , тогда преобразование завершается, когда вы сталкиваетесь с первым '-' или non-digit . Это делает преобразование гораздо более удобным, если вы заинтересованы в индексах, таких как (например, file_0127.txt ).

Краткий пример его использования:

 #include  #include  #include  int char2int (char *array, size_t n); int main (void) { char myarray[4] = {'-','1','2','3'}; char *string = "some-goofy-string-with-123-inside"; char *fname = "file-0123.txt"; size_t mlen = sizeof myarray/sizeof *myarray; size_t slen = strlen (string); size_t flen = strlen (fname); printf ("\n myarray[4] = {'-','1','2','3'};\n\n"); printf (" char2int (myarray, mlen): %d\n\n", char2int (myarray, mlen)); printf (" string = \"some-goofy-string-with-123-inside\";\n\n"); printf (" char2int (string, slen) : %d\n\n", char2int (string, slen)); printf (" fname = \"file-0123.txt\";\n\n"); printf (" char2int (fname, flen) : %d\n\n", char2int (fname, flen)); return 0; } 

Примечание: когда вы сталкиваетесь с индексами файлов с индексом «-» (или тому подобным), вам придется отрицать результат. (например, file-0123.txt по сравнению с file_0123.txt где первый будет возвращать -123 а второй – 123 ).

Пример вывода

 $ ./bin/atoic_array myarray[4] = {'-','1','2','3'}; char2int (myarray, mlen): -123 string = "some-goofy-string-with-123-inside"; char2int (string, slen) : -123 fname = "file-0123.txt"; char2int (fname, flen) : -123 

Примечание: всегда есть угловые случаи и т. Д., Которые могут вызвать проблемы. Это не должно быть на 100% пуленепробиваемым во всех наборах символов и т. Д., Но вместо этого работать в подавляющем большинстве случаев и обеспечивать дополнительную гибкость преобразования без первоначального анализа или преобразования в строку, требуемую atoi или strtol , и т. Д.

  • Как искать строку в массиве
  • Добавление значений в массив C #
  • c ++ array - выражение должно иметь постоянное значение
  • Инициализация массива использует переменную const в C ++
  • Malloc 3-мерный массив в C?
  • Как удалить объекты из массива в Java?
  • Можно ли программно определить размер массива C ++? А если нет, то почему?
  • PHP Удалить элементы из ассоциативного массива
  • Преобразование массива объектов в массив их примитивных типов
  • Отправить массив с HTTP Get
  • NSArray содержит метод Object
  • Давайте будем гением компьютера.