如何将数组定义为一串数字的长度?

时间:2015-02-25 09:50:29

标签: c arrays string

我不确定如何做到这一点。如果有人有一些非常有帮助的专家建议!

#define SIZE ((int) (sizeof(digit_count)/sizeof(digit_count[0]))
#define N count

int main()
{
    int i, num, count, digit_count[N] = {0};

   printf("Enter a number: ");
   scanf("%d", &num);

   while (num != 0)
   {
      digit_count[num % 10]++;
      num /= 10;
      ++count;
   }

 for (i = 0; i < SIZE); i++)
        printf("%d occured %d times\n", i, digit_count[i]);

   return 0;
}

2 个答案:

答案 0 :(得分:0)

使用malloc

int main()
{
   int base = 10;
   int num, *digit_count;

   printf("Enter a number: ");
   scanf("%d", &num);

   digit_count = malloc (base * sizeof (int));
   if (!digit_count)
       return -1;

   while (num != 0)
   {
      digit_count[num % base]++;
      num /= base;
   }

   for (i = 0; i < base); i++)
        printf("%d occurred %d times\n", i, digit_count[i]);

   free(digit_count);
   return 0;
}

由于总有十位数字,因此没有理由在此处使用动态内存分配,但如果您需要分配的条目数在运行时更改,则此处使用的相同模式也可以正常工作。您可以在运行时进行base更改,程序仍然有效。

答案 1 :(得分:0)

您的特定问题

对于这种特殊情况,您不需要数字与数字一样多的元素数组,您需要一个包含10个元素的数组:

int digit_count[10] = { 0 };

...

    // num % 10 is never larger than 9.
    digit_count[num % 10]++;

顺便说一下,最好在unsigned int num中使用"%u"scanf,因为当num % 10为负时,这仍然会对负数产生误导(对于C99及更高版本)或具有未指定的值(较旧的C)。

足够长的数组来保存数字

的数字

如果有一天你需要一个足够大的数组来容纳一个数字的所有个别数字,我的建议是使用上限;也就是说:足够的空间来容纳数据类型可以容纳的最长数字。超出兆比特整数的近似值(即,您遇到的所有内容)

#define MAX_DIGITS10(type) (2 + sizeof(type) * CHAR_BIT * 643L / 2136)

...

int digits[MAX_DIGITS10(int)];

这是有效的,因为643L / 2136是log 10 (2)的合适近似值。

该方法无耻地从GNU的libstdc ++中取消,后者使用

#define __glibcxx_max_digits10(T) \
  (2 + (T) * 643L / 2136)

在C ++标准库头文件<limits>中。

可变长度的数组

如果您有一天需要一个真正可变长度的数组,则必须在分配数组之前计算长度。计算完长度后,C99及更高版本(具有可变长度数组)可以让您简单地编写

size_t calculated_length = calculate_length();
int vla[calculated_length] = { 0 };

// vla goes out of scope like normal arrays; no cleanup necessary

在C89之前,您必须使用malloc(或calloc)和free

size_t calculated_length = calculate_length();

int *heap_array = calloc(calculated_length, sizeof(int));
// or:
int *heap_array = malloc(calculated_length * sizeof(int));

// and when you're done:

free(heap_array);

请注意,malloc由您来检查calculated_length * sizeof(int)是否未溢出(大多数calloc实施内部执行此操作)以及calloc零初始化内存而malloc没有。这使得calloc自然有点慢,但在不存在问题的情况下,我的建议是优先于malloc

当数组不需要超出声明范围时,VLA可以说是优越的,但你应该知道你不能使用大于线程堆栈的VLA,这通常仅限于一个还有几兆字节。对于大型数组,必须使用* alloc函数。