Как я могу обнаружить палиндром в C? - PullRequest
5 голосов
/ 01 марта 2010

Я работал над потенциальными вопросами для интервью, и одним из них было написать функцию на C, чтобы определить, является ли данная строка палиндромом или нет.

Я получил довольно хорошее начало:

#include <stdio.h>
#include <stdbool.h>

bool isPalindrome(char *value);

bool isPalindrome(char *value)
{
    if (value == null)
        return false;

    char *begin = value;
    char *end = begin + strlen(value) - 1;

    while(*begin == *end)
    {
        if ((begin == end) || (begin+1 == end))
            return true;

        begin++;
        end--;
    }

    return false;
}


int main()
{
    printf("Enter a string: \n");
    char text[25];
    scanf("%s", text);

    if (isPalindrome(text))
    {
        printf("That is a palindrome!\n");
    }
    else
    {
        printf("That is not a palindrome!\n");
    }
}

Однако теперь я хочу убедиться, что игнорирую пробелы и знаки препинания.

Как лучше всего, учитывая код, который я написал выше, продвигать указатели вперед или назад, если они встречают знаки препинания / пробелы?

Ответы [ 7 ]

5 голосов
/ 01 марта 2010

изменить цикл на

while(begin < end) {
  while(ispunct(*begin) || isspace(*begin))
    ++begin;
  while(ispunct(*end) || isspace(*end))
    --end;
  if(*begin != *end)
    return false;
  ++begin;
  --end;
}
return true;
3 голосов
/ 01 марта 2010

Внутри цикла while просто пропустите любые символы, которые вы хотите игнорировать:

while(*begin == *end)
{
    while ((begin != end) && (isspace(*begin) || isX(*begin))
        ++begin;

   // and something similar for end

Еще один комментарий. Поскольку ваша функция не изменяет параметр, вы должны определить его как:

bool isPalindrome(const char *value);
0 голосов
/ 14 апреля 2016
  #include<stdio.h>
  #include<string.h>
 int main()
{
char str[20];

int i,j,k,m,n;
printf("enter the string\n");
scanf("%s",str);
printf("%s",str);
k=strlen(str);
printf("\nthe lenght of string is %d",k);

for(i=0;i<k/2;i++)
{
    m=str[i];
    n=str[k-1-i];
}if(m==n)
{

 printf("\nthe given string is palindrome");        
}
else{
printf("\nthe given string is not a palindrome");
        }
return 0;

}

0 голосов
/ 28 мая 2015
/* you can use this code to check the palindrome*/    
#include<stdio.h>
    #include<string.h>
    int is_pali(char str1[]);
    int is_pali(char str1[])
    {
        char str2[100];
        int n,i;
        n = strlen(str1);
        for(i=0;i<n;i++)
        str2[n-1-i] = str1[i];
        if(str1[i]=str2[i])
        return 0;
        else 
        return 1;
    }
    int main()
    {
        char str1[100];
        int temp;
        printf("Enter the string\n");
        gets(str1);
        temp = is_pali(str1);
        if (temp==0)
        printf("the given string is not palindrome\n");
        else
        printf("the given string is palindrome\n");
    }
0 голосов
/ 02 декабря 2012

Вот мое мнение, постарался быть кратким. Также добавлена ​​проверка на отсутствие ввода

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

int p_drome(char *c) {
    int beg=0, end = strlen(c)-1;
    for (;c[beg]==c[end] && beg<strlen(c)/2;beg++,end--);
    return (beg == strlen(c)/2) ? 1 : 0;
}

int main(int argc, char* argv[]) {
  argv[1]?(p_drome(argv[1])?printf("yes\n"):printf("no\n")):printf("no input\n");
}
0 голосов
/ 01 марта 2010

См. Следующий пример, чтобы проверить, является ли строка палиндромом

 

main()
{
        char  str[100] ;
        printf ( "enter string:");
        scanf ( "%s" ,str ) ;
        if ( ispalindorm(str) )
        {
                printf ( "%s is palindrome \n" );
        }
        else
        {
                printf ( "%s is not a palindrome \n" ) ;
        }
}
int ispalindorm (  char  str[] )
{
         int  i , j ;
        for (i=0,j=strlen(str)-1;i < strlen(str)-1&& (j>0) ;i++,j-- )
        {
                if ( str[i] != str[j] )
                        return  0 ;
        }
        return 1 ;
}
0 голосов
/ 01 марта 2010

Как насчет написания другой функции для удаления символов пробела и пунктуации в строке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...