преобразовать целое число в массив

c arrays

77412 просмотра

9 ответа

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

т.е. если у меня есть

int number = 5400

Как я могу добраться до

int numberArray[4]

где

numberArray[0] = 0;
numberArray[1] = 0;
numberArray[2] = 4;
numberArray[3] = 5;

Любые предложения с благодарностью принимаются.

Автор: droseman Источник Размещён: 12.11.2019 09:25

Ответы (9)


13 плюса

Решение

Это будет работать для чисел> = 0

#include <math.h>

char * convertNumberIntoArray(unsigned int number) {
    int length = (int)floor(log10((float)number)) + 1;
    char * arr = new char[length];
    int i = 0;
    do {
        arr[i] = number % 10;
        number /= 10;
        i++;
    } while (number != 0);
    return arr;
}

РЕДАКТИРОВАТЬ: Просто немного больше стиля C, но более загадочным.

#include <math.h>

char * convertNumberIntoArray(unsigned int number) {
    unsigned int length = (int)(log10((float)number)) + 1;
    char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
    do {
        *curr++ = number % 10;
        number /= 10;
    } while (number != 0);
    return arr;
}
Автор: vava Размещён: 05.02.2009 12:15

12 плюса

Подсказка: взгляните на этот предыдущий вопрос " Сумма цифр в C # ". Он объясняет, как извлечь цифры в числе, используя несколько методов, некоторые из которых имеют отношение к C.

Из ответа Грега Хьюгилла :

/* count number of digits */
int c = 0; /* digit position */
int n = number;

while (n != 0)
{
    n /= 10;
    c++;
}

int numberArray[c];

c = 0;    
n = number;

/* extract each digit */
while (n != 0)
{
    numberArray[c] = n % 10;
    n /= 10;
    c++;
}
Автор: Zach Scrivena Размещён: 05.02.2009 12:02

7 плюса

Вы можете вычислить количество цифр в целом числе с логарифмом, а не в цикле. Таким образом,

int * toArray(int number)
{
    int n = log10(number) + 1;
    int i;
    int *numberArray = calloc(n, sizeof(int));
    for ( i = 0; i < n; ++i, number /= 10 )
    {
        numberArray[i] = number % 10;
    }
    return numberArray;
}
Автор: Christoffer Размещён: 05.02.2009 02:06

1 плюс

Выяснить количество цифр сложно, но при условии, что это всегда 4 цифры, вы можете сделать:

for (i = 0; i < 4; i++) {
  numberArray[i] = number%10;
  number = number div 10;
}
Автор: Mark Pim Размещён: 05.02.2009 12:05

1 плюс

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

// returns the number of digits converted
// stores the digits in reverse order (smalles digit first)
// precondition: outputdigits is big enough to store all digits.
//
int convert( int number, int* outputdigits, int* signdigit ) {

  int* workingdigits = outputdigits;

  int sign = 1;
  if( number < 0 ) { *signdigit = -1; number *= -1; }
  ++workingdigits;

  for ( ; number > 0; ++ workingdigits ) {
    *workingdigits = number % 10;
    number = number / 10;
  }

  return workingdigits - outputdigits;
}

void printdigits( int* digits, int size, int signdigit ) {
  if( signdigit < 0 ) printf( "-" );

  for( int* digit = digits+size-1; digit >= digits; --digit ){
    printf( "%d", *digit );
  }
}

int main() {
   int digits[10];
   int signdigit;
   printdigits( digits, convert( 10, digits, &signdigit ), signdigit );
   printdigits( digits, convert( -10, digits, &signdigit ), signdigit );
   printdigits( digits, convert( 1005, digits, &signdigit ), signdigit );

}
Автор: xtofl Размещён: 05.02.2009 12:46

1 плюс

Попробуй это,

void initialise_array(int *a, int size, int num) {
    for (int i = 0; i < size; ++i, num /= 10)
        a[(size - 1) - i] = num % 10;
}
Автор: Dylan R Coss Размещён: 04.11.2015 02:16

0 плюса

Код C:

/* one decimal digit takes a few more than 3 bits. (2^3=8, 2^4=16) */
int digits[(sizeof (int) * CHAR_BIT) / 3 + 1], 
    *digitsp = digits;
do {
    *digitsp++ = number % 10;
    number /= 10;
} while(number > 0);

Вы увидите, сколько цифр вы преобразовали, взяв разницу

digitsp - digits

Если вы хотите поместить это в функцию:

#define MIN_DIGITS_IN_INT ((sizeof (int) * CHAR_BIT) / 3 + 1)

int to_array(int number, int *digits) {
    int *digitsp = digits;
    do {
        *digitsp++ = number % 10;
        number /= 10;
    } while(number > 0);
    return digitsp - digits;
}

int main() {
    int number = rand();
    int digits[MIN_DIGITS_IN_INT];
    int n = to_array(number, digits);

    /* test whether we're right */
    while(n-- > 0) 
        printf("%d", digits[n]);
    }
    printf(" = %d\n", number);
}

В этом случае я предпочитаю автоматические массивы динамическому распределению памяти, так как это проще сделать правильно и случайно не просочиться.

Автор: Johannes Schaub - litb Размещён: 05.02.2009 12:24

0 плюса

используя код Вадима, я создал следующую тестовую программу:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

char * convertNumberIntoArray(unsigned int number) {
    unsigned int length = (int)(log10((float)number)) + 1;
    char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
    do {
        *curr++ = number % 10;
        number /= 10;
    } while (number != 0);
    return arr;
}



int main(void)
{
    int InputNumber;
    int arr[5];

    printf("enter number: \n");
    scanf("%d", &InputNumber);

    convertNumberIntoArray(InputNumber);

    printf("The number components are: %d %d %d\n", arr[0],arr[1],arr[2]);

    system("PAUSE");    
    return 0;
}

но вывод мусор. Кто-нибудь может посоветовать, если я сделал что-то глупое здесь?

/***** output *****/
enter number:
501
The number components are: 2009291924 2009145456 -1
Press any key to continue . . .

--dave

Автор: droseman Размещён: 05.02.2009 03:38

0 плюса

#include <stdio.h>
#include <string.h>

int main(void)
{
  int i, inputNumber;
  char* charArray;

  printf("\nEnter number: ");
  scanf("%d", &inputNumber);

  /* converts int to print buffer which is char array */
  sprintf(charArray, "%d", inputNumber); 
  int size = strlen(charArray);

  int intArray[size];

  for (i = 0; i < size; i++)
  {
    intArray[i] = charArray[i] - '0';
  }

  return 0;
}
Автор: Praveen Manupati Размещён: 09.02.2019 11:51
Вопросы из категории :
32x32