Z premedytacją nie usunę niedoskonałości związanej z wyprowadzeniem przecinka na końcu listy. Zrób to sam..
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
// Zakładam że nie będziesz miał tablic większych niż 63 elementy...
void letters_generate(const char * table, size_t size) {
uint64_t mask = (1 << size) - 1;
size_t counter = 0;
do {
putchar('{');
for(uint64_t shift_index = 0; shift_index < size; ++shift_index) {
if(counter & (1 << shift_index)) {
putchar(table[shift_index]);
putchar(',');
}
}
puts("}");
} while((++counter & mask));
}
int main(void) {
char letters[] = { 'a', 'b', 'c' };
size_t array_size = sizeof(letters) / sizeof(letters[0]);
letters_generate(letters, array_size);
return EXIT_SUCCESS;
}
Wynik:
{}
{a,}
{b,}
{a,b,}
{c,}
{a,c,}
{b,c,}
{a,b,c,}