-5

My program in C which is Palindrome has an error in its function. My function is not comparing the 2 characters in my string. When I type a single character it answers palindrome but if it is two or more always not palindrome.

Code:

          int IntStrlength=strlen(StrWord);
          int IntCtr2=0;
          int IntCtr=1, IntAnswer;
          while(IntCtr<=(IntStrlength/2)){
                printf(" %d %d\n", IntCtr2,IntStrlength);
               if(StrWord[IntStrlength] != StrWord[IntCtr2]){
                  IntAnswer=0;
                  printf(" %d=Not Palindrome", IntAnswer);
                  exit (0);
                 }//if(StrWord[IntCtr2]!=StrWord[IntStrlength]) <---------
               else{
                  IntCtr2++;
                  IntStrlength--;
                  }// else <--------
               IntCtr++;
          }//while(IntCtr<IntStrlength/2) <-----------
          IntAnswer=1;
          printf(" %d=Palindrome", IntAnswer);
          return ;

}

Single character:

Two or more characters:

  • 2
    http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Biffen Jan 14 '16 at 07:47
  • I cant still find the problem –  Jan 14 '16 at 07:59
  • 1
    You're not showing us nearly enough code. What's `IntCtr2`?! To what are `IntCtr` and `IntStrlength` initialised? – Biffen Jan 14 '16 at 08:01
  • Sorry , and advance thank you –  Jan 14 '16 at 08:05
  • 2
    your counters are messed up. for example you always take `StrWord[IntStrlength]`. And you should use only one counter. And your counter should start at index 0... – Chris Maes Jan 14 '16 at 08:10
  • 2
    `StrWord[IntStrLength]` is the terminating null character in the first iteration. The use of `IntCtr` and `IntCtr2` is very confusing; perhaps you need just one variable here? And your program flow is strange. When the word is a palindrome you exit? That's really quick and dirty. Make the palindrome check into a function and treturn 0 or 1 accordingly. – M Oehm Jan 14 '16 at 08:12

8 Answers8

2

Why not write it like this

int wordLength = strlen(StrWord);
for (int i=0;i<(wordLength/2);i++) {
    if (StrWord[i] != StrWord[wordLength-i-1]) {
        return 0;
    }
}

return 1;

For words with an even length (say 8) the counter will go from 0 to 3, accessing all letters. For uneven words (say 7) the c ounter will go from 0 to 2, leaving the middle element unchecked. This is not necessary since its a palindrome and it always matches itself

Houbie
  • 1,406
  • 1
  • 13
  • 25
  • The first time you execute the wile loop this check is done: if(StrWord[IntStrlength] != StrWord[IntCtr2]) IntStrlength is 1 based, not 0. so this will get the terminating character of the string, and compare it to the first letter. this check will always fail. you must use IntStrlength-1 – Houbie Jan 14 '16 at 16:30
1
#include<stdio.h>
int check_palindrom(char *);
int main()
{
        char s1[20];
        printf("Enter the string...\n");
        gets(s1);

        int x;
        x=check_palindrom(s1);
        x?printf("Palindrom\n"):printf("Not Palindrom\n");
}
int check_palindrom(char *s)
{
        int i,j;
        for(i=0;s[i];i++);

        for(i=i-1,j=0;i>j;i--,j++)
                if(s[i]!=s[j])
                        return 0;
        if(s[i]==s[j])
                return 1;
}

Enter the string...

radar

Palindrom

1

I've seen this algorithm before in a interview book called "Cracking the Coding Interview".

In it the author shows a very simple and easy implementation of the code. The code is below: Also here is a video explaining the code.

#include<stdio.h>
#include<string.h> // strlen()

void isPalindrome(char str[]);

int main(){

    isPalindrome("MOM");
    isPalindrome("M");
    return 0;
}




void isPalindrome(char str[]){

    int lm = 0;//left most index
    int rm = strlen(str) - 1;//right most index

    while(rm > lm){

        if(str[lm++] != str[rm--]){

            printf("No, %s is NOT a palindrome \n", str);
            return;
        }

    }

    printf("Yes, %s is a palindrome because the word reversed is the same \n", str);

}
tempmail
  • 166
  • 1
  • 5
0

Take a look at this code, that's how I have implemented it (remember to #include <stdbool.h> or it will not work):

for(i = 0; i < string_length; i++)
    {
            if(sentence[i] == sentence[string_lenght-1-i])
                    palindrome = true;
            else
            {
                    palindrome = false;
                    break;
            }
    }

Doing that it will check if your sentence is palindrome and, at the first occurence this is not true it will break the for loop. You can use something like

if(palindrome)
     printf(..);
else
     printf(..);

for a simple prompt for the user.

Example :

radar is palindrome

abba is palindrome

abcabc is not palindrome

Please , pay attention to the fact that

Abba

is not recognized as a palindrome due to the fact that ' A ' and 'a' have different ASCII codes :

'A' has the value of 65

'a' has the value of 97 according to the ASCII table. You can find out more here.

You can avoid this issue trasforming all the characters of the string to lower case characters. You can do this including the <ctype.h> library and calling the function int tolower(int c); like that :

for ( ; *p; ++p) *p = tolower(*p);

or

for(int i = 0; str[i]; i++){
  str[i] = tolower(str[i]);
}

Code by Earlz, take a look at this Q&A to look deeper into that.

EDIT : I made a simple program to do this, see if it can help you

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <ctype.h>

void LowerCharacters(char *word, int word_lenth);

int main(void){

    char *word = (char *) malloc(10);
    bool palindrome = false;

    if(word == 0)
    {
        printf("\nERROR : Out of memory.\n\n");
        return 1;
    }

    printf("\nEnter a word to check if it is palindrome or not : ");
    scanf("%s", word);

    int word_length = strlen(word);

    LowerCharacters(word,word_length);

    for(int i = 0; i < word_length; i++)
    {
        if(word[i] == word[word_length-1-i])
            palindrome = true;
        else
        {
            palindrome = false;
            break;
        }
    }

    palindrome ? printf("\nThe word %s is palindrome.\n\n", word) : printf("\nThe word %s is not palindrome.\n\n", word);

    free(word);

return 0;

}

void LowerCharacters(char *word, int word_length){

    for(int i = 0; i < word_length; i++)
        word[i] = tolower(word[i]);
}

Input :

Enter a word to check if it is palindrome or not : RadaR

Output :

The word radar is palindrome.

Community
  • 1
  • 1
Claudio Cortese
  • 1,372
  • 2
  • 10
  • 21
0

You can do this like this:

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

int check_palindrome(char string []);
int main()
{
        char string[20];
        printf("Enter the string...\n");
        scanf ("%s", &string);

        int check;
        check = check_palindrome (string);
        if (check == 0)
            printf ("Not Palindrome\n");
        else
            printf ("Palindrome\n");
        return 0;
}
int check_palindrome (char string [])
{
        char duplicate [];
        strcpy (string, duplicate);
        strrev (string);
        if (strcmp (string, duplicate) == 0)
           return 1;
        else
           return 0;
}

This uses the strcmp and strrev function.

Box Box Box Box
  • 5,094
  • 10
  • 49
  • 67
0

This code may help you to understand the concept:

#include<stdio.h>
int main()
{
 char str[50];
 int i,j,flag=1;
 printf("Enter the string");
 gets(str);
 for(i=0;str[i]!='\0';i++);
 for(i=i-1,j=0;j<i;j++,i--)
 {
    str[i]=str[i]+str[j];
    str[j]=str[i]-str[j];
    str[i]=str[i]-str[j];
 }
 for(i=0;str[i]!='\0';i++);
 for(i=i-1,j=0;j<i;j++,i--)
 {
    if(str[i]==str[j]){
        flag=0;
        break;
    }
 }if(flag==0)
 {
    printf("Palindrome");
 }else
 { 
    printf("Not Palindrome");
 }

}

0
I have solution for this    
char a[]="abbba";
int i,j,b=strlen(a),flag=0;
          for(i=0,j=0; i<b; i++,j++)
          {
              if(a[i]!=a[b-j-1])
              {
               flag=1;
               break;
              } 
          }
        if(flag)
        {

                      printf("the string is not palindrum");
        }
        else
              {
                      printf("the string is  palindrum");
        }
-1

This may works for you

 #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        setbuf(stdout,NULL);
        int i,limit;
        char string1[10];
        int flag=0;
    
    
        printf("enter a string");
        scanf("%s",string1);
        limit=strlen(string1);
        for(i=0;i<limit;i++){
            if(string1[i]!=string1[limit-i-1]){
                flag=1;
                break;
            }
    
        }   if(flag==1){
            printf("entered string is not  palindrome");
        }else{
            printf("entered string is  palindrome");
        }
    
    
    
    
        return EXIT_SUCCESS;
    }