I have written a small piece of code to manipulate strings. In the first function I am checking if the input string is a palindrome. The second function gives a substring from the main string.
Now I have to use these to functions to find the biggest "subpalindrome" in the main string. Unfortunately I have no idea how to do that.
I have already found some code samples which generate substrings but they have not used my two functions "check_palindrome" and "substr". Some tips or a small code sample would be greatly appreciated.
Here is the code:
#include <stdio.h>
#include <stdlib.h>
#define STR_MAX 6 // to define the max amout of letters in the sting
char text[STR_MAX]; //global var
int check_palindrome() {
printf("Is '%s' a palindrome?\n", text);
int begin, middle, end, length = 0;
while (text[length] != '\0' )
length++;
end = length -1;
middle = length/2;
for( begin = 0 ; begin < middle ; begin++ ) {
if ( text[begin] != text[end] ) {
printf("False\n");
break;
}
end--;
}
if( text[begin] == text[middle])
printf("True\n");
return EXIT_SUCCESS;
}
int substr() {
int begin, end = 0;
printf("Enter your starting point: \n");
scanf("%d", &begin);
printf("enter last string: \n");
scanf("%d\n", &end);
printf("Your substring is: \n");
while (begin <= end) {
printf("%c", text[begin]); // loop for my substing from begin to end
begin += 1;
}
printf("\n");
return EXIT_SUCCESS;
}
int main(void) {
// for function check palindrome
printf("Here you can proof if your input is a palindrome\nPut in a string please: ");
fgets(text, STR_MAX, stdin); // i use fgets instead of gets
check_palindrome();
// for function substr
printf("Now you can choose a substring\n");
substr();
return EXIT_SUCCESS;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#define S_(x) #x
#define S(x) S_(x)
#define STR_MAX 64 // to define the max amount of letters in the string
char *biggest_subpalindrome(const char *text);
int main(void){
char text[STR_MAX+1];
printf("Put in a string please: ");
scanf("%" S(STR_MAX) "s", text);
char *subpalindrome = biggest_subpalindrome(text);
if(subpalindrome){
puts(subpalindrome);
free(subpalindrome);
} else {
puts("NOT FIND!");
}
return 0;
}
bool check_palindrome(const char *begin, const char *end){
if(begin == end)
return false;
while(*begin == *end){
++begin;
--end;
}
return begin > end;
}
char *biggest_subpalindrome(const char *text){
const char *begin = text, *end = strrchr(text, *begin);
const char *begin_max;
size_t max_len=0;
while(*begin){
while(begin < end){
if(check_palindrome(begin, end)){
size_t len = end - begin + 1;
if(len > max_len){
max_len = len;
begin_max = begin;
}
break;
}
while(*--end != *begin)
;
}
++begin;
end = strrchr(begin, *begin);
}
if(max_len){
char *ret = calloc(max_len + 1, sizeof(char));
memcpy(ret, begin_max, max_len);
return ret;
}
return NULL;
}