w3resource

C Exercises: String is a palindrome or not


4. Palindrome String Callback Variants

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:

Flowchart: String is a palindrome or not.
Flowchart: String is a palindrome or not.

For more Practice: Solve these Related Problems:

  • Write a C program to check if a string is a palindrome by reversing it using a callback function.
  • Write a C program to determine if a string is a palindrome after removing all non-alphanumeric characters via a callback.
  • Write a C program to compare a string with its reversed copy using a callback function for character comparison.
  • Write a C program to check if a string is a palindrome using a callback that applies a custom case-insensitive comparator.

Go to:


PREV : Sum/Product Callback Variants.
NEXT : String Case Conversion Callback Variants.

C Programming Code Editor:



Improve this sample solution and post your code through Disqus.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Follow us on Facebook and Twitter for latest update.