C Exercises: String is a palindrome or not
Write a C program to check if a string (case-sensitive) is a palindrome or not using a callback function.
Sample Solution:
C Code:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// Define a function pointer type that takes two characters and returns an integer.
typedef int( * compare_func_t)(char, char);
// This function checks if a given string is a palindrome.
// It takes a string, its length, and a function pointer as arguments.
int is_palindrome(char * str, size_t len, compare_func_t compare) {
// Loop through the first half of the string.
for (size_t i = 0; i < len / 2; i++) {
// Compare the i-th character from the start and end of the string using the provided comparison function.
// If they are not equal, the string is not a palindrome.
if (compare(str[i], str[len - i - 1]) != 0) {
return 0;
}
}
// If we make it through the loop without finding any non-matching characters, the string is a palindrome.
return 1;
}
// This function compares two characters in a case-sensitive manner.
// It returns -1 if the first character is less than the second, 0 if they are equal, and 1 if the first character is greater than the second.
int compare_chars(char a, char b) {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
}
// This function compares two characters in a case-insensitive manner.
// It returns -1 if the first character is less than the second, 0 if they are equal, and 1 if the first character is greater than the second.
// The function uses the tolower() function to convert the characters to lowercase before comparing them.
int compare_case_insensitive(char a, char b) {
a = tolower(a);
b = tolower(b);
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
}
int main() {
char str1[] = "Madam";
size_t len = strlen(str1);
printf("String: %s", str1);
// Test the string for palindrome-ness using the case-sensitive comparison function.
if (is_palindrome(str1, len, compare_chars)) {
printf("%s is a palindrome (case-sensitive).\n", str1);
} else {
printf("\n%s is not a palindrome (case-sensitive).\n", str1);
}
// Test the string for palindrome-ness using the case-insensitive comparison function.
if (is_palindrome(str1, len, compare_case_insensitive)) {
printf("%s is a palindrome (case-insensitive).\n", str1);
} else {
printf("%s is not a palindrome (case-insensitive).\n", str1);
}
char str2[] = "aba";
len = strlen(str2);
printf("\nString: %s", str2);
// Test the string for palindrome-ness using the case-sensitive comparison function.
if (is_palindrome(str2, len, compare_chars)) {
printf("\n%s is a palindrome (case-sensitive).\n", str2);
} else {
printf("\n%s is not a palindrome (case-nsensitive).\n", str2);
}
// Test the string for palindrome-ness using the case-insensitive comparison function.
if (is_palindrome(str2, len, compare_case_insensitive)) {
printf("%s is a palindrome (case-insensitive).\n", str2);
} else {
printf("%s is not a palindrome (case-insensitive).\n", str2);
}
return 0;
}
Sample Output:
String: Madam Madam is not a palindrome (case-sensitive). Madam is a palindrome (case-insensitive). String: aba aba is a palindrome (case-sensitive). aba is a palindrome (case-insensitive).
Explanation:
The above program defines three functions: is_palindrome(), compare_chars(), and compare_case_insensitive(). It also defines a function pointer type called compare_func_t.
is_palindrome() takes a string, its length, and a function pointer as arguments. It checks if the string is a palindrome by comparing its characters using the provided comparison function. The function returns 1 if the string is a palindrome, and 0 otherwise.
compare_chars() and compare_case_insensitive() are comparison functions that take two characters as arguments and return an integer (-1, 0, or 1) based on their relative values.
Flowchart:
C Programming Code Editor:
Previous: Sum or product of an array of integers.
Next: Convert a string to uppercase or lowercase.
What is the difficulty level of this exercise?
Test your Programming skills with w3resource's quiz.
- Weekly Trends and Language Statistics
- Weekly Trends and Language Statistics