我在这个 C 程序中做错了什么来检查字符串是否为回文?

What Am I doing wrong in this C program to check a string is Palindrome or not?

下面是我写的检查输入的字符串是否回文的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");

}

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 = '[=10=]';
    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");

}

我认为只是字符串中的索引是错误的。将其从 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;
}