/* Programmed by Kurt Normark, April 2003 */ #include <stdio.h> int is_palindrome_len(char *str, int lgt); int is_palindrome(char *str){ int lgt = strlen(str); return is_palindrome_len(str, lgt); } int is_palindrome_len(char *str, int lgt){ int result; if (lgt >= 2) result = str[0] == str[lgt-1] && is_palindrome_len(str+1, lgt-2); else result = 1; return result; } int main(void) { char str[100]; do{ printf("Enter string: "); scanf("%s", str); if (strcmp(str,"exit") != 0){ if (is_palindrome(str)) printf("%s is a palindrome\n", str); else printf("%s is NOT a palindrome\n", str); } } while (strcmp(str,"exit") != 0); return 0; }
![]() | In this dissection we explain the predicate (boolean function) which finds out if a string is a palindrome. A palindrome reads the same both forward and backward. |
![]() | int is_palindrome(char *str){ int lgt = strlen(str); return is_palindrome_len(str, lgt); } |
The function is_palindrome uses a helping function is_palindrome_len, which also takes the string length as a parameter. The helping function is programmed in order to avoid repeated calculations of the length of the palindrome candiate string. |
![]() | int is_palindrome_len(char *str, int lgt){ int result; if (lgt >= 2) result = str[0] == str[lgt-1] && is_palindrome_len(str+1, lgt-2); else result = 1; return result; } |
The function is_palindrome_len does the real work. First, if the length of the string is less than two, the string is always considered as a palindrome. In that case, we just return true (1). In case the string length is 2 or more, the string is a palindrome if the first and last letter in the string are equal, and if the 'middle part of the string' recursively is a palindrome. As an example, the middle part of the string "computer" is "ompute". Notice the way we use pointer arithmetic to find the middle part of a string. |
![]() | int main(void) { char str[100]; do{ printf("Enter string: "); scanf("%s", str); if (strcmp(str,"exit") != 0){ if (is_palindrome(str)) printf("%s is a palindrome\n", str); else printf("%s is NOT a palindrome\n", str); } } while (strcmp(str,"exit") != 0); return 0; } |
In the main function we prompt the user for a string which is exercised for the palindrome property. Around this we have a simple loop, which terminates if we enter the string "exit". |