Что я делаю неправильно в этой программе на C, чтобы проверить, является ли строка палиндромом или нет? - PullRequest
0 голосов
/ 11 сентября 2018

Ниже приведена программа на C, которую я написал, чтобы проверить, является ли введенная строка палиндромом или нет, но она всегда отображает оператор 'else', т.е. строка не является палиндромом: -

#include<stdio.h>
#include<string.h>
void main()
{
int i,n,count=0;
char f[30];
printf("Enter the string. :  ");
gets(f);
n = strlen(f);

for(i=0;i<n;i++)
{
    if(f[i+1]==f[n-i])
    count=count+1;
}
if(count==n)
printf("\n Entered string is Palindrome");
else
printf("\n Entered string is NOT Palindrome");

}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Я думаю, что индексация в строке неверна. Измените его с i + 1 на i и n-i-2

#include<stdio.h>
#include<string.h>
void main()
{
    int i,n,count=0;
    char f[30];
    printf("Enter the string. :  ");
    fgets(f, 29, stdin);
    n = strlen(f);

    for(i=0;i<n;i++)
    {
        if(f[i]==f[n-i-2])
        count=count+1;
    }
    if(count==n)
    printf("\n Entered string is Palindrome");
    else
    printf("\n Entered string is NOT Palindrome");

}

Также еще более эффективным должно быть:

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

void main()
{
    int i = 0,n,count=0;
    char f[30];
    printf("Enter the string. :  ");
    fgets(f, 29, stdin);
    n = strlen(f);

    while (i < n >> 1) {
        if (f[i]!=f[n-i-2]) {
            printf("\n Entered string is NOT Palindrome\n");
            return;
        }
        i++;
    }
    printf("\n Entered string is Palindrome\n");
    return;
}
0 голосов
/ 11 сентября 2018

Когда i = 0, f[n-i] будет завершающим нулевым символом, который никогда не будет появляться в середине строки. Из-за этого, если строка имеет длину 2 символа или более, условие f[i+1]==f[n-i] будет ложным. (Если строка имеет длину 1 символ, f[i+1] будет завершающим нулевым символом после первого (и единственного) символа, поэтому условие будет выполнено.)

Условие должно быть f[i]==f[n-i-1].

Кстати,

  • Вы не должны использовать gets(), который имеет неизбежный риск переполнения буфера, устарел в C99 и удален из C11.
  • Вы должны использовать стандарт int main(void) в размещенной среде вместо void main(), что недопустимо в C89 и определяется реализацией в C99 или более поздней версии, если только у вас нет особых причин использовать эту нестандартную подпись (например, вынужден использовать это от вашего босса или учителя).

Пример полного фиксированного кода:

#include<stdio.h>
#include<string.h>
int main(void)
{
    int i,n,count=0;
    char f[30 + 1]; /* allocate one more element for storeing newline character */
    char* lf;
    printf("Enter the string. :  ");
    fgets(f, sizeof(f), stdin); /* change gets() to fgets() */
    /* fgets() stores newline character while gets() doesn't, so remove it */
    if ((lf = strchr(f, '\n')) != NULL) *lf = '\0';
    n = strlen(f);

    for(i=0;i<n;i++)
    {
        if(f[i]==f[n-i-1])
        count=count+1;
    }
    if(count==n)
        printf("\n Entered string is Palindrome");
    else
        printf("\n Entered string is NOT Palindrome");

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