чтобы найти, является ли данная строка палиндромом или не палиндромом - PullRequest
3 голосов
/ 20 июля 2010

Я создал программу, чтобы определить, является ли введенная строка палиндромом или не палиндромом, но она всегда говорит, что это не палиндром

#include <conio.h> 
#include <graphics.h> 
#include <string.h>
void main(void)
{
    int i,len,halflen,flag=1;
    char str[50];
    clrscr();
    printf("Enter a string:\n");
    gets(str);
    len=strlen(str);
    halflen=len/2;
    for(i=0;i<halflen;i++)
    {
        if(str[i]!=str[i+halflen])
            flag=0;
        break;

    }
    if(flag)
        printf("It is a Palindrome.");
    else
        printf("It is not a Palindrome.");
    getch();
}

Ответы [ 7 ]

10 голосов
/ 20 июля 2010

Ваше центральное сравнение некорректно:

if (str[i] != str[i+halflen]) 

Это не сравнение двух символов, которые вы думаете.

Попробуйте ввести "HelloHello" в вашу программу, она скажет, что это палиндром!

Вам нужно сравнить эти два:

if (str[i] != str[len-i-1])

(и исправить скобки, как предложено в другом ответе)

6 голосов
/ 20 июля 2010

Чтобы дать вам подсказку, я сделал несколько более аккуратных отступов для вашего кода:

for(i=0;i<halflen;i++)
    {
        if(str[i]!=str[i+halflen])
            flag=0;
        break;
    }
4 голосов
/ 08 июня 2012

Вы также можете использовать STL, чтобы проверить, является ли данная строка палиндромной, используя функцию equal.Допустим, у вас есть std::string с именем x, а следующий вызов функции определяет, является ли x палиндромом

equal(x.begin(), x.begin() + x.size() / 2, x.rbegin());
3 голосов
/ 20 июля 2010

Здесь вы хотите что-то вроде ...

    if(str[i]!=str[strlen (str) - i - 1])
    {
        flag = 0;
        break;
    }

break должен идти в блоке if, иначе он всегда будет выполняться.Инициализация flag в какой-то момент тоже будет хорошей идеей.Если мне может быть разрешено наблюдение, ВСЕГДА заключайте блок if и блок else в фигурные скобки, даже если есть только один оператор;это избавит вас от некоторых проблем, которые у вас здесь есть.

Позже - отредактировано согласно комментариям мистера Родригеса ниже.

1 голос
/ 16 марта 2017
bool isPalindrome(char* str) {
    char* s = str;
    char* e = str;
    while(*e) e++;
    --e;
    while(s < e) {
        if(*s != *e) return false;
        ++s; --e;
    }
    return true;
}
1 голос
/ 20 июля 2010

Из версии 2005 о себе :

bool isAlphaNumeric(char c)
{
    return (iswalpha(c) || iswdigit(c));
}

bool isPalindrome(char *str)
{
    /* A man, a plan, Anal Panama!!! */
    if(*str == '\0')
    {
        return false;
    }

    int len = strlen(str);
    if(len <= 1) return true;

    char *start = str;
    char *end = start + len - 1;

    while(start < end)
    {
        if(!isAlphaNumeric(*start))
        {
            *start++;
            continue;
        }
        if(!isAlphaNumeric(*end))
        {
            *end--;
            continue;
        }
        if(towlower(*start) != towlower(*end))
        {
            return false;
        }
        *start++;
        *end--;
    }
    return true;
}
0 голосов
/ 01 апреля 2019

Вот лучший способ.

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
    string input;
    cout << "Enter your text: ";
    cin >> input;
    transform(input.begin(), input.end(), input.begin(), ::tolower);
    if (input[0] == input[input.length()-1])
        cout << "Palindrome";
    else
        cout << "not palinrome";
    cin.ignore();
    cin.get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...