#include #include #include #define NSCRAMBLERS 4 struct scramble { char* (*run)(char*); char* (*undo)(char*); }; char* shift(char *word){ register size_t wordlen = strlen(word); char *shifted = malloc(sizeof(char) * (wordlen + 1)); for(int i = 0; i < wordlen - 1; i++) shifted[i+1] = word[i]; shifted[0] = word[wordlen - 1]; shifted[wordlen] = 0; return shifted; } char* unshift(char *word){ register size_t wordlen = strlen(word); char *shifted = malloc(sizeof(char) * (wordlen + 1)); for(int i = 0; i < wordlen - 1; i++) shifted[i] = word[i+1]; shifted[wordlen-1] = word[0]; shifted[wordlen] = 0; return shifted; } char* reverse(char *word){ register size_t wordlen = strlen(word); char *reversed = malloc(sizeof(char) * (wordlen + 1)); for(int i = 0; i < wordlen; i++) reversed[wordlen - i - 1] = word[i]; reversed[wordlen] = 0; return reversed; } char* firstlast(char *word){ char *product = malloc(sizeof(char) * (strlen(word) + 1)); strcpy(product, word); product[0] = word[strlen(word)-1]; product[strlen(word) - 1] = word[0]; return product; } char* copy(char *word){ char *c = malloc(sizeof(char) * (strlen(word)+1)); strcpy(c, word); return c; } const struct scramble shifts = {shift, unshift}; const struct scramble reverser = {reverse, reverse}; const struct scramble endswap = {firstlast, firstlast}; const struct scramble donothing = {copy, copy}; //char* (*list_of_scramblers[])(char*) = {reverse, firstlast, copy, shift}; struct scramble scramblers[] = {shifts, reverser, endswap, donothing}; char** scrambles(char* word){ char **scramble_pointers = malloc(sizeof(char*) * NSCRAMBLERS); for(int i = 0; i < NSCRAMBLERS; i++) scramble_pointers[i] = scramblers[i].run(word); return scramble_pointers; } int main(){ char ** sp = scrambles("giraffe"); for(int i = 0; i < NSCRAMBLERS; i++) printf("sc[i] = %s\n", sp[i]); for(char **sc = sp; sc < sp + NSCRAMBLERS; sc++) puts(*sc); for(int i = 0; i < NSCRAMBLERS; i++){ char *unscramble = scramblers[i].undo(sp[i]); printf("Unscramble %d: %s\n", i, unscramble); free(unscramble); } for(int i = 0; i < NSCRAMBLERS; i++) free(sp[i]); free(sp); return 0; }