我不确定如何做到这一点。如果有人有一些非常有帮助的专家建议!
#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;
}
答案 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
。