Home > OS >  Finding palindrome in C
Finding palindrome in C

Time:02-10

A palindrome is a word that reads the same from left to right and from right to left. I wrote a program that finds palindromes from a console.

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

#define SIZE 100

int main() {
    int i = 0, c;
    int left, right;
    char string[SIZE];

    while (EOF != (c = getchar()) || (c = getchar()) != '\n') {
        if (isspace(c) != 0) {
            if (i > 0) {
                left = 0;
                right = i - 1;
                while (right > left) {
                    if (string[left] != string[right]) {
                        i = 0;
                        break;
                    }
                      left;
                    --right;
                }
                if (left >= right) {
                    while (i > 0)
                        printf("%c", string[--i]);
                    printf("%c", c);
                }
                i = 0;
            }
            if (c == '\n')
                break;
        }
        else {
            string[i  ] = c;
        }
    }
}

For example, we enter the words: dad sad mum. She outputs: dad mum. But if we write dad sad or dad mum sad. The output will be: dad mum. That is, an extra space is printed when the last word we read is not a palindrome. How can you get around this situation?

CodePudding user response:

Code is convoluted

First read input properly and form a string.

for (i = 0; i < SIZE - 1; i  ) [
  int ch = getchar();
  if (ch == EOF || ch == '\n') {
    break;
  }
  string[i  ] = (char) ch;
}
string[i] = 0;

Then process the string in string[]. Only print spaces when needed.

const char *separator = "";
int i = 0;
while (string[i]) {
  // Beginning of a word?
  if (!isspace(string[i])) {
    int start = i;
    int end = i;
    while (!isspace(string[end 1]) && string[end 1]) {
      end  ;
    }
    // At this point, start indexes the 1st char of the word
    // and end indexes the last char of the word
    // Now find if a palindrome
    
    while (start <= end && string[start] == string[end]) {
      start  ;
      end--;
    }

    // Found a palindrome?
    if (start > end) {
      fputs(separator, stdout);
      separator = " ";  // print a space _next_ time
      while (!isspace(string[i]) && string[i]) {
        fputc(string[i  ], stdout);
      }
    } else {
      i = end   1;
    }
  } else {
    i  ;
  }
}
fputc('\n', stdout);

CodePudding user response:

Life is easier if you just read the string all at once, then process the string.

char s[1000];
fgets( s, sizeof(s), stdin );
char * p = strchr( s, '\n' );
if (p) *p = '\0';

If you wanted to read one character at a time you should read once, test twice:

int c;
while ( ((c = getchar()) != '\n') and (c != EOF) )

But trying to compute the palindrome-ness at the same time as reading seriously makes your algorithm waaaaay more complicated than it needs to be. Read a string first, then compute.

Now you can use integer indices from each end of the string. If you can get them to meet (or cross) then you’ve got a palindrome. Hint: put that in a function:

bool is_palindrome( const char * s )
{
  int left  = 0;
  int right = strlen(s) - 1;
  ...
}
  • Related