PDA

View Full Version : Spaces check in a Palindrome checking recursive algo.


Peon666
Dec4-09, 12:15 PM
Hi all.

I have a little problem with a code that checks whether an input string is a palindrome or not. But my problem is that it does not check for the spaces, and I want it to do so.

Here's the code:

#include <stdio.h>
#include <string.h>



int isPalindrome (char *str)
{
static int length = strlen (str);
if (length<1)
return 1;
if (str[0] == str[length-1])
{
length -= 2;
return isPalindrome (str+1);/*Recursive call as the function isPalindrome
is called again within itself*/
}
else return 0;
}


int main (void)
{
int result;
char str[256];
printf ("\nPlease type a string: \n");
gets (str);/*Input a string to check whether it is a palindrome or not*/

result = isPalindrome (str);/*The function isPalindrome is called.It takes a string
argument and returns a value 0 or 1 which is stored in
the integer variable "result"*/
if (result==1)
printf ("\n******Input string is a palindrome string.************\n");
else
printf ("\n******Not a palindrome******\n");
return 1;
}


For example, if the input string is:

a man a plan a canal panama

It says that this is NOT a palindrome (spaces problem). I'd be really helpful if anyone sorts this out for me.

Thanks.

Mark44
Dec4-09, 12:34 PM
How about if you preprocessed the string to remove spaces before passing it to your isPalindrome function? A removeSpaces function could take two strings (pointers to char) as parameters, with one string the input string and the other contained all the nonspace characters of the first string.

kote
Dec4-09, 01:09 PM
Is this a common programming assignment? The similar threads below show that it's been asked about before :smile:.

But yeah, I like the preprocessing idea.

Peon666
Dec4-09, 04:36 PM
Alright. Here's a bit modified code and it works right:

int isPalindrome (char *str)
{
static int length = strlen (str);
if (length<1)
return 1;
if (str[0] == ' ')
{
str++;
length -= 1;
return isPalindrome(str);
}
if (str[length-1] == ' ')
{
length -= 1;
return isPalindrome(str);
}
if (str[0] == str[length-1])
{
length -= 2;
return isPalindrome (str+1);/*Recursive call as the function isPalindrome
is called again within itself*/
}
else return 0;
}


I've encountered another bit of problem, while running the code in VC++ 6.0. It was fine when I was running it in Code Blocks but in VC it gives the following error with this statement:

Code:

static int length = strlen (str);

ERROR: Initializer is not a constant.

But when I remove the 'static', the output is not right. What should I do?

kote
Dec4-09, 04:43 PM
Does the space removal have to be in the same recursive function? Can you just remove the spaces before feeding it to your isPalindrome?

Peon666
Dec4-09, 04:50 PM
It can be in a separate function and spaces can be removed any way.

kote
Dec4-09, 04:53 PM
It can be in a separate function and spaces can be removed any way.

So try that? :smile: If your original function was working except for the spaces, it might be easier to build on if you leave that part relatively intact. Debugging can sometimes be simplified when you keep things "modular" and build in pieces.

Mark44
Dec5-09, 01:41 AM
Alright. Here's a bit modified code and it works right:

int isPalindrome (char *str)
{
static int length = strlen (str);
if (length<1)
return 1;
if (str[0] == ' ')
{
str++;
length -= 1;
return isPalindrome(str);
}
if (str[length-1] == ' ')
{
length -= 1;
return isPalindrome(str);
}
if (str[0] == str[length-1])
{
length -= 2;
return isPalindrome (str+1);/*Recursive call as the function isPalindrome
is called again within itself*/
}
else return 0;
}


I've encountered another bit of problem, while running the code in VC++ 6.0. It was fine when I was running it in Code Blocks but in VC it gives the following error with this statement:

Code:

static int length = strlen (str);

ERROR: Initializer is not a constant.

But when I remove the 'static', the output is not right. What should I do?
That was something I noticed before but didn't comment on. Why do you have length being static? I can't think of any good reason for this variable to be static.