将数组增加到一定数量

我有一个整数数组(代表一个4位数字),我需要递增,以便每个整数永远不会高于3.基本上,它需要打印每个4位数字,其中没有4或更高。 这是我期望与实际输出相比的输出:

Expected: 0000 0001 0002 0003 0010 0011 0012 0013 0020 0021 0022 .... 3333 Received: 0000 1000 2000 3000 3100 3200 3300 3310 3320 3330 3331 3332 

我知道我的算法搞砸了,但我不知道该怎么做:

 int i, c[4]; memset(c, 0, sizeof(c)); i = 0; while (1) { testprint(c); c[i]++; if (c[i] == 3) i++; if (i == 3) break; } 

所有testprint都显示数组中的每个数字。 那么我应该如何更改代码以正确增加数组? 我甚至需要使用数组吗? 没有一个我怎么做?

您可以使用函数将数字转换为其在基数4中的表示forms(即:仅使用数字0,1,2和3):

 #include  char *itoa4(unsigned value, char *dest, int digits) { dest[digits] = '\0'; while (digits-- > 0) { dest[digits] = '0' + value % 4; value /= 4; } return dest; } int main(void) { char buf[5]; for (int i = 0; i < 256; i++) { printf("%s\n", itoa4(i, buf, 4)); } return 0; } 

好吧,我在@chqrlie的帮助下找到了答案:

 int *ito4(int value, int dest[]) { int i = 4; while (i-- > 0) { dest[i] = value % 4; value /= 4; } return dest; } int main(void) { int i, arr[4]; for (i = 0; i < 256; i++) print_array(ito4(i, buf), 4); return 0; } 

为此,您根本不需要使用数组。 你如何选择代表价值和价值本身是两回事。

相同的值,例如10,可以用你想要的任何不同的基数表示,它在基数10中为10,在基数16中为0xA ,在基数8 12 ,依此类推。

同时将值增加1可在每个基础下运行。 假设您可以轻松地格式化unsigned integer将其打印为base4数字。

请注意,使用(value >> (i*2)) & 0x3提取第i个数字,然后一切都变得微不足道。