The C Programming Language, 2nd Edition, by Kernighan and Ritchie
Exercise 4.13 on page 88
Write a recursive version of the function reverse(s) , which reverses the string s in place.
Solutions by Gregory Pietsch & Jesse Weinstein
/* EXERCISE 4-13 Gregory Pietsch */ static void swap(char *a, char *b, size_t n) { while (n--) { *a ^= *b; *b ^= *a; *a ^= *b; a++; b++; } } void my_memrev(char *s, size_t n) { switch (n) { case 0: case 1: break; case 2: case 3: swap(s, s + n - 1, 1); break; default: my_memrev(s, n / 2); my_memrev(s + ((n + 1) / 2), n / 2); swap(s, s + ((n + 1) / 2), n / 2); break; } } void reverse(char *s) { char *p; for (p = s; *p; p++) ; my_memrev(s, (size_t)(p - s)); }
Jesse Weinstein's solution:
/* Recursive string reverse function, without using any setup-wrapper function. Released by Jesse Weinstein, Tue Jul 10 12:37:50 2007 */ void shift(char *s); void reverse(char *s); void reverse(char *s) { int len; for (len = -1; s[++len] != '\0'; ) ; if (s[len-1] == '\n') len--; #ifdef DEBUG printf("len:%i, s:%s\n", len, s); #endif if (len > 0) { reverse(&s[1]); } if (len > 1) { shift(s); } #ifdef DEBUG printf("<= len:%i, s:%s\n", len, s); #endif } void shift(char *s) { int i; char tmp; tmp = s[0]; for (i = 0; s[i+1] != '\0'; i++) { s[i] = s[i+1]; } s[i] = tmp; /* i is set to the character before the \0; the last time through the loop sets s[i] to '\0' */ } int main(void) { char in[] = "Hello, world!"; printf("Input: \"%s\"\n", in); reverse(in); printf("Reversed: \"%s\"\n", in); reverse(in); printf("Twice reversed: \"%s\"\n", in); return 0; }
These examples are far too complex, here is my basic submission (David Kachlon)
#include <stdio.h> #include <string.h> int reverse(char v[], int i, int j) { int temp; if(j == 1) return 1; temp = v[i]; v[i] = v[j]; v[j] = temp; reverse(v, ++i, --j); } main() { char test[] = "David"; reverse(test, 0, strlen(test)-1); printf("%s", test); }
Added my simple method (Cheng Qi)
#include <stdio.h> #include <string.h> int reverse(char v[], int index, int length); main(){ char test[] = "iqgnehc"; reverse(test, 0, strlen(test) - 1); printf("reversed string is %s\n: ", test); return 0; } int reverse(char v[], int index, int length){ if(2 * index > length) return 0; char temp; temp = v[index]; v[index] = v[length - index]; v[length - index] = temp; reverse(v, ++index, length); }










